#About


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




#Solution


[ + ] 소스 코드 해석


1. 외부 다른 소스파일에 있는 environ 포인터 변수 사용


2. buffer라는 배열에 40바이트 및 변수 i 선언


3. 조건문을 통해 인자 값을 검사하며 2개가 되지 않을 경우 argv error를 출력 후 종료


4. 반복문을 이용하여 환경변수에 담긴 값의 길이만큼 메모리에서 초기화


5. 조건문을 통해 사용자 입력 값 중 48번째 바이트가 \xbf가 아니면 stack is still your friend.를 출력하고 종료


6. 사용자 입력 값을 buffer에 복사 후 buffer에 들어있는 사용자 입력 값 출력


7. memset 함수를 이용하여 buffer 값 전부 초기화



[그림 2] - 스택 할당 사이즈 확인


i 4바이트와 buffer 40바이트로 인해 스택에는 총 44바이트의 공간이 할당되었으며 스택 구조는 아래와 같다


| i (4) | buffer (40) | EBP (4) | RET (4) |


따라서 페이로드는 RET 전까지의 44바이트를 \x90과 셸코드로 채운 뒤 RET 주소를 buffer의 시작주소로 덮어 씌워 줄 것이며 사용할 셸코드는 아래와 같다


\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80


위 셸코드는 24바이트이며 buffer의 시작주소를 구하기 위해 아래와 같은 과정을 거쳤다


[그림 3] - BreakPoint 설정


strcpy 함수까지 실행시키기 위해 0x80485c2에 중단점을 걸었고


아래와 같이 임의의 페이로드를 작성한 뒤 메모리를 살펴 보았더니 buffer의 시작주소를 확인할 수 있었다


[그림 4] - buffer 시작 주소 확인


0xbffffc37이 buffer의 시작주소이며 해당 주소를 RET 주소에 덮음으로써 문제를 해결할 수 있고 아래는 공격 페이로드이다


| \x90 (20byte) | 셸 코드(24byte) | buffer의 시작주소 (4byte) |


[그림 5] - 셸 획득



+ Recent posts