asm64写系统调用:非相邻内存?
asm64 write system call: non-adjacent memory?
我有这个用 x64 汇编语言编写的小程序:
xor rdx,rdx
push rdx ;null terminator
push 0x41414141 ;AAAA
push 0x45454545 ;EEEE
mov rsi,rsp ;pointer to the string
mov rdi,1 ;output file: stdout
mov rdx,8 ;buffer size 8
mov rax,1 ;write syscall
syscall
如您所见,我将八个字节压入堆栈,当我调用缓冲区大小为 8 的 write 时,我希望看到 EEEEAAAA
,但输出是 EEEE
。但是,当我将缓冲区大小 rdx
设置为 12 时,我可以看到完整的字符串 EEEEAAAA
。那些四字节块之间是什么?他们不是应该相邻吗?
每次推送写入 8 个字节,因为这是 64 位模式下的堆栈大小。指令中的立即数被符号扩展为 64 位,请参阅指令集参考:如果源操作数是一个大小小于操作数大小的立即数,则将符号扩展值压入堆栈。
因此,您的堆栈看起来像(从 rsp
向上):
0x0000000045454545 ; EEEE sign extended to 64 bits
0x0000000041414141 ; AAAA sign extended to 64 bits
0x0000000000000000 ; NULL terminator
作为解决方法,您可以这样做:
xor rdx, rdx
push rdx
mov rax, 0x4141414145454545
push rax
mov rsi,rsp ;pointer to the string
mov rdi,1 ;output file: stdout
mov rdx,8 ;buffer size 8
mov rax,1 ;write syscall
syscall
我有这个用 x64 汇编语言编写的小程序:
xor rdx,rdx
push rdx ;null terminator
push 0x41414141 ;AAAA
push 0x45454545 ;EEEE
mov rsi,rsp ;pointer to the string
mov rdi,1 ;output file: stdout
mov rdx,8 ;buffer size 8
mov rax,1 ;write syscall
syscall
如您所见,我将八个字节压入堆栈,当我调用缓冲区大小为 8 的 write 时,我希望看到 EEEEAAAA
,但输出是 EEEE
。但是,当我将缓冲区大小 rdx
设置为 12 时,我可以看到完整的字符串 EEEEAAAA
。那些四字节块之间是什么?他们不是应该相邻吗?
每次推送写入 8 个字节,因为这是 64 位模式下的堆栈大小。指令中的立即数被符号扩展为 64 位,请参阅指令集参考:如果源操作数是一个大小小于操作数大小的立即数,则将符号扩展值压入堆栈。
因此,您的堆栈看起来像(从 rsp
向上):
0x0000000045454545 ; EEEE sign extended to 64 bits
0x0000000041414141 ; AAAA sign extended to 64 bits
0x0000000000000000 ; NULL terminator
作为解决方法,您可以这样做:
xor rdx, rdx
push rdx
mov rax, 0x4141414145454545
push rax
mov rsi,rsp ;pointer to the string
mov rdi,1 ;output file: stdout
mov rdx,8 ;buffer size 8
mov rax,1 ;write syscall
syscall