前言
最近上系统级编程的课,其中一个实验是破解二进制炸弹,下面记录一下解题思路。
准备工作
由于老师提供了binarybomb移植版文件,包含:
- gdb.exe
- objdump.exe
一个调试工具一个反汇编工具,但这是Windows的移植版。在Linux下使用对应的gdb和objdump即可
反汇编
在bomb.exe文件下路径下,命令行输入objdump -d bomb.exe,得到了程序的汇编代码。然后大致浏览了一下,发现其中有六个函数phase_1……phase_6,基本上也就可以确定就是这六个关卡了。
phase_1
知识点:string,函数调用,栈
找到phase_1对应的汇编代码,可以看到就那么10几行
不难发现,其中一个call指令,调用了string_not_equal函数。可以猜测到应该就是比较我们输入的字符串密码和内置的密码是否相等
接下来使用gdb调试程序,这个函数前三行都是给函数分配栈空间,对实验没什么影响,我们在第四行设置一个断点,运行:
b *0x40184c #设置断点
r #运行
然后乱输入一个123456789进入,那么我们输入的字符串被放在哪里了呢?肯定是作为一个参数要传进字符串比较这个函数的,才可以进行比较。在调用这个函数之前&#