如何解决炸弹实验室分配阶段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中的地址(之前 start
或run
)以一种方便的格式转储表,而不是伪造的数据作为从objdump中的代码进行伪装
正在运行的进程中的实际地址是该地址加上4096(0x1000)的倍数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。