这是我对代码正在做什么的理解,以及我想如何解决它:首先我需要找到一个字符串,然后根据我有的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.
答案 0 :(得分:1)
经过深思熟虑后,我成功找到了答案。事实证明,没有可比较的字符串,只有0x3c的值。在阅读汇编代码时,过度思考对我来说似乎是一种常见的消亡。
基本上,我需要从数组中选择6个数字,总计达到0x3c。然后选择具有适当索引作为低4位的6个可打印字符或数字。因此,最简单的选择是0xa,其索引为1,(0xa = 10,因此得到6个值是微不足道的)。
感谢大家的评论。