BoomLab
首先查看boom.c代码可知总共有6个phase
进入gdb调试:gdb bomb
phase_1
查看phase1反汇编代码: disas phase_1
<+0>:准备栈帧
<+4>:将地址存入%esi
<+9>:调用了一个<strings_not_equal>的指令,盲猜是对比刚刚输入字符和标准答案,所以查看一下0x402400里装的是啥:
这就是phase_1的标准答案了
Border relations with Canada have never been better.
phase_2
看到有一个read_six_numbers,顾名思义了,输入六个数字,disas看看:
这段程序作用就是将6个数字传入栈中。好的,六个整型数字。
回到主程序:
<+2>:40个字节的缓冲区
<+9>:读6个数字
<+14>:将第一个数字和1比较,<+18>相同跳转至<+52>,<+20>否则boom,因此第一个数是1
<+52>:int* rbx=rsp+1
<+57>:int* rbp=rsp+6
<+62>-<+27>-<+30>-<+32>:将第二个数和前一个数2比较,相同跳转至<+41>,否则boom<+36>。看到这里,又可以大胆猜测第二个答案是2的等比数列,尝试输入发现成功!
1 2 4 8 16 32 64
但是为了从反汇编代码上验证这个过程,还是继续下去
<+41>:rbx += 1,即取下一个数
<+45>:比较%rbx和%rbp【rsp+6】,<+48>不等的话跳转至<+27>,否则跳转至<+64>(64之后已经没有别的数值操作了,也就是程序出口ÿ