【问题标题】:Bomb lab assembly explanation炸弹实验室组装说明
【发布时间】:2015-09-07 03:49:20
【问题描述】:

我正在做炸弹实验室,我猜对了,这是一个斐波那契数列 (0 1 1 2 3 5)。我无法理解以下几行:8048d11-8048d1a

08048ce6 <phase_2>:
 8048ce6:       55                      push   %ebp
 8048ce7:       89 e5                   mov    %esp,%ebp
 8048ce9:       56                      push   %esi
 8048cea:       53                      push   %ebx
 8048ceb:       83 ec 30                sub    $0x30,%esp
 8048cee:       8d 45 e0                lea    -0x20(%ebp),%eax
 8048cf1:       89 44 24 04             mov    %eax,0x4(%esp)
 8048cf5:       8b 45 08                mov    0x8(%ebp),%eax
 8048cf8:       89 04 24                mov    %eax,(%esp)
 8048cfb:       e8 ca 04 00 00          call   80491ca <read_six_numbers>
 8048d00:       83 7d e0 00             cmpl   $0x0,-0x20(%ebp)
 8048d04:       75 06                   jne    8048d0c <phase_2+0x26>
 8048d06:       83 7d e4 01             cmpl   $0x1,-0x1c(%ebp)
 8048d0a:       74 05                   je     8048d11 <phase_2+0x2b>
 8048d0c:       e8 77 04 00 00          call   8049188 <explode_bomb>
 8048d11:       8d 5d e8                lea    -0x18(%ebp),%ebx
 8048d14:       8d 75 f8                lea    -0x8(%ebp),%esi
 8048d17:       8b 43 fc                mov    -0x4(%ebx),%eax
 8048d1a:       03 43 f8                add    -0x8(%ebx),%eax
 8048d1d:       39 03                   cmp    %eax,(%ebx)
 8048d1f:       74 05                   je     8048d26 <phase_2+0x40>
 8048d21:       e8 62 04 00 00          call   8049188 <explode_bomb>
 8048d26:       83 c3 04                add    $0x4,%ebx
 8048d29:       39 f3                   cmp    %esi,%ebx
 8048d2b:       75 ea                   jne    8048d17 <phase_2+0x31>
 8048d2d:       83 c4 30                add    $0x30,%esp
 8048d30:       5b                      pop    %ebx
 8048d31:       5e                      pop    %esi
 8048d32:       5d                      pop    %ebp
 8048d33:       c3                      ret

我知道它保留了一个 tmp 变量来存储前一个元素,并将其相加并在 8048d1d 与下一个元素进行比较。它是如何做到这一点的(虽然是 lea、mov 和 add)?

【问题讨论】:

    标签: assembly x86 gdb reverse-engineering


    【解决方案1】:

    基本上就是这样:

    int array[6];             // at ebp-0x20
    int *ebx = &array[2];     // lea    -0x18(%ebp),%ebx
    int *esi = &array[6];     // lea    -0x8(%ebp),%esi
    do {
        int eax = *(ebx - 1); // mov    -0x4(%ebx),%eax
        eax += *(ebx - 2);    // add    -0x8(%ebx),%eax
        if (eax != *ebx)      // cmp    %eax,(%ebx)
            explode_bomb();
        ebx++;                // add    $0x4,%ebx
    } while (ebx != esi);
    

    请记住,C 指针算法会自动按项目大小缩放,但汇编始终以字节为单位。 ebx 是指向当前元素的指针,代码将前两个相加并检查是否相等。 esi 是指向数组末尾的指针,用于退出循环。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-06
      • 2017-03-04
      • 1970-01-01
      • 2021-02-07
      • 2020-01-24
      • 1970-01-01
      • 2020-09-27
      相关资源
      最近更新 更多