首页
社区
课程
招聘
[旧帖] C 代码动态执行 0.00雪花
发表于: 2012-4-4 20:47 1325

[旧帖] C 代码动态执行 0.00雪花

2012-4-4 20:47
1325
初学这类编程。用C编写了一个小程序,将自定义的函数代码放到malloc出来的空间里去执行。如果这个被复制的代码中不包含有函数调用,一切正常。但是包含函数调用时,函数调用的CALL的地方就不对了。这是什么情况?请问这个有什么办法可以解决呢 ?
代码如下:
#include <stdio.h>
#include <malloc.h>
#include <memory.h>

int _cdecl cmp(int Bool,char** startaddr);

int pwd;
char *newaddr,*OKaddr,*ERRORaddr;

int main()
{
        unsigned long usize;
        char * StartCmp;
       
        _asm{
                lea eax,OK
                mov [OKaddr],eax
                lea eax,ERROR
                mov [ERRORaddr],eax
        }
        usize = cmp(1,&StartCmp);
        while(1)
        {
                newaddr = (char*)malloc(usize);
                memcpy(newaddr,StartCmp,usize);
                printf("Input PWD:");
                scanf("%d",&pwd);
                _asm{
                        jmp newaddr
                }
OK:
                printf("OK\n");
                return 0;
ERROR:
                printf("ERROR\n");
        }
       
        return 0;
}

int _cdecl cmp(int Bool,char** startaddr)
{
        int len;
        char * S;
        if(Bool)
        {
                _asm{
                        lea eax,start
                        mov [S],eax
                        lea ebx,end
                        sub ebx,eax
                        mov [len],ebx
                }
                *startaddr = S;
                return len;
        }
start:
        if((pwd+10) == 12)
        {
                printf("haha\n");//这句在malloc出来的地方,调用不对
                _asm{
                        jmp OKaddr
                }
        }
        else
        {
                _asm{
                        jmp ERRORaddr
                }
        }
end:
        return 0;
}

[峰会]看雪.第八届安全开发者峰会10月23日上海龙之梦大酒店举办!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 517
活跃值: (35)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
2012-4-4 21:29
0
雪    币: 238
活跃值: (55)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
3
#include <stdio.h>
#include <malloc.h>
#include <memory.h>

int _cdecl cmp(int Bool,char** startaddr);

int pwd;
void *newaddr,*OKaddr,*ERRORaddr;

int main()
{
  unsigned long usize;
  char * StartCmp;
  
  _asm{
    lea eax,OK
    mov OKaddr,eax
    lea eax,ERROR
    mov ERRORaddr,eax
  }
  usize = cmp(1,&StartCmp);
  while(1)
  {
    newaddr = (char*)malloc(usize);
    memcpy(newaddr,StartCmp,usize);
    printf("Input PWD:");
    scanf("%d",&pwd);
    _asm{
      jmp newaddr
    }
OK:
    printf("OK\n");
    return 0;
ERROR:
    printf("ERROR\n");
  }
  
  return 0;
}

int _cdecl cmp(int Bool,void** startaddr)
{
  int len;
  void * S;
  if(Bool)
  {
    _asm{
      lea eax,start
      mov S,eax
      lea ebx,end
      sub ebx,eax
      mov len,ebx
    }
    *startaddr = S;
    return len;
  }
start:
  if((pwd+10) == 12)
  {
    printf("haha\n");
    _asm{
      jmp OKaddr
    }
  }
  else
  {
    _asm{
      jmp ERRORaddr
    }
  }
end:
  return 0;
}
2012-4-4 21:46
0
雪    币: 47
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
不错,学习了。
2012-4-4 21:58
0
雪    币: 238
活跃值: (55)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
5
原因是原代码中是短Call,复制到堆中导致相对偏移改变,短Call到未知地址,应使用长Call。
Release方式编译,否则在print后会进行栈的检查,会出错
#include <stdio.h>
#include <malloc.h>
#include <memory.h>

int _cdecl cmp(int Bool,void** startaddr);

int pwd;
void *newaddr,*OKaddr,*ERRORaddr;
int (_cdecl *print)(const char *, ...);

int main()
{
  unsigned long usize;
  void * StartCmp;
  
  _asm{
    lea eax,OK
    mov OKaddr,eax
    lea eax,ERROR
    mov ERRORaddr,eax
  }
  usize = cmp(1,&StartCmp);
  while(1)
  {
    newaddr = malloc(usize);
    memcpy(newaddr,StartCmp,usize);
    printf("Input PWD:");
    scanf("%d",&pwd);
    _asm{
      jmp newaddr
    }
OK:
    printf("OK\n");
    free(newaddr);
    return 0;
ERROR:
    printf("ERROR\n");
    free(newaddr);
  }
  
  return 0;
}

int _cdecl cmp(int Bool,void** startaddr)
{
  int len;
  void * S;
  if(Bool)
  {
    _asm{
      lea eax,start
      mov S,eax
      lea ebx,end
      sub ebx,eax
      mov len,ebx
    }
    *startaddr = S;
    return len;
  }
start:
  if((pwd+10) == 12)
  {
    print = printf;//
	print("haha\n");
    _asm{
      jmp OKaddr
    }
  }
  else
  {
    _asm{
      jmp ERRORaddr
    }
  }
end:
  return 0;
}

lz即使你把代码放到栈里,OD照样跟踪
#include <stdio.h>
#include <malloc.h>
#include <memory.h>

int _cdecl cmp(int Bool,void** startaddr);

int pwd;
void *newaddr,*OKaddr,*ERRORaddr;
int (_cdecl *print)(const char *, ...);

int main()
{
  unsigned long usize;
  void * StartCmp;
  
  _asm{
    lea eax,OK
    mov OKaddr,eax
    lea eax,ERROR
    mov ERRORaddr,eax
  }
  usize = cmp(1,&StartCmp);
  while(1)
  {
    _asm{
      sub esp,usize
      mov newaddr,esp
    }
    memcpy(newaddr,StartCmp,usize);
    printf("Input PWD:");
    scanf("%d",&pwd);
    _asm{
      jmp newaddr
    }
OK:
    printf("OK\n");
    _asm{
	  add esp,usize
    }
    return 0;
ERROR:
    printf("ERROR\n");
    _asm{
	  add esp,usize
    }
  }

  return 0;
}

int _cdecl cmp(int Bool,void** startaddr)
{
  int len;
  void * S;
  if(Bool)
  {
    _asm{
      lea eax,start
      mov S,eax
      lea ebx,end
      sub ebx,eax
      mov len,ebx
    }
    *startaddr = S;
    return len;
  }
start:
  if((pwd+10) == 12)
  {
    print = printf;//
	print("haha\n");
    _asm{
      jmp OKaddr
    }
  }
  else
  {
    _asm{
      jmp ERRORaddr
    }
  }
end:
  return 0;
}
2012-4-4 22:04
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
多谢了,我还是初学不久,想实践下。呵呵,我不是为了代码保护,只是乱写的一个想法
2012-4-4 22:42
0
雪    币: 238
活跃值: (55)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
7
这样子,你这一个乱写可害苦我了,光理解代码就费了好长时间。另外你的汇编代码写的不太合理,不应该加[]但加上也好使,所以说只能说是不合理,参考一下我的建议吧。
2012-4-4 23:03
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
非常感谢sierra耐心的帮助,看了你的代码,学习了
2012-4-5 10:57
0
游客
登录 | 注册 方可回帖
返回
//