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
我不知道如何剂量笔者知道每个指令有多少字节?
我来越过这样的代码段:我如何知道装配中的指令长度?
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,你会看到在十六进制它是:
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
。
无论是从经验,在英特尔文档中查找,还是从生成asm列表文件。 –