CSAPP中bomblab的一题

发布于 2022-09-04 07:08:45 字数 4010 浏览 21 评论 0

该问题来源于bomblab中phase4,具体是一个递归的题,phase4和func4的代码分别如下:
phase_4:

   0x08048d3d <+0>:     sub    $0x1c,%esp
   0x08048d40 <+3>:     mov    %gs:0x14,%eax
   0x08048d46 <+9>:     mov    %eax,0xc(%esp)
   0x08048d4a <+13>:    xor    %eax,%eax
   0x08048d4c <+15>:    lea    0x4(%esp),%eax
   0x08048d50 <+19>:    push   %eax
   0x08048d51 <+20>:    lea    0xc(%esp),%eax
   0x08048d55 <+24>:    push   %eax
   0x08048d56 <+25>:    push   $0x804a521
   0x08048d5b <+30>:    pushl  0x2c(%esp)
   0x08048d5f <+34>:    call   0x8048880 <__isoc99_sscanf@plt>
   0x08048d64 <+39>:    add    $0x10,%esp
   0x08048d67 <+42>:    cmp    $0x2,%eax
   0x08048d6a <+45>:    jne    0x8048d78 <phase_4+59>
   0x08048d6c <+47>:    mov    0x4(%esp),%eax
   0x08048d70 <+51>:    sub    $0x2,%eax
   0x08048d73 <+54>:    cmp    $0x2,%eax
   0x08048d76 <+57>:    jbe    0x8048d7d <phase_4+64>
   0x08048d78 <+59>:    call   0x80492dc <explode_bomb>
   0x08048d7d <+64>:    sub    $0x8,%esp
   0x08048d80 <+67>:    pushl  0xc(%esp)
   0x08048d84 <+71>:    push   $0x6
---Type <return> to continue, or q <return> to quit---return
   0x08048d86 <+73>:    call   0x8048cfa <func4>
   0x08048d8b <+78>:    add    $0x10,%esp
   0x08048d8e <+81>:    cmp    0x8(%esp),%eax
   0x08048d92 <+85>:    je     0x8048d99 <phase_4+92>
   0x08048d94 <+87>:    call   0x80492dc <explode_bomb>
   0x08048d99 <+92>:    mov    0xc(%esp),%eax
   0x08048d9d <+96>:    xor    %gs:0x14,%eax
   0x08048da4 <+103>:   je     0x8048dab <phase_4+110>
   0x08048da6 <+105>:   call   0x80487e0 <__stack_chk_fail@plt>
   0x08048dab <+110>:   add    $0x1c,%esp
   0x08048dae <+113>:   ret

func4:

   0x08048cfa <+0>:     push   %edi
   0x08048cfb <+1>:     push   %esi
   0x08048cfc <+2>:     push   %ebx
   0x08048cfd <+3>:     mov    0x10(%esp),%ebx
   0x08048d01 <+7>:     mov    0x14(%esp),%edi
   0x08048d05 <+11>:    test   %ebx,%ebx
   0x08048d07 <+13>:    jle    0x8048d34 <func4+58>
   0x08048d09 <+15>:    mov    %edi,%eax
   0x08048d0b <+17>:    cmp    $0x1,%ebx
   0x08048d0e <+20>:    je     0x8048d39 <func4+63>
   0x08048d10 <+22>:    sub    $0x8,%esp
   0x08048d13 <+25>:    push   %edi
   0x08048d14 <+26>:    lea    -0x1(%ebx),%eax
   0x08048d17 <+29>:    push   %eax
   0x08048d18 <+30>:    call   0x8048cfa <func4>
   0x08048d1d <+35>:    add    $0x8,%esp
   0x08048d20 <+38>:    lea    (%edi,%eax,1),%esi
   0x08048d23 <+41>:    push   %edi
   0x08048d24 <+42>:    sub    $0x2,%ebx
   0x08048d27 <+45>:    push   %ebx
   0x08048d28 <+46>:    call   0x8048cfa <func4>
   0x08048d2d <+51>:    add    $0x10,%esp
   0x08048d30 <+54>:    add    %esi,%eax
   0x08048d32 <+56>:    jmp    0x8048d39 <func4+63>
   0x08048d34 <+58>:    mov    $0x0,%eax
   0x08048d39 <+63>:    pop    %ebx
   0x08048d3a <+64>:    pop    %esi
   0x08048d3b <+65>:    pop    %edi
   0x08048d3c <+66>:    ret

然后我个人写了一段c代码来模拟func4:

int eax;
void func4(int ebx,int edi){
    int esi;
    if((ebx&ebx)<=0)
        eax=0;
    else{
           // int esi;
        eax = edi;
        if(ebx!=1){
            eax = ebx-1;
            func4(eax,edi);
            esi = edi+eax*1;
            ebx-=2;
            func4(ebx,edi);
            eax+=esi;
        }
    }
}

关于这题我的理解是,phase_4对两个参数的要求是,第一个小于四,然后func4(6,第一个参数)==第二个参数,但是未能得出正确答案,希望哪位大牛能帮忙看看我的思路哪里出了问题,或者是从一开始就是错误的,感激不尽。
补充:
图片描述

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

苦笑流年记忆 2022-09-11 07:08:45

看起来func4应该长这样。

int func4(int ebx, int edi) {
    if(ebx <= 0) {
        return 0;
    }
    if(ebx == 1) {
        return edi;
    }
    return edi + func4(ebx-1, edi) + func4(ebx-2, edi);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文