2014-04-30 19 views
0

我尝试建立在C. 用gdb一个缓冲的功能,我可以翻译ASM的shellcode在C缓冲区 - 序幕

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(); 
} 

但我的计划似乎在按照压(在缓冲区0x55的)“推RBP” 你千牛崩溃为什么?

+0

碰撞怎么样?..... –

+1

你需要提供**很多**更多信息。什么是架构和操作系统?数据空间是否可执行?你需要做什么特别的事情来保证缓存一致性吗? –

回答

2

通常的原因是堆栈(您的buffer的存储位置)不可执行。有主要围绕两个方面:

  1. 编译/链接使得堆栈被标记为可执行文件(即gcc -z execstack
  2. 使用mprotect在运行时在您的代码是可执行的,以纪念页面
+0

现在它的作品谢谢你。 – user2199104