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



+ Recent posts