2014-04-30 18 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