C缓冲区中的asm shellcode – 序言
我尝试在C中的缓冲区中构建一个函数,我可以使用gdb进行翻译
push rbp mov rbp,rsp (...) leave ret
至
0x55 0x48 0x89 0xe5 (...) 0xc9 0xc3
所以我写了一个C代码:
int main() { char buffer[]={0x55,0x48,0x89,0xe5,0xc9,0xc3}; void (*j)(void)=buffer; j(); }
但是我的程序似乎在故障“push rbp”(缓冲区中的0x55)崩溃了。你知道为什么吗?
通常的原因是堆栈(存储buffer
位置)不可执行。 主要有两种方法:
- 编译/链接使堆栈标记为可执行(即
gcc -z execstack
) - 在运行时使用
mprotect
来标记代码可执行的页面