- 论坛徽章:
- 0
|
【好玩】缓冲区溢出攻击实验
思路已经想到了,还没有时间实践,分析如下:
当函数test在调用getbuf的时候,栈的分布情况大致如下:
- | | <- test的栈帧 (地址在高位)
- |为局部变量分配空间(val) |
- | 其他的一些空间 |
- | 返回地址 |
- | | <-getbuf的栈帧 (地址在低位)
- |为局部变量分配空间(buf变量) |
- | 其他的一些空间 |
- | 返回地址 |
- | |
复制代码
而getbuf中的局部变量buf数组就是紧靠着getbuf栈帧的数据空间,当这个空间溢出的时候,数据就会跑到test函数的栈帧中。
看下面的test函数的汇编代码:
- 00000115 <_test>;:
- 115: 55 push %ebp
- 116: 89 e5 mov %esp,%ebp
- 118: 83 ec 18 sub $0x18,%esp
- 11b: c7 04 24 ee 00 00 00 movl $0xee,(%esp)
- 122: e8 00 00 00 00 call 127 <_test+0x12>;
- 127: e8 aa ff ff ff call d6 <_getbuf>;
- 12c: 89 45 fc mov %eax,0xfffffffc(%ebp)
- 12f: 8b 45 fc mov 0xfffffffc(%ebp),%eax
- 132: 89 44 24 04 mov %eax,0x4(%esp)
- 136: c7 04 24 ff 00 00 00 movl $0xff,(%esp)
- 13d: e8 00 00 00 00 call 142 <_test+0x2d>;
- 142: c9 leave
- 143: c3 ret
复制代码
注意到12c那一行,是把调用getbuf函数的返回值传到局部变量0xfffffffc(%ebp)中,就是val,接下来的一行就是把这个局部变量传到eax寄存器再由寄存器传到test栈帧的后面然后再调用printf函数。
我的修改思路如下,反汇编出从getbuf函数的栈帧中buf数组那部分直到test中val变量之间的代码,其他的部分不改变,改变的只有以下两个部分:
1)修改test函数的返回地址,使这个地址指向12f那一行,就是说把
mov %eax,0xfffffffc(%ebp)这一行跳过,直接把变量val的值传到printf中
2)找到val在栈帧所在的位置,把这个位置的代码改为我们所要的,也就是0xdeadbeef.
思路大致如上面所说,明天有时间实践看看。
不知道说清楚没有,大家给点意见。 |
|