计算机系统_炸弹(boom)实验/逆向工程实验(phase_4)

第四关

0000000000400fc1 <phase_4>:

  400fc1:   4883 ec 18             sub    $0x18, %rsp

  400fc5:   488d 54 24 0c          lea    0xc(%rsp), %rdx

  400fca:   bec1 1e 40 00          mov    $0x401ec1, %esi

  400fcf:   b800 00 00 00          mov    $0x0, %eax

  400fd4:   e8d7 fa ff ff          callq  400ab0 <__isoc99_sscanf@plt>

  400fd9:   83f8 01                cmp    $0x1, %eax

  400fdc:   7507                   jne    400fe5<phase_4+0x24>

  400fde:   837c 24 0c 00          cmpl   $0x0, 0xc(%rsp)    //输入的数字

  400fe3:   7f05                   jg     400fea <phase_4+0x29>  //大于0

  400fe5:   e853 06 00 00          callq  40163d <explode_bomb>

  400fea:   8b7c 24 0c             mov    0xc(%rsp), %edi   //传参进函数

  400fee:   e891 ff ff ff          callq  400f84 <func4>

  400ff3:   83f8 37                cmp    $0x37, %eax

  400ff6:   7405                   je     400ffd<phase_4+0x3c>

  400ff8:   e840 06 00 00          callq  40163d<explode_bomb>

  400ffd:   4883 c4 18             add    $0x18, %rsp

  401001:   c3                      retq  

 

这一关有用到函数:

0000000000400f84 <func4>:

  400f84:   4889 5c 24 f0          mov    %rbx, -0x10(%rsp)

  400f89:   4889 6c 24 f8          mov    %rbp, -0x8(%rsp)

  400f8e:   4883 ec 18             sub    $0x18, %rsp

  400f92:   89fb                   mov    %edi, %ebx

  400f94:   b801 00 00 00          mov    $0x1, %eax

  400f99:   83ff 01                cmp    $0x1, %edi        //与1进行比较

  400f9c:   7e14                   jle    400fb2 <func4+0x2e>  //小于等于

  400f9e:   8d7b ff                lea    -0x1(%rbx), %edi    //n-1

  400fa1:   e8de ff ff ff          callq  400f84 <func4>   //递归调用fun4

  400fa6:   89c5                   mov    %eax, %ebp

  400fa8:   8d7b fe                lea    -0x2(%rbx), %edi   //n-2

  400fab:   e8d4 ff ff ff          callq  400f84 <func4>   //递归调用fun4

  400fb0:   01e8                   add    %ebp, %eax

  400fb2:   488b 5c 24 08          mov    0x8(%rsp), %rbx

  400fb7:   488b 6c 24 10          mov    0x10(%rsp), %rbp

  400fbc:   4883 c4 18             add    $0x18, %rsp

  400fc0:   c3                      retq  

 

要求是输入一个数,要求这个数比0大,而且将这个数作为 func4 的参数。然后要求func4函数的返回值为55(0x37)。

而func4这个函数是个递归函数,所以这题的关键是func4函数。我们只要写出该函数的 C 形式,就容易多了。

 

int func4(int n) {

    if (n <= 1)

        return 1;

    return func4(n-1) + func4(n-2);

}

 

int main() {

    int i;

    for (i = 2; 1; i++) {

        if (func4(i) == 55)

            break;

    }

    printf("%d\n", i);

}

 

 

 

猜你喜欢

转载自blog.csdn.net/Xindolia_Ring/article/details/80304566