【发布时间】: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