Bomblab - 第4阶段

时间:2017-10-27 20:30:59

标签: assembly

我正在为学校召集这个名为bomblab的装配项目。该项目是通过使用正确的输入来化解几个二进制“炸弹”。 该项目有6个阶段,目前我正处于第4阶段。 使用gdb我已经反汇编了这个函数的代码,我得出了4个结论。

  1. 输入必须是2个整数。 (我检查了$ 0x4028c5并找到%d%d)
  2. 第一个整数是6.
  3. 该函数使用第二个整数作为输入,输出必须为8才能化解炸弹。
  4. 该功能是递归的
  5. 这是反汇编的代码,注释可能不准确(但我希望它们是)

    phase_4
    0x0000000000401020 <+0>:     sub    $0x18,%rsp
    0x0000000000401024 <+4>:     lea    0x8(%rsp),%rcx
    0x0000000000401029 <+9>:     lea    0xc(%rsp),%rdx
    0x000000000040102e <+14>:    mov    $0x4028c5,%esi
    0x0000000000401033 <+19>:    mov    $0x0,%eax
    0x0000000000401038 <+24>:    callq  0x400c30 <__isoc99_sscanf@plt>
    0x000000000040103d <+29>:    cmp    $0x2,%eax
    0x0000000000401040 <+32>:    jne    0x401049 <phase_4+41>
    0x0000000000401042 <+34>:    cmpl   $0xe,0xc(%rsp)
    0x0000000000401047 <+39>:    jbe    0x40104e <phase_4+46>
    0x0000000000401049 <+41>:    callq  0x401574 <explode_bomb>
    0x000000000040104e <+46>:    mov    $0xe,%edx
    0x0000000000401053 <+51>:    mov    $0x0,%esi
    0x0000000000401058 <+56>:    mov    0xc(%rsp),%edi
    0x000000000040105c <+60>:    callq  0x400fe2 <func4>
    0x0000000000401061 <+65>:    cmp    $0x6,%eax
    0x0000000000401064 <+68>:    jne    0x40106d <phase_4+77>
    0x0000000000401066 <+70>:    cmpl   $0x6,0x8(%rsp)
    0x000000000040106b <+75>:    je     0x401072 <phase_4+82>
    0x000000000040106d <+77>:    callq  0x401574 <explode_bomb>
    0x0000000000401072 <+82>:    add    $0x18,%rsp
    0x0000000000401076 <+86>:    retq
    
    Dump of assembler code for function func4:
    
    0x0000000000400fe2 <+0>:     sub    $0x8,%rsp //subtracks 8 from rsp
    0x0000000000400fe6 <+4>:     mov    %edx,%eax  
    0x0000000000400fe8 <+6>:     sub    %esi,%eax   
    0x0000000000400fea <+8>:     mov    %eax,%ecx   //rcx = rax
    0x0000000000400fec <+10>:    shr    $0x1f,%ecx  // shifts rcx to the right by 0x1f
    0x0000000000400fef <+13>:    add    %ecx,%eax   // ads rcx to rax
    0x0000000000400ff1 <+15>:    sar    %eax            //arithmetic shift to the right
    0x0000000000400ff3 <+17>:    lea    (%rax,%rsi,1),%ecx //??
    0x0000000000400ff6 <+20>:    cmp    %edi,%ecx   // compares %edi & $ecx
    0x0000000000400ff8 <+22>:    jle    0x401006 <func4+36> // jump if ecx < edi
    0x0000000000400ffa <+24>:    lea    -0x1(%rcx),%edx     //edx = edx - rcx - 1
    0x0000000000400ffd <+27>:    callq  0x400fe2 <func4>    // calls itself
    0x0000000000401002 <+32>:    add    %eax,%eax   //eax*2
    0x0000000000401004 <+34>:    jmp    0x40101b <func4+57> 
    0x0000000000401006 <+36>:    mov    $0x0,%eax 
    0x000000000040100b <+41>:    cmp    %edi,%ecx
    0x000000000040100d <+43>:    jge    0x40101b <func4+57>
    0x000000000040100f <+45>:    lea    0x1(%rcx),%esi
    0x0000000000401012 <+48>:    callq  0x400fe2 <func4>
    0x0000000000401017 <+53>:    lea    0x1(%rax,%rax,1),%eax
    0x000000000040101b <+57>:    add    $0x8,%rsp // adds 8 to rsp
    0x000000000040101f <+61>:    retq
    

    所以我想我的问题是函数4实际上做了什么? 或者更好的是我的输入必须是为了获得所需的8。 如果这个问题格式不正确并且我的低于英语,我很抱歉。 我花了好几个小时盯着这段代码,所以任何帮助都会非常感激。 提前谢谢大家。

0 个答案:

没有答案