一个类似于破解的初级实验。用到的gdb的指令并不多,只是基础的使用和内存查看的指令。考的大多是汇编代码的熟练程度和分析能力。不过有几个函数长的让人吐血。本着不轻易爆炸的原则,只好慢慢调。
1. 反汇编bomb
objdump -d ./bomb > bomb.s
2. phase_1
第一个函数的代码很简单,看到strings_not_equal()函数的调用就能大概知道参数应该是一个字符串。此外可以看到两个push将参数入栈,是为strings_not_equal()准备的。根据函数名,可以知道这个函数是在比较两个字符串是否相等,所以push的很有可能就是一个答案字符串所在地址(如果是程序自带的变量包括字符串等都会在.rodata部分,所以压栈时会直接压入对应地址),另一个来自标准输入的字符串地址。
很明显可以看到eax内容为来自标准输入的参数的地址,而直接入栈的地址很有可能就是答案。直接kill掉并重新加载bomb,在0x8048b3a处设置断点,由图4所示代码可以看出如果eax为0则通过。运行并输入测试字符串:
图4 phase_1检测部分代码
图5 测试字符串运行结果
如图 $eax==0 , 所以第一个关卡的答案就是 ”Public speaking is very easy.” 了。
3. phase_2
观察phase_2,可以看到如下片段:
图6 phase_2部分代码
入栈eax和edx可以看出是两个地址,而read_six_numbers可以看出这个关卡的答案是6个数字。所以就用1 2 3 4 5 6 来进行测试,并read_six_number()函数运行前后对参数进行追踪和对比:
可以看到并未触发断点,则结果正确。