농소

The Lord Of The BOF // nightmare -> xavius 본문

Wargame/The Lord Of The BOF

The Lord Of The BOF // nightmare -> xavius

농소 2018. 2. 22. 01:57






분석 해 봅시다

LD_PRELOAD도 못쓰고 eip를 제외한 스택메모리를 전부 초기화합니다.

또, 스택메모리를 못쓰게 막았고=("\bf") text영역도 못쓰게 막았네요=("\x08")

그리고 leave, ret 명령어가 있는 함수들이 있으면 강제로 종료되게 만들었습니다.

여기서 의문점은 왜 40으로 막질 않고 궂이 이런식으로 막아놨을까 입니다.

즉, 저렇게 막아도 40으로 시작하는 사용가능한 메모리영역이 있다는 겁니다.


그리고 여지껏 쓰지않았던 fgets를통해 입력값을 받습니다.


먼저 fgets함수의 원형을 보면



char *fgets(char *s, int size, FILE *stream);

첫번째 인자로 옮길버퍼

두번째로 옮길 사이즈

세번째로 파일 포인터입니다



fgets는 보통 특정파일 내용을 읽어들일때 사용하고 보통 세번째 인자에 파일포인터가 들어갑니다.

여기서는 0(=stdin)을 쓰고있네요


fgets의 취약점을 설명하자면 

우선 fgets는 파일내용을 두번째인자의 사이즈에 맞게 읽어들입니다.

그런데 여기서 이 사이즈에 맞게 읽어들일때 어떻게 읽어들일까요?

 

만약 256바이트 만큼 사이즈를 정하였지만 컴퓨터 입장에서는 사용자가 256바이트 만큼만 입력할 지는 모른다는 겁니다.

즉 사용자가 엔터를 입력할 때 까지는 사용자가 얼마나 입력을 할지 모르니 일단 어딘가에 메모리를 저장하여

 그후에 사이즈에 맞게 짤라서 해당 버퍼에 저장을 하게 됩니다.


자 이제 그 어딘가의 메모리를 찾아야 겠죠?

fgets는 라이브러리 함수 이므로 라이브러리 공간 어딘가에 존재할 것입니다. 


strace를 통하여 알아봅시다.



strace를 통하여 0x40015000번지부터 읽어 들이는것이 보입니다.


gdb를 통하여 해당 주소에 값이 잘 들어가는지 확인해 볼까요?



네 정상적으로 해당 주소에 값이 들어있는것이 확인됩니다 마지막 엔터 0a까지 들어가네요

또 fgets는 데디케이터(null, \x20, white space)가 들어갈 수 있습니다.

왜냐하면 gets는 null문자 까지 읽어들이지만

fgets는 그냥 입력한 내용을 다 가져오기에 가능합니다.


잠시 확인해 보자면

c파일에 편집기로 dumpcode를 추가로 넣어 확인해보면

dumpcode(0x40015000, 200 );

[nightmare@localhost nightmare]$ (python -c 'print "a" * 10 + "\x00" + "b" *10 ';cat) |./a.out

aaaaaaaaaa

0x40015000  61 61 61 61 61 61 61 61 61 61 00 62 62 62 62 62   aaaaaaaaaa.bbbbb

        ----

0x40015010  62 62 62 62 62 0a 00 00 00 00 00 00 00 00 00 00   bbbbb...........

0x40015020  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................

0x40015030  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................

0x40015040  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................

0x40015050  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................

0x40015060  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................

0x40015070  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................

0x40015080  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................

0x40015090  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................

0x400150a0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................

0x400150b0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................

0x400150c0  00 00 00 00 00 00 00 00                                    ........


이런식으로 데디케이트가 그대로 들어갑니다.


이제 메모리가 어디에 위치해 있는지 알아냈으니 충분히 nop코드를 넣고 쉘을 넣어주면



쉽게 쉘이 떨어진것을 볼 수 있습니다.