我有下一个代码:
Doit: mov eax, 4 ; for write system call
push Dword, 0x44434241
mov ebx, 1
mov ecx, esp
mov edx, 4
int 0x80
add esp, 4
ret
当我检查时,它是打印“ABCD”,但为什么?据我所知,在堆栈上我们有下一张图片:
低--- 0x41 0x42 0x43 0x44
- esp,
即esp指向0x44。当我们调用0x80时。它应该打印“DCBA”。我错过了什么?
答案 0 :(得分:2)
您的堆叠图片错误。由于x86是一个小端架构,因此ESP等于推送值中最低有效字节的地址,或0x41
。
来自Intel's priceless Architecture Developer's Manual:
当项目被推入堆栈时,处理器会递减 ESP寄存器,然后将项目写入堆栈的新顶部。
答案 1 :(得分:1)
这只是一个endianness问题。您只需将32位值压入堆栈,该堆栈将位于地址ESP处。 x86是little-endian,并且首先存储最不重要的字节:
ESP + 0(0x41),ESP + 1(0x42),ESP + 2(0x43),ESP + 3(0x44)。然而,当作为字节数组访问时,它在ESP处启动并通过内存递增。
使用堆栈时出现 nothing 错误,只是误解了word / dword / qword存储与字节访问。