所以我一直在研究这个二元炸弹实验室,而phase_5是我唯一不理解的部分。我已经解决了,但有几行我希望有人可以帮助我。
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
在这里,我将解释我是如何想出一个解决方案的。我意识到我写了很多,如果你想跳过它,我很难理解行&lt; + 44&gt;。
很容易看到输入是6个字符,所以我随机猜测:&#34;等等#34;
转到第38行,我看到%eax +%ebx正被移入%cl寄存器,据我所知,如果是%ecx,它是前8个字节。我注意到我的字符串存储在%ebx中,因此当调用此行时,看到%eax从0增加到5我假设它将ascii字符的十进制值存储在我的字符串的%eax元素中%CL。
转到下一行是正确的。并且使用0xf(0x1111)的ecx将掩码打开并将%ecx降低到前4个字节,即0到15之间的数字。
第44行是我感到困惑的地方。据我了解添加,该行应该设置 %edx + =%ecx * 4 + value_at(0x804a460)。当我检查0x804a460地址时,它包含值2.对于我的循环的第一次迭代,掩盖字符&#34; h&#34;给我留下十进制数字8.因此我假设edx将设置为34,但在该行之后它被设置为4.
因此,此行根据我的角色的屏蔽值增加%edx 6次。看到第57行0x36和%edx上的cmp,我知道最后我需要以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。所以我只是简单地加入&#34; ffffff&#34;作为我的密码并化解了阶段。
我对我如何找到这个答案并不完全满意,因为这是一个强大的力量&#34;我使用的方法。即使实际上只有15个屏蔽值需要检查,我宁愿理解这里到底发生了什么。
线&lt; + 44&gt;毫无疑问是什么给我带来了麻烦。如果有人能帮我理解添加声明,我将非常感激。