消除二进制炸弹:phase_5

时间:2016-12-03 05:36:46

标签: assembly x86 reverse-engineering

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

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

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

查找表:

(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.

1 个答案:

答案 0 :(得分:1)

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

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

感谢大家的评论。