Assembly 汇编语言炸弹实验室
我试过寻找类似的炸弹,类似的装配,但我似乎找不到。我在这个阶段遇到了麻烦,特别是在生产线上发生了什么。这是我的汇编,以下是我的发现:Assembly 汇编语言炸弹实验室,assembly,gdb,disassembly,Assembly,Gdb,Disassembly,我试过寻找类似的炸弹,类似的装配,但我似乎找不到。我在这个阶段遇到了麻烦,特别是在生产线上发生了什么。这是我的汇编,以下是我的发现: 0x00000000004011f1 <+0>: sub $0x18,%rsp 0x00000000004011f5 <+4>: lea 0xc(%rsp),%rcx 0x00000000004011fa <+9>: lea 0x8(%rsp),%rdx 0x00000000004011
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
然后,它使用按位and获取eax的最低有效位,并将其存储在eax中
然后,eax的新值存储在第一个整数的原始位置
eax与15进行比较,如果小于15,程序将继续
ecx和edx现在为0
我们开始一个循环,edx是索引,在开始循环之前向它添加1
我不确定这里到底发生了什么,mov 0x402820,%rax,4,%eax,但我知道它正在改变eax的值
添加eax和ecx的总和我不确定ecx如何获得一个值,因为它已经设置为0,并且在该指令之前没有任何更改
检查eax是否为15,如果没有,则循环将重新运行
当eax为15时,它会检查循环计数器edx是否已运行15次
比较输入到ecx的第二个整数,我认为eax将等于第行的eax
非常感谢您的帮助或指导。要求将32位整数从内存地址0x402820+%rax*4移动到%eax。AT&T语法是段:位移基址寄存器、偏移寄存器、标量乘法器。您可以在Address Operator Syntax部分了解有关此寻址的更多信息。因此,当此循环继续运行时,相同的内存地址是否会继续存储到eax中?如果是这样的话,我怎样才能找出内存地址0x402820+%rax*464位上的内容,稍有变化。谢谢,我找到了!