微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

炸弹实验室分配阶段5-编写等效的C语言

如何解决炸弹实验室分配阶段5-编写等效的C语言

我正在尝试为我的计算机体系结构课程解决一个经过稍微修改的Bomb Lab问题。我应该为这些函数编写C等效项,但是陷入了第5阶段。它与this question非常相似,而且我确实已经弄清楚了该函数的大部分功能

    105b:   56                      push   %esi
    105c:   53                      push   %ebx
    105d:   83 ec 10                sub    $0x10,%esp
    1060:   e8 6b fa ff ff          call   ad0 <__x86.get_pc_thunk.bx>
    1065:   81 c3 fb 3e 00 00       add    $0x3efb,%ebx
    106b:   8b 74 24 1c             mov    0x1c(%esp),%esi
    106f:   56                      push   %esi
    1070:   e8 bf 02 00 00          call   1334 <string_length>
    1075:   83 c4 10                add    $0x10,%esp
    1078:   83 f8 06                cmp    $0x6,%eax
    107b:   75 2e                   jne    10ab <phase_5+0x50>
    107d:   89 f0                   mov    %esi,%eax
    107f:   83 c6 06                add    $0x6,%esi
    1082:   b9 00 00 00 00          mov    $0x0,%ecx
    1087:   0f b6 10                movzbl (%eax),%edx
    108a:   83 e2 0f                and    $0xf,%edx
    108d:   03 8c 93 00 da ff ff    add    -0x2600(%ebx,%edx,4),%ecx
    1094:   83 c0 01                add    $0x1,%eax
    1097:   39 f0                   cmp    %esi,%eax
    1099:   75 ec                   jne    1087 <phase_5+0x2c>
    109b:   83 f9 34                cmp    $0x34,%ecx
    109e:   74 05                   je     10a5 <phase_5+0x4a>
    10a0:   e8 38 05 00 00          call   15dd <explode_bomb>
    10a5:   83 c4 04                add    $0x4,%esp
    10a8:   5b                      pop    %ebx
    10a9:   5e                      pop    %esi
    10aa:   c3                      ret    
    10ab:   e8 2d 05 00 00          call   15dd <explode_bomb>
    10b0:   eb cb                   jmp    107d <phase_5+0x22>

函数接受6个字符的字符串(如果不包含,则炸弹爆炸),并执行某种形式的循环算法来生成数字。最后,如果循环结果不等于52(0x34),则炸弹再次爆炸。但是,我无法理解部分代码

    108d:   03 8c 93 00 da ff ff    add    -0x2600(%ebx,%ecx

显然,它用某种未知算法掩盖了字符串中每个字符的ASCII等价字符所获得的数字。现在,我已经为每个字符制作了一个偏移量表,并设法获得了可接受的字符串aaaabb,但是我想知道代码的C等效形式是什么。

解决方法

就像在Jester的答案中一样,它正在索引数组。 ecx += table[edx],对于static int table[];,由于sizeof(int)为4,因此在寻址模式下EDX索引按4缩放。 asm需要字节偏移量,C索引使用元素偏移量。


-0x2600 + %ebx是一个静态数组,与链接问题中的0x804a4a0相同。但是很难在静态反汇编中找到它,因为创建此可执行文件的人会烦人地将其编译为32位PIE(与位置无关的可执行文件)。

32位PIC / PIE很烂,因为相对于PC的寻址是x86-64的新功能,因此反向工程不必要地变得更加复杂。

它将GOT(全局偏移表)地址存入EBX:第一个call __x86.get_pc_thunk.bx返回其在EBX中的返回地址,即0x1065,其中包含您从objdump -d获得的占位符地址。然后add $0x3efb,%ebx将该位置的偏移量添加到GOT。

然后相对于GOT基础寻址静态数据(在这种情况下为EBX)。痛苦的屁股跟着绝对地址。在内核的程序加载器将代码映射到某个虚拟地址({{1}除外)之后,您可以在运行的进程中单步调试器。

或者手动执行:0x1000 = 0x1065 + 0x3efb的GOT基础(EBX)。
0x4f60是查找表数组的开头:0x4f60-0x2600(如果您还使用0x2960转储数据节)。您可能可以使用它用objdump -D命令在GDB中的地址(之前 startrun)以一种方便的格式转储表,而不是伪造的数据作为从objdump中的代码进行伪装

正在运行的进程中的实际地址是该地址加上4096(0x1000)的倍数。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。