2007年4月3日星期二

Bufbomb可爱的缓冲区溢出

我现在在HITCS读大三,两年多了,写了很多小程序,真正的小程序。在两年
多的时间里,我经常遇到每一个前辈都犯过的错误--缓冲区溢出。每一次溢出都
是不同的,调试也是苦难的,数不清的BUG潜伏在我的程序里,我无能为力。。。
可是今天,缓冲区溢出成了我的任务@_@。CS:APP
<http://csapp.cs.cmu.edu/>的第三章的课后题3.38,给了我一个机会,第一次去
尝试有意的缓冲区溢出,全新的挑战啊!

getbuf的代码摘要如下:

int getbuf()

{

char buf[12];

getxs(buf);

return 1;

}

:-) objdump -d a.out

080484ae <getbuf>:
80484ae: 55 push %ebp
80484af: 89 e5 mov %esp,%ebp
80484b1: 83 ec 18 sub $0x18,%esp
80484b4: 8d 45 f4 lea 0xfffffff4(%ebp),%eax
80484b7: 89 04 24 mov %eax,(%esp)
80484ba: e8 25 ff ff ff call 80483e4 <getxs>
80484bf: b8 01 00 00 00 mov $0x1,%eax
80484c4: c9 leave
80484c5: c3 ret
分析getbuf的栈帧结构:

返回地址.1
%ebp.1


%eax ;buf首地址

返回地址.2
%ebp.2

可以看到,我们的输入必须在%eax往上(地址增加)的栈上,我们的功能代码应该是

*mov $0xdeadbeef, %eax*

*push $ip(返回地址1)*

* ret
最后为了保护%ebp.1和跳转到%eax执行代码
我们的输入应该是这样的形式
功能代码的机器码 00(填充12字节的剩余部分) %ebp %eax的地址
*

没有评论: