2014-10-31 134 views
1

在深入研究之前,我正在對shellcode進行試驗,所以我遇到了shellcoders手冊中的一個例子。示例如下:運行shellcode時出現分段錯誤

char shellcode[] = "\xeb\x1a\x5e\x31\xc0\x88\x46\x07\x8d\x1e\x89\x5e\x08\x89\x4 
\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe1\xff\xff\xff\x2f\x62\x69 
\x6e\x2f\x73\x68"; 

int main() { 

int *ret; 
ret = (int *)&ret + 2; 
(*ret) = (int)shellcode; 
} 

shellcode應該產生一個shell。但是,我收到了分段錯誤錯誤。 我編譯程序使用gcc編譯器-fno-stack-protector-z execstack選項。我參加了一個快速瀏覽一下readelf命令,很明顯的是,棧是可執行

GNU_STACK  0x000000 0x00000000 0x00000000 0x00000 0x00000 RWE 0x4 
+0

反引號用於引用代碼,而不是增加重點。 – 2014-10-31 09:32:41

回答

2

ret是一個指針,當你把它聲明它沒有指向任何內存位置。 後來你正試圖通過將2與指針所指向的位置分配一定的參考價值的。(這是互相矛盾的陳述)

ret = (int *)&ret + 2;/* Which is wrong */ 
+0

是的。現在清楚了。這就是爲什麼你總是需要別人來閱讀你寫的東西,因爲他只會看到你每次重新閱讀代碼時都會忽視的錯誤。 – 2014-10-31 09:31:03

+0

我低估了這個答案。問題的代碼是用'shellcode'的地址覆蓋返回地址;這不是偶然的未定義行爲。 (顯然它不應該是便攜式或符合標準的C) – immibis 2014-10-31 09:45:17

+0

@immibis你想回答這個問題嗎? – 2014-10-31 09:57:04

0

我編譯使用「GCC filename.cpp」命令下面的代碼。鈦的編譯沒有錯誤,我希望這會幫助你解決你的疑問。

#include<stdio.h> 

char shellcode[] = "\xeb\x1a\x5e\x31\xc0\x88\x46\x07\x8d\x1e\x89\x5e\x08\x89\x4\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe1\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68"; 

int main() { 

int *ret; 
ret = (int *) ret + 2; //I don't know why you had written this 
ret = (int *)shellcode; 

}