拆弹实验的要求是从已知的可执行文件和已知的C语言main函数中推出各阶段拆解所需字符串,同时在第四阶段中存在解锁隐藏阶段的函数,通过增加一段字符串输入可以解锁隐藏阶段。

phase_0 热身阶段

phase_0的主题是字符串,也就是说我们只要输入和预设的字符串相同的字符串,就可以拆解该阶段。本阶段汇编很短,直接把代码放上来:

push   %ebp
mov    %esp,%ebp ;该函数被调用
sub    $0x8,%esp
sub    $0x8,%esp
push   $0x804a1e4 ;将参数压入栈 准备调用函数
pushl  0x8(%ebp)
call   8049c22 <strings_not_equal>
add    $0x10,%esp
test   %eax,%eax ;如果返回值为0,则跳过引爆炸弹函数,否则引爆炸弹
je     8049478 <phase_0+0x29>
call   8049ea8 <explode_bomb>
mov    $0x0,%eax
jmp    804947d <phase_0+0x2e>
mov    $0x1,%eax
leave
ret

可以看到0x804a1e4指向的就是该函数中预设的字符串的首地址,基于理性的分析和大胆的猜测,strings not equal函数会将输入的两个字符串进行比较,当字符串相等时返回0。并且ebp+0x8的位置正是传入phase_0的,在程序中输入的字符串。所以我们的目标就是找到0x804a1e4中存储的字符串并输入。用gdb进行调试。首先$gdb bomb用gdb打开可执行文件,然后(gdb)b phase_0设置断点,(gdb)r运行程序,随便输入一段字符串后程序执行到断点,(gdb)x/1s 0x804a1e4输出该字符串0x804a1e4: "Unix system programming is an old art."即是我们拆除该阶段需要输入的字符串

最后修改日期:2021年2月6日

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。