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!你真的让我重回正轨,非常感谢。