0

我遇到了这样的一段代码:

jmp 0x26 #2 bytes
popl %esi #1 bytes
movl %esi,0x8(%esi) # 3 bytes
movb $0x0,0x7(%esi) # 4 bytes

.....

.string \"/bin/sh\" #8 bytes

我想知道作者如何知道每条指令有多少字节?

4

1 回答 1

1

我喜欢你得到的第一条评论本质上是答案......但它不在答案框中!因此,我将对此进行扩展。

因此,正如您所收集的,您必须“知道”——您可以通过查看英特尔手册中的说明来了解这一点。

我会给你一个简单的例子如果你想计算出说的大小,mov rax, [rsp+8]你可以在 nasm 中组装它:

 BITS 64
 mov rax, [rsp+8]

使用以下命令:

 nasm -fbin test.asm -o test.bin

检查 test.bin,你会在 Hex 中看到它是:

 48 8B 44 24 08

这里8B代表mov指令。前面48是带有w属性集的 REX 前缀(表示 64 位目标)。最后一个字节,08表示与前一个寄存器的位移24,即表示esp(除了目标是宽的,因为REX前缀告诉我们)。最后,44表示eax*2,这将是一个 64 位宽的字段。

这里使用的确切寻址模式非常复杂,但可以肯定地说,可以快速解决常见的寻址模式。例如,等效的 32 位 ( mov eax, [esp+4]) 是 4 字节8B 44 24 04

于 2012-11-14T11:55:35.547 回答