给定一个汇编字符串以字节为单位打印字节码以供 Radare 反汇编?

逆向工程 部件 x86 雷达2 x86-64
2021-06-17 16:06:01

Megabeets确定在这个答案,取决于asm.bitsRadare可能会出现两种

lea edx, [0x80490c8]         (asm.bits=32)
lea edx, [rip + 0x80490c8]   (asm.bits=64)

如果我想查看lea edx, [0x80490c8]x86_64 中的字节码是什么样的,我将如何获得它?

2个回答

实际上,没有lea edx, [0x80490c8]64 位寻址模式。因为,afaik,在所有 64 位寻址模式中lea都是寄存器相关操作码。

LEA - 加载有效地址
计算第二个操作数(源操作数)的有效地址并将其存储在第一个操作数(目标操作数)中。源操作数是由处理器寻址模式之一指定的内存地址(偏移量部分);目标操作数是一个通用寄存器。

来源:英特尔® 64 位和 IA-32 架构软件开发人员手册


无论如何,如果您想知道表示使用radare2 指令的字节码,您可以使用该pa命令。

在 32 位模式下,它看起来像这样:

[0x00000000]> e asm.bits=32
[0x00000000]> pa lea edx, [0x80490c8]
8d15c8900408
[0x00000000]> pad 8d15c8900408
lea edx, [0x80490c8]

在 64 位模式下,它看起来像这样:

[0x00000000]> e asm.bits=64
[0x00000000]> pa lea edx, [0x80490c8]
488d15c8900408
[0x00000000]> pad 488d15c8900408
lea rdx, [rip + 0x80490c8]

您可以看到radare2 知道lea edx, [0x80490c8]不能用64 位表示,因此它使用RIP 相对表达式。

32

radare2  -a x86 -b 32 -c "wa lea edx,[0x80490c8] ; pd 1 ; exit()" -
Written 6 byte(s) (lea edx,[0x80490c8]) = wx 8d15c8900408
            0x00000000      8d15c8900408   lea edx, [0x80490c8]
 -- Are you a wizard?
[0x00000000]> q

64

radare2  -a x86 -b 64 -c "wa lea edx,[rip+0x80490c8] ; pd 1 ; exit()" -
Written 7 byte(s) (lea edx,[rip+0x80490c8]) = wx 488d98c8900408
            0x00000000      488d98c89004.  lea rbx, [rax + 0x80490c8]
 -- SHALL WE PLAY A GAME?
[0x00000000]> q