关闭

CCProxy v6.2

256人阅读 评论(0) 收藏 举报

放了很多天了,一直想写一下。

以Telnet的方式登录CCProxy,输入ping 2000个c,CCProxy报错退出。

核心部分:

430300: sub esp,430h          //函数预留出的缓冲区空间

...

430379:  push esi                    //输入的错误参数“c...”的地址

43037A: lea edx,[esp+40h]

43037E: push 478EE8           //提示语“Host not found:%s”的地址

430383: push edx                    //存放完整提示的缓冲区     (11062EC)

430384:   call _sprintf()           //溢出点所在,这个函数是作者自己写的

...

4303D6: add esp,430h

4303DC: retn 0Ch

当时堆栈中的情况如下:

11066F0中存放的是上面这个函数的返回地址,而存放完整提示的缓冲区的首地址是11062EC,

中间有0x404的空间,字符串“Host not found: ”占用了0x10字节,所以留给参数的位置只有0x3F4.

我们刚才输入的参数个数为2000,远超0x3F4,实际上,回车换行还有/0各占一个字节,

也就是输入参数的长度临界点时0x3F1,超过这个数字就会出问题。

问题就出在作者自己写的_sprintf()里,没有检查传入参数的长度,分配出的430h缓冲区中存放_sprintf()显示内容,结果导致会覆盖这一层函数的返回地址。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2761次
    • 积分:76
    • 等级:
    • 排名:千里之外
    • 原创:6篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条