gpt4 book ai didi

assembly - nasm 64 位推送 qword?

转载 作者:行者123 更新时间:2023-12-02 08:52:33 25 4
gpt4 key购买 nike

我似乎有一个有趣的问题,尽管我可能做错了一些事情。

我的问题是我试图将 AAAABBBBCCCC 压入堆栈,然后通过标准输出打印它们。然而,在我的 x86_64 环境中,push 0x41414141 似乎会推送 4141414100000000

所以下面的代码块:

    global _start
section .text
_start:
push 0x43434343 ; CCCC
push 0x42424242 ; BBBB
push 0x41414141 ; AAAA
xor rax,rax ; Zero RAX
mov byte al,0x1 ; 1 for sys_write
mov rdi,rax ; 1 for stdout
mov rsi,rsp ; RSP for source
mov byte dl,0xC ; 12
syscall

xor rax,rax ; Zero RAX
mov al, 0x3C ; 60 for sys_edxit
cdq ; 0 for clean exit.
syscall

输出AAAABBBB,我以为只有8个字节,实际上是我要求的12个字节。当通过管道传输到输出文件并在十六进制编辑中查看时,我注意到它显示 414141410000000042424242

我认为push指令会推送一个dword值。到 qword 大小的堆栈上?我的想法正确吗?

通过考虑额外的字节并将长度更改为 20,可以轻松避免这种情况。但这会导致 sys_open 等问题。

所以我的问题是,我做错了什么?

最佳答案

对于 64 位代码,堆栈 (RSP) 始终在 8 字节边界上对齐。也没有“push qword imm64”指令(参见注释)。

我的建议是将字符串“AAAABBBBCCCC”存储在它所属的数据部分(或“.rodata”)中,而不是弄乱堆栈。或者在 shellcode 中,

push   'CCCC'                  ; push qword, including 4 bytes of zeros
mov rax, 'AAAABBBB' ; mov reg, imm64; pick any register
push rax ; push qword

保留你的变态的另一种选择可能是:

sub rsp,16
mov dword [rsp],'AAAA'
mov dword [rsp+4],'BBBB'
mov dword [rsp+8],'CCCC'
....
add rsp,16

注意:AMD 的手册说有一个“push imm64”指令。 AMD 的手册是错误的 - 该指令实际上推送 32 位立即数(符号扩展为 64 位)。

Intel的手册没有这个问题:https://www.felixcloutier.com/x86/push
另相关:How many bytes does the push instruction push onto the stack when I don't specify the operand size? - 你绝对不能在 64 位模式下进行双字推送。

关于assembly - nasm 64 位推送 qword?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12544957/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com