我可以通过这样做将4个字节压入堆栈:
push DWORD 123
Run Code Online (Sandbox Code Playgroud)
但我发现我可以在push不指定操作数大小的情况下使用:
push 123
Run Code Online (Sandbox Code Playgroud)
在这种情况下,push指令将多少字节压入堆栈?推送的字节数是否取决于操作数大小(因此在我的示例中它将推送1个字节)?
我正在尝试推送一个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) 我似乎有一个有趣的问题,虽然我可能做了一些明显错误的事情.
我的问题是我试图将AAAABBBBCCCC推入堆栈,然后通过stdout打印它们.然而,似乎在我的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
Run Code Online (Sandbox Code Playgroud)
输出AAAABBBB,我认为只有8个字节,实际上是我要求的12个.通过管道传输到输出文件并以hexedit查看时,我注意到它正在显示414141410000000042424242.
我认为 …