我曾尝试寻找类似装配的类似炸弹,我似乎无法找到一个。我在这个阶段遇到了麻烦,特别是在线< 70>上发生了什么。这是我的集会,下面是我的发现:
0x00000000004011f1 <+0>: sub $0x18,%rsp
0x00000000004011f5 <+4>: lea 0xc(%rsp),%rcx
0x00000000004011fa <+9>: lea 0x8(%rsp),%rdx
0x00000000004011ff <+14>: mov $0x402af1,%esi
0x0000000000401204 <+19>: mov $0x0,%eax
0x0000000000401209 <+24>: callq 0x400cb0 <__isoc99_sscanf@plt>
0x000000000040120e <+29>: cmp $0x1,%eax
0x0000000000401211 <+32>: jg 0x401218 <phase_5+39>
0x0000000000401213 <+34>: callq 0x401785 <explode_bomb>
0x0000000000401218 <+39>: mov 0x8(%rsp),%eax
0x000000000040121c <+43>: and $0xf,%eax
0x000000000040121f <+46>: mov %eax,0x8(%rsp)
0x0000000000401223 <+50>: cmp $0xf,%eax
0x0000000000401226 <+53>: je 0x401254 <phase_5+99>
0x0000000000401228 <+55>: mov $0x0,%ecx
0x000000000040122d <+60>: mov $0x0,%edx
0x0000000000401232 <+65>: add $0x1,%edx
0x0000000000401235 <+68>: cltq
0x0000000000401237 <+70>: mov 0x402820(,%rax,4),%eax
0x000000000040123e <+77>: add %eax,%ecx
0x0000000000401240 <+79>: cmp $0xf,%eax
0x0000000000401243 <+82>: jne 0x401232 <phase_5+65>
0x0000000000401245 <+84>: mov %eax,0x8(%rsp)
0x0000000000401249 <+88>: cmp $0xf,%edx
0x000000000040124c <+91>: jne 0x401254 <phase_5+99>
0x000000000040124e <+93>: cmp 0xc(%rsp),%ecx
0x0000000000401252 <+97>: je 0x401259 <phase_5+104>
0x0000000000401254 <+99>: callq 0x401785 <explode_bomb>
0x0000000000401259 <+104>: add $0x18,%rsp
0x000000000040125d <+108>: retq enter code here
我知道该函数采用两个整数。输入的第一个是rdx,第二个是rcx。然后它将第一个整数放入eax&lt; 39&gt;中。在确保输入两个数字之后。
&LT; 43&GT;然后,它按位获取最低位的eax,并将其存储在eax
中&LT; 46&GT;然后将新的eax值存储在第一个整数的原始位置。
&LT 50为烷基;将eax与15进行比较,如果小于15则继续执行
&LT; 55,60&GT; ecx和edx现在为0
&LT; 65 GT;我们启动一个循环edx是索引,并在开始循环之前添加1。
&LT; 70 GT;我不确定这里究竟发生了什么mov 0x402820(,%rax,4),%eax但我知道它正在改变eax的值
&LT; 77&GT;添加eax和ecx的总和(我不确定ecx如何得到一个值,因为它已经设置为0&lt; 55&gt;并且在该指令之前没有变化
&lt; 79&gt;检查eax = 15,如果它没有循环重新运行
&lt; 88&gt;当eax为15时,它会检查循环计数器edx是否已运行15次
&LT; 93基比较输入到ecx的第二个int,我认为eax将等于来自行&lt; 77&gt;的eax
非常感谢任何帮助或指导。