|
发表于 2003-11-5 17:37:00
|
显示全部楼层
Re:帮助debug的一些工具类,希望大家共同探讨和完善。
晕,我的那篇帖子:一个Hello world里面不是写了嘛。。。
重新帖一遍。。
char mycode[] =
"\xeb\x19\x5e\x31\xc0\x89\xc3\x89"
"\x46\x0c\xb0\x04\x89\xf1\x31\xd2"
"\xb2\x0c\xcd\x80\x31\xdb\x89\xd8"
"\x40\xcd\x80\xe8\xe2\xff\xff\xff"
"\x48\x65\x6c\x6c\x6f\x20\x77\x6f"
"\x72\x6c\x64\x21";
void foo()
{
char *buf;
int *ret;
ret = (int*)(&buf + 12);
(*ret) = (int)mycode;
}
main()
{
foo();
return 0;
}
这段代码是在linux下运行的,linux下的调用函数的堆栈是先把返回的地址压栈,然后再是返回的ebp的值。接下来就是函数内部的第一个本地变量,所以也就是说,函数第一个变量的地址 + 4 + 8个字节后就是函数的返回地址,我们把函数的返回地址改向我们要执行的代码就可以了。
上面的那段mycode是一段调用write()系统调用打印出Hello world!的代码。我对WIN32下系统调用如何调用没怎么研究过,所以无法给出WIN32下的代码,不过你可以看这个例子(也是我之前帖过的):
#include <stdio.h>
int function(int a, int b, int c) {
char buffer[14];
int sum;
int *ret;
// 如果是在gcc 3.2.2版本下,这里则应该是:ret = buffer + 28;
ret = (int*)(buffer + 20);
(*ret) += 0xa;
sum = a + b + c;
return sum;
}
main()
{
int x;
x = 0;
function(1,2,3);
x = 1;
printf("%d\n",x);
return 0;
}
结果就是打印出来的是0而不是1,原因就是因为在function()函数里面修改了返回的指针,将返回的指针跳过x = 1;这一句直接指到下一句printf的地址了。
这些方法都是很明显使用了buf溢出的漏洞来操作的。我现在检查别人写的代码,首先就搜索是否有sprintf,wprintf,strcpy这些东西,尽量少的避免他们用这些,即使在非常情况下必须使用的话,就必定要先检查长度,象sprintf,wprintf我都建议使用string类型来操作,strcpy则改成用strncpy好一些。
|
|