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_Gdb - Fatal编程技术网

Assembly 需要帮助了解二元炸弹第五阶段吗

Assembly 需要帮助了解二元炸弹第五阶段吗,assembly,x86,gdb,Assembly,X86,Gdb,所以我一直在研究这个二元炸弹实验室,而第五阶段是我唯一不了解的部分。我已经解决了,但有几行我希望有人能帮我 0x08048db1 <+0>: push %ebp 0x08048db2 <+1>: mov %esp,%ebp 0x08048db4 <+3>: push %ebx => 0x08048db5 <+4>: sub $0x14,%esp 0x08048db8 <+7>: mov

所以我一直在研究这个二元炸弹实验室,而第五阶段是我唯一不了解的部分。我已经解决了,但有几行我希望有人能帮我

   0x08048db1 <+0>: push   %ebp
   0x08048db2 <+1>: mov    %esp,%ebp
   0x08048db4 <+3>: push   %ebx
=> 0x08048db5 <+4>: sub    $0x14,%esp
   0x08048db8 <+7>: mov    0x8(%ebp),%ebx
   0x08048dbb <+10>:    mov    %ebx,(%esp)
   0x08048dbe <+13>:    call   0x8049009 <string_length>
   0x08048dc3 <+18>:    cmp    $0x6,%eax
   0x08048dc6 <+21>:    je     0x8048dcd <phase_5+28>
   0x08048dc8 <+23>:    call   0x8049231 <explode_bomb>
   0x08048dcd <+28>:    mov    $0x0,%edx
   0x08048dd2 <+33>:    mov    $0x0,%eax
   0x08048dd7 <+38>:    mov    (%ebx,%eax,1),%cl
   0x08048dda <+41>:    and    $0xf,%ecx
   0x08048ddd <+44>:    add    0x804a460(,%ecx,4),%edx
   0x08048de4 <+51>:    inc    %eax
   0x08048de5 <+52>:    cmp    $0x6,%eax
   0x08048de8 <+55>:    jne    0x8048dd7 <phase_5+38>
   0x08048dea <+57>:    cmp    $0x36,%edx
   0x08048ded <+60>:    je     0x8048df4 <phase_5+67>
   0x08048def <+62>:    call   0x8049231 <explode_bomb>
   0x08048df4 <+67>:    add    $0x14,%esp
   0x08048df7 <+70>:    pop    %ebx
   0x08048df8 <+71>:    pop    %ebp
   0x08048df9 <+72>:    ret    
0x08048db1:推送%ebp
0x08048db2:mov%esp,%ebp
0x08048db4:推送%ebx
=>0x08048db5:sub$0x14,%esp
0x08048db8:mov 0x8(%ebp),%ebx
0x08048dbb:mov%ebx,(%esp)
0x08048dbe:调用0x8049009
0x08048dc3:cmp$0x6,%eax
0x08048dc6:je 0x8048dcd
0x08048dc8:调用0x8049231
0x08048dcd:mov$0x0,%edx
0x08048dd2:mov$0x0,%eax
0x08048dd7:mov(%ebx,%eax,1),%cl
0x08048dda:和$0xf,%ecx
0x08048ddd:添加0x804a460(,%ecx,4),%edx
0x08048de4:inc%eax
0x08048de5:cmp$0x6,%eax
0x08048de8:jne 0x8048dd7
0x08048dea:cmp$0x36,%edx
0x08048D:je 0x8048df4
0x080484DEF:调用0x8049231
0x08048df4:添加$0x14,%esp
0x08048df7:弹出%ebx
0x08048df8:弹出%ebp
0x08048df9:ret
在这里,我将解释我是如何想出一个解决方案的。我知道我写了很多东西,所以若你们想跳过它,我很难理解这句话

很容易看出输入是6个字符,所以我输入了一个随机猜测:“here”

移动到第38行,我看到%eax+%ebx正在移动到%cl寄存器中,据我所知,这是%ecx的前8个字节。我注意到我的字符串存储在%ebx中,因此当调用此行时,由于%eax从0增加到5,我假设它将ascii字符的十进制值存储在我字符串的%eax元素的%cl中

移动到正确的下一行。将ecx与0xf(0x1111)绑定是在其上加上一个掩码,并将%ecx减少到前4个字节,也就是一个介于0和15之间的数字

第44行是我感到困惑的地方

正如我所理解的,add应该设置行 %(0x804a460)处的edx+=%ecx*4+值。当我检查0x804a460地址时,它包含值2。在我的循环掩蔽的第一次迭代中,字符“h”留给我的是十进制数字8。所以我假设edx将被设置为34,但在这一行之后,它被设置为4

因此,根据我角色的屏蔽值,这一行增加了%edx 6倍。看到第57 0x36行的cmp和%edx,我知道最后我需要得到54

被屏蔽为9的i将我的edx增加了7。t、h和r分别使我的edx增加12、16和6

因此,假设54/6=9,并且我不知道这一添加行在做什么,我决定运行另一个字符串,看看是否可以找到一个将%edx增加9的屏蔽字符

我看了一个ascii表,决定输入:kwsqfm,当屏蔽时,它等于十进制的(11)(7)(3)(1)(6)(13)。然后,我只需完成循环的每个步骤,并检查每个十进制值增加%edx的量

令我惊喜的是,f最终将%edx增加了+9。所以我简单地输入“ffffff”作为我的密码,并取消了这个阶段

我并不完全满意我是如何找到这个答案的,因为我使用了“暴力”的方法。尽管实际上只有15个蒙面值需要检查,但我更愿意理解这里到底发生了什么


线路无疑是给我带来麻烦的原因。如果有人能帮助我理解这份声明,我将不胜感激

欢迎来到索奥利弗。提示:
0x804a460
是一个包含16个DWORD的表。此外,您通常对术语、寻址模式和指针感到困惑。代码非常简单明了,用测试字符串在纸上进行跟踪。如果有些东西看起来很奇怪甚至不寻常,请再次检查,这段代码没有什么特别之处:)请参见和。谢谢KNM241&Jester!你真的让我重回正轨,非常感谢。