#About


[그림 1] - goblin.c 소스 코드 확인




#Solution


[ + ] 소스 코드 해석


1. buffer라는 배열에 16바이트 만큼 선언


2. gets 함수를 통해 buffer에 적힌 사용자 입력 값을 읽어들임


3. printf 함수를 통해 사용자 입력 값이 담긴 buffer 출력


gets 함수는 EOF 또는 라인 개행 문자가 나올 때 까지 읽어들이며, EOF 또는 라인 개행 문자를 읽어 들이면 해당 문자를 NULL BYTE로 바꾼다. 


즉, gets함수는 사용자의 입력에 있어 엔터키를 누르기 전 까지 사용자의 입력 값을 검증하지 않고 읽어들인다


[그림 2] - buffer 할당 크기 확인


buffer 할당 크기 확인 결과, 16 즉 0x10만큼 할당함을 확인할 수 있고 더미는 존재 하지 않는다 따라서 스택의 구조는 아래와 같다


| buffer (16) | EBP (4) | RET (4) |


스택 구조는 위와 같고 페이로드는 RET 전까지 buffer + EBP인 20바이트를 임의의 값으로 채운 뒤 RET 주소를 환경변수의 시작으로 덮어 씌울것이다


[그림 3] - 셸 코드가 담긴 환경변수 SHELL 추가


위와 같이 100개의 \x90과 24바이트의 셸코드가 담긴 환경변수 SHELL를 만들었으며 사용된 셸코드는 아래와 같다


\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 코드


환경변수 SHELL의 시작 주소를 확인하기 위해 위와 같이 C 코드를 작성해 주었으며 그 결과 값은 아래와 같다


[그림 5] - 환경변수 SHELL의 주소 값 확인


따라서 공격 페이로드는 | \x90 (20byte) | SHELL 주소 | 가 되며 아래와 같이 페이로드를 작성해주었을 때 셸의 획득을 확인할 수 있다


[그림 6] - 셸 획득




#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] - 셸 획득



#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