游戏开发论坛

 找回密码
 立即注册
搜索
12
返回列表 发新帖
楼主: zonghongbin

帮助debug的一些工具类,希望大家共同探讨和完善。

[复制链接]

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2003-11-5 09:51:00 | 显示全部楼层

Re:帮助debug的一些工具类,希望大家共同探讨和完善。

用sprintf,wprintf,strcpy的时候最好都先检查一下长度。
个人建议对于要输出的消息用string会比较好一些,操作方便,而且底层做了很多的安全方面的考虑。

2

主题

28

帖子

28

积分

注册会员

Rank: 2

积分
28
QQ
发表于 2003-11-5 15:20:00 | 显示全部楼层

Re:帮助debug的一些工具类,希望大家共同探讨和完善。

tarkey兄,可以写一小段示范代码看看吗?对这种缓冲区溢出攻击一直以来是听得多,但是从来没见人做过……(做了也不会让我知道吧……)。

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 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好一些。

5

主题

26

帖子

26

积分

注册会员

Rank: 2

积分
26
 楼主| 发表于 2003-11-5 19:55:00 | 显示全部楼层

Re: Re: Re: Re:帮助debug的一些工具类,希望大家共同探讨和

tarkey: Re: Re: Re:帮助debug的一些工具类,希望大家共同探讨和完善。



大侠,你自己去试试:
class aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...; // 此处超过4096.
然后写你的buf,...


我试过了,的确如此!多谢tarkey兄指正!看来想当然的确是程序员的大忌!

5

主题

26

帖子

26

积分

注册会员

Rank: 2

积分
26
 楼主| 发表于 2003-11-5 21:24:00 | 显示全部楼层

Re:帮助debug的一些工具类,希望大家共同探讨和完善。

Re Mal:
1.有关CObject的问题
因为我不会用MFC,所以没有考虑CObject重名的问题。抱歉!是不是using namespace可以解决?

2.有关LOG宏的内存分配问题
我本来打算把日志功能放在CObject类中,但后来觉得把基类搞的太复杂不好,便移到CUtil类中,再通过LOG宏调用。因为buf是开在宏的{}中,所以不会造成大片的内存消耗。关于C++的内存分配我也有点晕,应该是栈式和堆式两种吧。我这里的buf是栈式的,也就是由操作系统来管理分配与回收,所以我想不应该造成空指针问题,不过可能造成“脏指针”,正如tarkey兄指正的,应该在指定大小的范围内才是安全的。

3.有关fptuc的问题
while( fputc(*(p++),f) != 0 ) {;}这样写我的确是偷懒了,写成while( (*p != '\0') ) {fputc( *(p++), f );}就可以消除多余的'\0'。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-24 02:07

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表