如何在NASM中推送64位int?

use*_*296 4 assembly x86-64 nasm

我正在尝试推送一个64位整数但是在组装NASM时似乎想把它看成是一个DWORD而不是QWORD.

我正在使用ASM来创建shellcode,我需要将64位DLL注入到64位进程中.第一个QWORD是旧指令指针,第二个是包含DLL地址的地址,第三个是LoadLibrary的地址.占位符在运行时填充.

section .text
global _start   

_start:
BITS 64
PUSH QWORD 0xACEACEACACEACEAC
PUSHFQ
push rax
PUSH QWORD 0xACEACEACACEACEAC
MOV RAX, 0xACEACEACACEACEAC
CALL RAX
pop RAX
POPFQ
RETN
Run Code Online (Sandbox Code Playgroud)

Jes*_*ter 15

没有push imm64指示.作为解决方法,您可以执行以下操作之一:

  1. 通过注册: mov rax, 0xACEACEACACEACEAC; push rax
  2. 通过记忆: push qword [rel foo]
  3. 把它写成两部分:push dword low32; mov dword [rsp+4], high32sub rsp,8; mov dword [rsp], low32; mov dword [rsp+4], high32
  4. 如果您的直接允许,请使用sign-extension

  • 无论如何,似乎没有办法用 32 位操作数大小对“push”进行编码。(即使有寄存器源)。英特尔的insn参考手册说你可以使用“REX.W”,但它不能与NASM/YASM/GNU一起工作,或者在真正的CPU上工作(通过粘贴“db 0x40”(REX.W=0)或`db 0x48` (REX.W=1) 在 `push rdx` 前面)。在 Intel SnB 上进行测试,同时使用 GDB 进行单步执行。 (3认同)
  • 是否可以使用两个推送命令,第一个推送下部 32,第二个推送上部。这似乎是唯一可行的解​​决方案。 (2认同)
  • 此外,方法**1**几乎肯定是最好的,就整体性能和代码大小而言.`push m32`(**2**)在Intel和AMD上解码为2 uop,负载可能会在缓存中丢失.(假设**4**不可用.) (2认同)