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位置)不可执行。 主要有两种方法:

  1. 编译/链接使堆栈标记为可执行(即gcc -z execstack
  2. 在运行时使用mprotect来标记代码可执行的页面