2007年4月7日星期六

逃课

我是一个考研人,一千遍地提醒自己。。。
这是我在HIT的第三年,大三下学期。这是一个不平常的学期,因为我要考
研。虽然仅仅是要,而不是"是";但是谁能否认这是一个完美的理由,一个逃课的
完美的理由。
这一学期,我逃了一节有一节的课,甚至于我上过的课还没有逃的课多。
我一点儿也不是在炫耀,我甚至有些悲哀:我都这样了,为什么我还要考研呢?
今天是星期六,我有逃了半天的课,回来折腾mail,好在终于完成了,些
许安慰。

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的地址
*