#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

+ Recent posts