【发布时间】:2015-10-09 16:48:31
【问题描述】:
我试图了解包含二进制代码的二进制文件如何转换为汇编指令。
例如,这里是基于 ARM 的应用程序的 objdump 的示例输出:
00008420 <main>:
8420: e92d4800 push {fp, lr}
8424: e28db004 add fp, sp, #4
8428: e24dd008 sub sp, sp, #8
842c: e59f2054 ldr r2, [pc, #84] ; 8488 <main+0x68>
8430: e24b300c sub r3, fp, #12
8434: e1a00002 mov r0, r2
8438: e1a01003 mov r1, r3
843c: ebffffc6 bl 835c <__isoc99_scanf@plt>
8440: e3a03000 mov r3, #0
8444: e50b3008 str r3, [fp, #-8]
8448: ea000006 b 8468 <main+0x48>
844c: e51b3008 ldr r3, [fp, #-8]
8450: e2833001 add r3, r3, #1
8454: e50b3008 str r3, [fp, #-8]
8458: e59f302c ldr r3, [pc, #44] ; 848c <main+0x6c>
845c: e1a00003 mov r0, r3
8460: e51b1008 ldr r1, [fp, #-8]
8464: ebffffb3 bl 8338 <printf@plt>
8468: e51b300c ldr r3, [fp, #-12]
846c: e51b2008 ldr r2, [fp, #-8]
8470: e1520003 cmp r2, r3
8474: bafffff4 blt 844c <main+0x2c>
8478: e3a03000 mov r3, #0
847c: e1a00003 mov r0, r3
8480: e24bd004 sub sp, fp, #4
8484: e8bd8800 pop {fp, pc}
8488: 00008500 .word 0x00008500
848c: 00008504 .word 0x00008504
正如您在偏移量 8464 中看到的,二进制代码 ebffffb3 被转换为 bl 8338。我想了解它。
这样做的明确原因是因为我想为以下 python 代码中存在的指令添加额外的正则表达式:
[b"[\x00\x08\x10\x18\x20\x28\x30\x38\x40\x48\x70]{1}\x47", 2, 2], # bx reg
[b"[\x80\x88\x90\x98\xa0\xa8\xb0\xb8\xc0\xc8\xf0]{1}\x47", 2, 2], # blx reg
[b"[\x00-\xff]{1}\xbd", 2, 2] # pop {,pc}
正如您所见,二进制中 bx 指令的正则表达式是 "\x00\x08\x10\x18\x20\x28\x30\x38\x40\x48\x70]{1}\x47" 和 blx它是“\x80\x88\x90\x98\xa0\xa8\xb0\xb8\xc0\xc8\xf0”。现在我想再添加两条指令 B 和 BL(这些是 ARM 指令),但我不知道如何将指令转换为类似的二进制代码。 (源代码来自github中的ROPGadget。)
【问题讨论】:
-
如果你想处理那个 objdump 输出,为什么不把正则表达式应用到反汇编的助记符上呢?也就是说,指令格式当然在指令集参考中有所描述。
-
如果您打算按照 ROPGadget 的原始目的使用它,您可以添加标签“安全”和/或“利用”。