- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我似乎有一个有趣的问题,尽管我可能做错了一些事情。
我的问题是我试图将 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/
如果 8 位是一个字节 两个字节就是一个字 四个字节是一个双字 8 个字节是一个 qword 16 字节的好名字是什么? 最佳答案 电话:DR : 在 NASM 中,在 RESB/RESW/RESD/
我有一个 unsigned long long,我想把它拆分成更小的字节。例如 unsigned long long TEST = 0x465958432E1F0199; 我希望它分成如下字符。cha
我目前正在寻找上述问题的答案。到目前为止,我发现有人说,字长是指处理器寄存器的大小,这表明在 64 位机器上,字长是 64 位,因此 QWORD(4 * 字)的大小是 256 位。 但另一方面,我发现
我似乎有一个有趣的问题,尽管我可能做错了一些事情。 我的问题是我试图将 AAAABBBBCCCC 压入堆栈,然后通过标准输出打印它们。然而,在我的 x86_64 环境中,push 0x41414141
mov rax,QWORD PTR [rbp-0x10] mov eax,DWORD PTR [rax] add eax,0x1 mov DWORD PTR [rbp-0x14], eax 下
我想将 Qword 转换为 Dword。通过程序员计算器,我很容易转换它但在 python 中找不到任何方法。 Qword = 562949953442333 Dword = 21021 最佳答案 您
我不知道为什么这不起作用。我想使用 struct modul 读取 1 个整数(双字)和 4 个四字。这代表 4 + 4 * 8 = 36 字节,但 python 给了我这个: >>> import
我注意到 DWord 和 QWord 值在写入注册表时应该是有符号整数,而不是无符号整数。如果值为 UInt64 或 UInt32,此代码将抛出异常: registryKey.SetValue(nam
考虑以下x64 NASM语法程序集: inc qword [rax] inc qword [rcx] inc qword [rdx] inc qword [rbx] inc qword [rsp] i
想象一个如下所示的加载-存储循环,它从非连续位置加载 DWORD 并将它们连续存储: top: mov eax, DWORD [rsi] mov DWORD [rdi], eax mov eax, D
我正在汇编中调试 CLR 代码,并到达一行 mov rax, qword ptr [ff4053c0h] 我认为 qword ptr [ff4053c0h] 引用了我感兴趣的字符串,但 ff4053c
我有十六进制数: FFFFFCE3 然后,如果我尝试将其转换为十进制数。我做了: printf "%d" "0xFFFFFCE3" 输出: 4294966499 但是如果我将它存储在 QWORD 中,
我想测试创建 NVMe I/O 提交队列无效队列地址偏移量 我使用 C posix_memalign 来分配内存范围 但是如何检查我得到的地址是否是 QWord 对齐的? 我知道如果我希望地址是字对齐
我正在寻找一种表示以下值范围的方法:0 - 18446744073709551615使用少于 8 个字节。 我试过想一些方法可以做到,但没有任何效果。理论上,例如:用一个字节来表示至少2个字节的位序列
我正在尝试通过这种方式将带符号的十六进制数转换为 WORD、DWORD 和 QWORD: #include #include #include int main(void) { printf
我是 z3py 的新手。 我正在对代码进行逆向工程,其中 XMM 寄存器中存储有两个 QWORD。 并且对其执行不同的操作。 假设我必须找到 2 个 qword,p1 和 p2,给出以下等式: x =
我有很多相互继承的对象等等。 默认的 Embarcadero C++ Builder 2009 已将属性中的数据对齐设置为 QWORD。如果我将其更改为 DWORD,我的许多对象的大小都会缩小,因为它
我想知道在任何 SIMD 指令系列中是否可以执行以下操作。 我有一个具有 63 个有效位(从不为负)的 qword 输入。从 LSB 开始的每个连续的 7 位都被混洗对齐到一个字节,左填充为 1(除了
所以我得到了以下内容(例如): 0x00000001000022c4 db "Apple", 0 0x0000000100002347 db "Ducks", 0 在一个程序中
我正在开发 Java 多媒体 IO 项目,并且遇到了一个问题,每当我尝试编写 DWORD 时,结果发现长度是 16 字节而不是 4 字节。我使用以下代码将 4 个字符的字符串转换为 16 位小端字节数
我是一名优秀的程序员,十分优秀!