步骤2 返回到fizz()并准备相应参数
2.1 解题思路
找到fizz()代码如下:
08048e60
8048e60: 55 push %ebp
8048e61: 89e5 mov %esp,%ebp
8048e63: 83ec 08 sub $0x8,%esp
8048e66: 8b45 08 mov 0x8(%ebp),%eax
8048e69: 3b05 d4 a1 04 08 cmp 0x804a1d4,%eax
//0x804a1d4存放就是用户的cookie值,即运行命令“./bufbomb-t luoxiaolin”时传入的。
8048e6f: 741f je 8048e90
8048e71: 8944 24 04 mov %eax,0x4(%esp)
8048e75: c704 24 8c 98 04 08 movl $0x804988c,(%esp)
8048e7c: e827 f9 ff ff call 80487a8
8048e81: c704 24 00 00 00 00 movl $0x0,(%esp)
8048e88: e85b f9 ff ff call 80487e8
8048e8d: 8d76 00 lea 0x0(%esi),%esi
8048e90: 8944 24 04 mov %eax,0x4(%esp)
8048e94: c704 24 d9 95 04 08 movl $0x80495d9,(%esp)
8048e9b: e808 f9 ff ff call 80487a8
8048ea0: c704 24 01 00 00 00 movl $0x1,(%esp)
8048ea7: e844 fc ff ff call 8048af0
8048eac: ebd3 jmp 8048e81
8048eae: 89f6 mov %esi,%esi
分析:
由8048e66: 8b 45 08 mov 0x8(%ebp),%eax 得知,
Fizz的参数位置在%ebp+0x8,在%ebp之前的栈中存的是%ebp的旧值。
2.2 解题过程
光看代码还是不能理解的很清楚,所以现在我们把栈帧的结构画出来:
图13
(图中地址是根据gdb调试得出的)
这里假设调用getbuf时,输入正确的字符串后,函数返回到fizz()函数,那么,test的栈帧结构将变成下图。
图14
由图可以看出,deadbeff下面到ebp旧值上面的区域,还有%ebp旧值以下的部分都是fizz函数的栈帧结构。那么这道题的答案也就知道了,这次需要输入40个字节的字符串。倒数第8至倒数第16个字节代表fizz的地址,倒数8个字节是传入的参数,fizz()函数的地址为“08048e60”,参数根据题目要求需要传入一个黑客cookie值,我的cookie值为“0x33102f15”。
2.3 最终结果截图
图15