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

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位上的内容,稍有变化。谢谢,我找到了!