WinExec触发EXCEPTION_ACCESS_VIOLATION:修改Shellcode运行notepad.exe报错
问题分析与修复方案
问题原因
你替换calc.exe为notepad.exe时,采用两次push r9构造字符串,虽RCX指向了正确的字符串起始地址,但存在以下问题:
- 两次8字节
push的栈布局与原代码4字节push逻辑不兼容,间接影响了字符串的可访问性; - 栈中字符串的内存布局因8字节
push出现未预期的对齐问题,导致WinExec访问时触发内存异常; - 生成EXE文件的栈环境与纯Shellcode注入后的环境存在差异,进一步放大了内存访问问题。
修复方案
方案1:调整字符串构造方式
将两次push r9替换为多段4字节push,确保字符串内存布局稳定且符合C风格null终止要求:
; 替换原notepad.exe构造代码 push 0x00657865 ; 压入 'exe\0'(小端序) push 0x2e646170 ; 压入 'pad.'(小端序) push 0x65746f6e ; 压入 'note'(小端序) push rsp pop rcx ; RCX指向字符串起始地址
方案2:生成纯Shellcode而非EXE
原代码为纯Shellcode设计,生成EXE会引入额外栈环境干扰,改用以下命令生成二进制Shellcode:
nasm -fbin w64-exec-calc-shellcode.asm -o shellcode.bin
通过Shellcode注入工具将其注入目标进程运行,避免EXE环境的影响。
方案3:显式确保栈对齐(可选)
在调用WinExec前强制栈16字节对齐,严格符合x64调用约定:
; 在CDQ之后、CALL RDI之前添加 and rsp, -16 ; 强制栈16字节对齐
验证方法
修复后重新汇编,若用EXE方式需确保链接命令正确;若用纯Shellcode,注入到任意64位进程中,应能正常启动notepad.exe。
内容的提问来源于stack exchange,提问作者FAMO4S
相关产品推荐
相关产品推荐

