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




+ Recent posts