Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 拆除二元炸弹:第五阶段_Assembly_X86_Reverse Engineering - Fatal编程技术网

Assembly 拆除二元炸弹:第五阶段

Assembly 拆除二元炸弹:第五阶段,assembly,x86,reverse-engineering,Assembly,X86,Reverse Engineering,以下是我对代码的理解,以及我想如何解决它:首先我需要找到一个字符串,然后根据我找到的16字节查找表对该字符串进行反向工程。我知道这些“偏移”的值加起来必须是60,见第行 我已经尝试使用x/s 0x4011fe和其他检查命令(x/6c等)来查找这个6个字符的字符串,但是我没有得到任何接近正确的结果。有什么我可以改变得到正确的输出,以便我可以继续解除这个阶段 一旦我找到这个字符串,我的想法是查看这个必需的输出字符串,然后找出获得预期输出所需的输入字符串。我在想——看看每个字符的十六进制值,将它们与我

以下是我对代码的理解,以及我想如何解决它:首先我需要找到一个字符串,然后根据我找到的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
(gdb)x/16xw 0x402780
:0x00000002 0x0000000a 0x00000006 0x00000001
:0x0000000c 0x00000010 0x00000009 0x00000003
:0x00000004 0x00000007 0x0000000e 0x00000005
:0x0000000b 0x00000008 0x0000000f 0x0000000d
拆卸第五阶段:

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.
0x00000000004011bf:推送%rbx
0x00000000004011c0:mov%rdi,%rbx
0x00000000004011c3:callq 0x401414
0x00000000004011c8:cmp$0x6,%eax//6个字母字符串!
0x00000000004011cb:je 0x4011d2//如果为6,则跳过爆炸
0x00000000004011cd:callq 0x401706
0x00000000004011d2:mov%rbx,%rax
0x00000000004011d5:lea 0x6(%rbx),%rdi
0x00000000004011d9:mov$0x0,%ecx
0x00000000004011de:movzbl(%rax),%edx
0x00000000004011e1:和$0xf,%edx/“和”每个字母
0x00000000004011e4:添加0x402780(,%rdx,4),%ecx
0x00000000004011eb:添加$0x1,%rax
0x00000000004011ef:cmp%rdi,%rax//比较,然后再次循环。
0x00000000004011f2:jne 0x4011de//循环!
0x00000000004011f4:cmp$0x3c,%ecx//最终比较,然后完成!(0x3c=60)
0x00000000004011f7:je 0x4011fe//跳过爆炸,完成!
0x00000000004011f9:callq 0x401706
0x00000000004011fe:弹出%rbx
0x00000000004011ff:retq
汇编程序转储结束。

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

从本质上讲,我需要从数组中选择6个总数为0x3c的数字。然后选择6个可打印字符或数字,这些字符或数字的适当索引为低位4位。所以,最简单的选择是0xa,它的索引为1(0xa=10,所以得到6个值是很简单的)


谢谢大家的评论

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