binary bomb (二进制炸弹),这是CSAPP的一个lab。大概的意思是:给出一个二进制的可执行文件,及其对应的C语言主程序(只有主程序,其中调用的函数没有源代码)。运行这个可执行文件的时候,会有若干个“关卡”,每一个“关卡”会要求学生输入一些东西,经过处理后,如果与预计的相符,就解除了“炸弹”,进入下一关。如果输入不对,“炸弹”爆炸。学生要做的,就是利用GDB, objdump等工具,找出每一个关卡应该输入什么东西。
大三的一个实验,当时做得很头疼。
相关代码及说明下载
Phase_1
在cmd中输入 gdb bomb.exe用gdb 开始调试 bomb,输入l 可以查看源码
首先要解决的是 phase_1,输入b phase_1 在调用phase_1()函数前设置断点,然后用命令 r运行程序。
在断点前停止,查看汇编的代码( 为什么这个和VC下看到的汇编的参数顺序是相反的? )
从汇编的代码中可以看出来, test %eax, %eax这里决定会不会跳到call 0x40ifa4(explode_bomb),要是跳到这里那就是炸弹爆炸了 ,所以我们要跳过这里,执行 je 0x401868(phase_1+34), phase_1+34也就是leave 。Test是逻辑运算指令,执行 BIT与BIT 之间的逻辑运算,修改标志位。所以 test %eax, %eax结果要为0 ,才不会引爆炸弹。 eax里面存放的是strig_not_equal的返回值, 所以eax里面的值应为 0,也就是说两个字符串应该相等。 那么很自然地就想到,我们要输入的字符串就是和程序里面的某个字符串相同的字符串。
观察代码知道 phase_1函数主要就是调用string_not_equal,传进去的参数是传给 phase_1的参数和存在内存中地址为 0x4061a2的值。
用命令查看 0x4061a2这个地址存放的值。
测试
成功!!!
Phase_2
phase有两个地方要跳过