main()

Untitled

phase_1

Untitled

strings_not_equal

Untitled

补充

Untitled

回到了phase_1函数(string_not_equal函数里的注释”回到main函数”有误, 是回到了phase_1函数)

Untitled

跟进explode_bomb函数

Untitled

查看可得, 以上函数中有很多地址是找不到的, 运行时, 这些地址才会加载出来:

  • 0x402400: 这个地址是用于跟input作比较的参考字符串地址
  • 0x4025a3: 这个地址是explode_bomb函数中要打印的第一个字符串
  • 0x4025ac: 这个地址是explode_bomb函数中要打印的第二个字符串

利用gdb调试器来找到这些地址中的值:

  • 0x402400: "Border relations with Canada have never been better.”

Untitled

  • 0x4025a3: “\nBOOM!!!”

Untitled

  • 0x4025ac: "The bomb has blown up.”

Untitled

当输入错误的input时, 执行explode_bomb​, 可得正确输入为"Border relations with Canada have never been better.”

strings_not_equat​函数后续仍有未分析代码, 需要验证

Untitled

经过验证, 可得查看的内存字符串即是正确字符串, 可得strings_not_equat函数后面的指令都是为了验证每个字符都是相同的, 故省略.

phase_2

考点:

  1. 函数调用的参数传递
  2. 控制转移的逻辑

main()

Untitled

phase_2()

Untitled

read_six_numbers()

Untitled

内容较大容易混淆, 尝试画出栈视图

Untitled

回到phase_2函数

释放栈空间, rsp获取rsi, 相当于第一个变量的地址

Untitled

最终输入

知道了逻辑那么输入就是”1 2 4 8 16 32”, 注意参考scanf的参数字符串来输入空格

Untitled

phase_3

main()

Untitled

phase_3()

Untitled

主要的思路都在注释里, 重要的都标红了, 查看存放地址的数组即可

Untitled

验证上述观点, 后续思路是一个下标对应一个数字

Untitled

phase_4

main()

Untitled

与之前一样, rdi = 输入地址

phase_4()

Untitled

func4()

整体逻辑

Untitled

递归逻辑

Untitled

返回值逻辑

Untitled

phase_5

main()

Untitled

phase_5()

Untitled

查看内存发现了替换表和参考字符串

  • 替换表: maduiersnfotvbyl
  • 参考字符串: flyers

大致逻辑:

  1. 参考字符串在替换表中的下标 + 16的倍数
  2. 主要是加上16的倍数后是可见字符即可

phase_6

main()

Untitled

phase_6()

验证输入数据个数, 大小要求, 然后进行变换7 - x

Untitled

第二部分

替换成地址数组

Untitled

查看相应的地址

Untitled

第三部分

链表排序

Untitled

第四部分

验证

Untitled

解题

从大到小排列数据:

3 4 5 6 1 2

7-a的逆操作:

4 3 2 1 6 5

验证:

Untitled

正确答案

  1. Border relations with Canada have never been better.
  2. 1 2 4 8 16 32
  3. 1311(还有另外7种答案, 同理, 找到对应关系即可)
  4. 7 0(第一个输入还可以是1 3 5)
  5. 9?>567(还有很多种,自行搭配)
  6. 4 3 2 1 6 5