【问题标题】:Defusing a Binary Bomb: phase_5 [duplicate]拆除二元炸弹:phase_5 [重复]
【发布时间】:2017-04-18 02:20:26
【问题描述】:

这是我对代码在做什么以及我想如何解决它的理解:首先我需要找到一个字符串,然后根据我拥有的 16 字节查找表对该字符串进行逆向工程成立。我知道这些“偏移量”的值加起来必须是 60,见 行。

我试图通过使用 x/s 0x4011fe 和其他检查命令(x/6c 等)找到这 6 个字符串,但我没有得到任何接近正确的结果。有没有什么我可以改变以获得正确的输出,以便我可以继续化解这个阶段?

一旦我找到这个字符串,我的想法是查看这个所需的输出字符串,然后找出获得预期输出所需的输入字符串。我在想 - 查看每个字符的十六进制值,将它们与我的表(最低顺序)进行比较,然后使用 ascii 表找到相应的字符。我只是想知道这是否是正确的方法,谢谢。

查找表:

(gdb) x/16xw 0x402780
<array.3600>: 0x00000002    0x0000000a    0x00000006    0x00000001
<array.3600>: 0x0000000c    0x00000010    0x00000009    0x00000003
<array.3600>: 0x00000004    0x00000007    0x0000000e    0x00000005
<array.3600>: 0x0000000b    0x00000008    0x0000000f    0x0000000d

phase_5的拆解:

0x00000000004011bf <+0>:    push   %rbx
0x00000000004011c0 <+1>:    mov    %rdi,%rbx
0x00000000004011c3 <+4>:    callq  0x401414 <string_length>
0x00000000004011c8 <+9>:    cmp    $0x6,%eax //6 letter string!
0x00000000004011cb <+12>:   je     0x4011d2 <phase_5+19> //if 6, jump over the explode
0x00000000004011cd <+14>:   callq  0x401706 <explode_bomb>
0x00000000004011d2 <+19>:   mov    %rbx,%rax 
0x00000000004011d5 <+22>:   lea    0x6(%rbx),%rdi
0x00000000004011d9 <+26>:   mov    $0x0,%ecx
0x00000000004011de <+31>:   movzbl (%rax),%edx
0x00000000004011e1 <+34>:   and    $0xf,%edx //”and” each letter
0x00000000004011e4 <+37>:   add    0x402780(,%rdx,4),%ecx
0x00000000004011eb <+44>:   add   $0x1,%rax
0x00000000004011ef <+48>:   cmp    %rdi,%rax //compare, and then loop again. 
0x00000000004011f2 <+51>:   jne    0x4011de <phase_5+31> //loop!
0x00000000004011f4 <+53>:   cmp    $0x3c,%ecx //final compare, and then done! (0x3c = 60)
0x00000000004011f7 <+56>:   je     0x4011fe <phase_5+63> //jump over explode, and finish! 
0x00000000004011f9 <+58>:   callq  0x401706 <explode_bomb>
0x00000000004011fe <+63>:   pop    %rbx
0x00000000004011ff <+64>:   retq   
End of assembler dump.

【问题讨论】:

  • 我从不喜欢人们在不提供至少一些反馈的情况下投反对票。我没有投反对票,但是由于其他人没有向您提供解释:您发布了一个家庭作业问题,并且基本上说“我不知道该怎么做,答案是什么?”如果您发布您的目标并要求朝着正确的方向轻推,您将会有更好的运气......尽管我不认为 stackoverflow.com 是这样做的地方。
  • 另外:当我看到人们发布作业问题并得到积极回应时,通常作者会概述他们尝试过的事情,这样人们就不会觉得他们在做作者的作业.
  • 很抱歉@BrianVandenberg,非常感谢您的评论!我已经编辑了我的问题,希望现在更好。我主要停留在如何找到要检查的字符串,因为我已经有几天了。我试图解释我的思考过程,希望能确认我的想法是正确的,我会尽量让这一点更清楚。再次感谢!
  • @Mary - 查找表不是 16 个字节长,它实际上是 64 个字节长 - 16 个元素大小为 4 个字节。我通常处理这样的事情的方式是尝试像你一样思考我的方式。如果我发现这有点费力,我只需将转储和数据放入一个新的源文件中,然后转换为 Intel 格式,因为 AT&T 语法对我来说太不愉快了,组装它们,然后逐步执行使用调试器。

标签: assembly x86 reverse-engineering


【解决方案1】:

经过深思熟虑,我成功找到了答案。事实证明,没有要比较的字符串,只有 0x3c 的值。在阅读汇编代码时,过度思考对我来说似乎是一种常见的死亡。

基本上,我需要从数组中选择 6 个数字,总和为 0x3c。然后选择 6 个可打印字符或数字,它们具有适当的索引作为低 4 位。因此,最简单的选择是 0xa,它的索引为 1,(0xa = 10,因此获得 6 个值是微不足道的)。

感谢大家的cmets。

【讨论】:

    猜你喜欢
    • 2017-10-17
    • 2020-07-19
    • 2013-11-07
    • 2016-08-13
    • 2016-09-05
    • 1970-01-01
    • 2020-06-04
    • 2018-04-02
    相关资源
    最近更新 更多