농소
The Lord Of The BOF // nightmare -> xavius 본문
분석 해 봅시다
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코드를 넣고 쉘을 넣어주면
쉽게 쉘이 떨어진것을 볼 수 있습니다.
'Wargame > The Lord Of The BOF' 카테고리의 다른 글
The Lord Of The BOF // xavius -> death_knight (0) | 2018.02.22 |
---|---|
The Lord Of The BOF // succubus -> nightmare (0) | 2018.02.22 |
The Lord Of The BOF // zombie_assassin -> succubus (0) | 2018.02.21 |
The Lord Of The BOF // assasin -> zombie_assassin (0) | 2018.02.21 |
The Lord Of The BOF // giant -> assasin (0) | 2018.02.21 |