我遇到了这样一段代码:
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
我想知道作者知道每条指令的字节数是多少?
答案 0 :(得分: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
是一个REX前缀,其w
属性集(表示64位目标)。最后一个字节08
表示前一个寄存器的位移,即24
,表示esp
(目标范围很宽,因为REX
前缀告诉我们所以)。最后,44
代表eax*2
,这将是一个64位宽的字段。
这里使用的确切寻址模式非常复杂,但可以说很快就可以解决常见的寻址模式。例如,32位等效(mov eax, [esp+4]
)是4字节8B 44 24 04
。