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.”
当输入错误的input时, 执行explode_bomb
, 可得正确输入为"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_4
main()
与之前一样, rdi = 输入地址
phase_4()
func4()
整体逻辑
递归逻辑
返回值逻辑
phase_5
main()
phase_5()
查看内存发现了替换表和参考字符串
- 替换表: maduiersnfotvbyl
- 参考字符串: flyers
大致逻辑:
- 参考字符串在替换表中的下标 + 16的倍数
- 主要是加上16的倍数后是可见字符即可
phase_6
main()
phase_6()
第
验证输入数据个数, 大小要求, 然后进行变换7 - x
第二部分
替换成地址数组
查看相应的地址
第三部分
链表排序
第四部分
验证
解题
从大到小排列数据:
3 4 5 6 1 2
7-a的逆操作:
4 3 2 1 6 5
验证:
正确答案
- Border relations with Canada have never been better.
- 1 2 4 8 16 32
- 1311(还有另外7种答案, 同理, 找到对应关系即可)
- 7 0(第一个输入还可以是1 3 5)
- 9?>567(还有很多种,自行搭配)
- 4 3 2 1 6 5