BombLab
首先分析一下main函数
第一关—phase_1
我们跟进一下strings_not_equal函数
补充****
回到了phase_1函数(string_not_equal函数里的注释”回到main函数”有误, 是回到了phase_1函数)
跟进explode_bomb函数
但是我们动手查看就可以知道, 以上我们看过的函数中有很多地址是找不到的, 这时因为在程序运行时, 这些地址才会加载出来:
- 0x402400: 这个地址是用于跟input作比较的参考字符串地址
- 0x4025a3: 这个地址是explode_bomb函数中要打印的第一个字符串
- 0x4025ac: 这个地址是explode_bomb函数中要打印的第二个字符串
所以我们利用gdb调试器来找到这些地址中的值:
- 0x402400: “Border relations with Canada have never been better.”
- 0x4025a3: “\nBOOM!!!”
- 0x4025ac: “The bomb has blown up.”
由此可以敲定函数explode_bomb函数就是但我们输入错误的input时执行的, 同时我们也由此知道了第一个正确的输入就是”Border relations with Canada have never been better.”, 但是strings_not_equat函数后面还有一大截没有分析, 所以我们需要验证一下
经过验证, 已经知道了我们查看的内存字符串即是正确字符串, 那也就是说strings_not_equat函数后面的指令都是为了验证每个字符都是相同的, 就不用深究了
第二关—phase_2(主要考察对函数调用时参数传递的形式, 然后就是控制转移的逻辑)
首先是main函数
跟进至phase_2函数本身
跟进read_six_numbers函数
只是看做的注释跟标记是很容易搞混的, 所以直接画出栈空间会更好理解一些
回到phase_2函数
这时由于释放了栈空间, 所以rsp的值等于rsi的值, 相当于第一个变量的地址
最终输入
知道了逻辑那么输入就是”1 2 4 8 16 32”, 注意间隔要按照scanf的参数字符串来输入空格
最后我们过了第二关
phase_3
main函数
跟进phase_3函数
主要的思路都在注释里, 重要的都标红了, 这里我们看一下存放地址的数组即可
验证了上面的观点然后大致的思路就是一个下标对应一个数字, 再phase_3函数里面我已经标注过了, 只不过要输入十进制的数才行
最后不得不提的就是成功的标语
我还以为这道题要输入两次, 才算过关, 这个成功了一半的意思是总共六关我过了三关, 成功了一半, 而不是这一个关卡成功了一半………最后还是找了main里面的puts的参数才知道的
phase_4
首先是main函数
跟之前一样, rdi = 输入地址
跟进phase_4函数
跟进func4函数
首先我们先理清函数的大致逻辑
然后关于递归的逻辑
最后是返回值的逻辑
我这里说得不清不楚的………主要还是不知道怎么用文字表示, 回过头来看的时候, 还是要仔细看一下代码才行
phase_5
首先main函数
我们跟进phase_5函数
思路还是比较好理清的, 感觉要比前面的题目简单
我们经过查看内存发现了替换表和参考字符串
- 替换表: maduiersnfotvbyl
- 参考字符串: flyers
所以核心就是
1 | 参考字符串在替换表中的下标 + 16的倍数 |
phase_6
首先main函数
跟进phase_6函数(由于很长, 所以我们分开分析)
第一部分, 验证输入数据个数, 大小要求, 然后进行变换7 - x
第二部分, 替换成地址数组
我们查看相应的地址
第三部分, 链表排序
第四部分, 验证
解题
我们先从大到小给数据排列好
3 4 5 6 1 2
由于前面的7-a的操作所以我们再减回去
4 3 2 1 6 5
验证一下