#About
[그림 1] - gremlin.c 소스 코드 확인
#Solution
[ + ] 소스 코드 해석
1. buffer라는 배열에 256바이트만큼 선언
2. 조건문을 통해 인자 값을 검사하며 2개가 되지 않을 경우 argv error를 출력 후 종료
3. strcpy 함수를 이용해 argv[1] 즉, 사용자 입력 값을 buffer에 복사한 뒤, buffer를 출력
해당 소스 코드에 있어 3번에 해당하는 strcpy 함수는 입력 값의 길이 검증을 하지 않기 때문에 BOF가 발생할 수 있음
[그림 2] - buffer 할당 크기 확인
buffer의 할당 크기 확인 결과, 0x100 즉 256만큼을 할당함을 확인할 수 있고 더미는 존재하지 않는다 따라서 스택의 구조는 아래와 같다
| buffer (256) | EBP (4) | RET (4) |
스택 구조는 위와 같고 공격 페이로드는 RET 전까지 buffer에 셸코드와 \x90을 260바이트 만큼 채운 뒤, RET 주소를 buffer의 시작으로 덮어 씌우는 것이다
[그림 3] - BreakPoint 설정
strcpy 함수까지 실행하기 위해 0x804846b에 중단점을 걸었으며 아래와 같이 페이로드를 작성해 buffer의 시작주소를 알아보았다
[그림 4] - buffer시작 주소 확인
buffer는 0xbffff908부터 시작함을 확인했으며 공격에 사용할 셸코드는 총 길이 24byte이며 아래와 같다
\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80
따라서 공격 페이로드는 | \x90 (100) | 셸 코드 (24) | \x90 (136) | buffer 시작주소 (4) | 가 되며 아래와 같이 셸 획득을 확인할 수 있다
[그림 5] - 셸 획득
또한 아래와 같이 파이썬으로 페이로드를 작성할 수 있다
[그림 6] - Payload Using Python
[그림 7] - 셸 획득
'Wargame' 카테고리의 다른 글
[Lord of Buffer Overflow] Cobolt > Goblin (0) | 2017.11.17 |
---|---|
[Lord of Buffer Overflow] Gremlin > Cobolt (0) | 2017.11.17 |
[Cresendo] File Delete Problem 02 (0) | 2017.11.16 |
[Cresendo] File Delete Problem 01 (0) | 2017.11.16 |
[Cresendo] Hidden File Problem 01 (0) | 2017.11.15 |