任务就是把bomb这个可执行文件里的炸弹拆掉,他有6组数据,你需要输入6次来拆除这个炸弹。
简化流程
你可以新建一个文件叫psol.txt,然后通过下面的执行命令
./bomb psol.txt
即可把psol.txt里的数字自动输入到bomb里。理论上直接重定向输入流<也是可以的吧。
Hint
1.学会用gdb。
2.objdump -t可以打印可执行文件的符号表。
3.objdump -d反编译可执行文件,列出所有指令。
4.strings 显示可打印的字符串。
Phase_1
首先我们来反编译一下看看汇编。
我们可以观察可以到main部分有相似的函数调用。
这里看到有里那个个4个call,phase_1,phase_defused,phase_2,phase_defused。所以我们可以猜到每颗炸弹都是传参到一个函数去处理的,我们来看我们的第一颗炸弹处理函数phase_1。
前面四句基本上是函数调用都会有的指令了,就是分配栈帧,第5句我没理解有什么用。。。然后再后面三句就是调用string_not_equal函数,光看名字我都知道这个就是判字符串是否不等了。。。后面是判定返回值,zf=0则调用explode_bomb,否则就返回了。。。看到这里基本上就可以确定这题了,只要查看0x80497c0的内存是什么我们就能知道答案了。。下面来gdb调试一下。
首先我们打断点,然后单步执行到调用strings_not_equal前,然后把调用strings_not_equal的两个参数打出来,一个是xxx(就是我刚才随便输的一串),另一个是Public speaking is very easy.(这个就是答案).为什么我要把两个都打出来呢?因为我调用这个phase_1传过来的参数不是我原始的输入参数,可能main里面做了手脚,结果打印出来是没有的,那么这道题就解决了。