#About
[그림 1] - cobolt.c 소스 코드 확인
#Solution
[ + ] 소스 코드 해석
1. buffer라는 배열에 16바이트 만큼 선언
2. 조건문을 통해 인자 값을 검사하며 2개가 되지 않을 경우 argv error를 출력 후 종료
3. strcpy 함수를 이용해 argv[1] 즉, 사용자 입력 값을 buffer에 복사한 뒤, buffer를 출력
이전문제와의 차이점이라면 buffer의 크기가 256에서 16으로 줄었다는 것이며 이는 환경변수를 이용하여 문제를 해결할 수 있다
[그림 2] - buffer 할당 크기 확인
buffer의 할당 크기 확인 결과, 16 즉 0x10만큼 할당함을 확인할 수 있고 더미는 존재하지 않는다 따라서 스택의 구조는 아래와 같다
| buffer (16) | EBP (4) | RET (4) |
스택 구조는 위와 같고 페이로드는 RET 전까지 buffer + EBP인 20바이트를 임의의 값으로 채운 뒤 RET 주소를 환경변수의 시작으로 덮어 씌울것이다
[그림 3] - 셸코드가 담긴 환경변수 SHELLCODE 추가
위와 같이 100개의 \x90과 24바이트의 셸코드가 담긴 환경변수 SHELLCODE를 만들었으며 사용된 셸코드는 아래와 같다
\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80
[그림 4] - 환경변수 주소 확인을 위한 C 코드
환경변수 SHELLCODE의 시작 주소를 확인하기 위해 위와 같이 C 코드를 작성해 주었으며 그 결과 값은 아래와 같다
[그림 5] - 환경변수 SHELLCODE의 주소 값 확인
따라서 공격 페이로드는 | \x90 (20byte) | SHELLCODE 주소 | 가 되며 아래와 같이 페이로드를 작성해주었을 때 셸의 획득을 확인할 수 있다
[그림 6] - 셸 획득
'Wargame' 카테고리의 다른 글
[Lord of Buffer Overflow] Goblin > Orc (0) | 2017.11.18 |
---|---|
[Lord of Buffer Overflow] Cobolt > Goblin (0) | 2017.11.17 |
[Lord of Buffer Overflow] Gate > Gremlin (0) | 2017.11.17 |
[Cresendo] File Delete Problem 02 (0) | 2017.11.16 |
[Cresendo] File Delete Problem 01 (0) | 2017.11.16 |