我遇到了这样的一段代码:
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
我想知道作者如何知道每条指令有多少字节?
我遇到了这样的一段代码:
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
我想知道作者如何知道每条指令有多少字节?
我喜欢你得到的第一条评论本质上是答案......但它不在答案框中!因此,我将对此进行扩展。
因此,正如您所收集的,您必须“知道”——您可以通过查看英特尔手册中的说明来了解这一点。
我会给你一个简单的例子如果你想计算出说的大小,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
。