#About


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




#Solution


[ + ] 소스 코드 해석


사용자 정의 함수 DO , GYE, GUL, YUT, MO가 있으며 strchr 함수를 통해 전달되는 인자 값에 라이브러리 영역을 의미하는 \x40이 포함되면 


You cannot use library를 출력 후 종료하며 또한 타입 캐스팅을 통해 addr에 저장 된 값이 RET 영역에서의 DO의 주소 값이여야만 한다. 


또한 memset 함수를 이용하여 ret 이후 100바이트 만큼을 제외한 영역을 모두 0으로 초기화 하며, LD_ 환경변수의 이용을 제한한다


이번 문제를 해결하기 위해서는 사용자 정의 함수 MO를 실행시켜 system의 인자로 /bin/sh를 넘겨주는 것이며 


이를 행하기 위해선 RTL Chaining 기법을 사용하여 DO > GYE > GUL > YUT > MO 순서대로 함수를 실행시켜야 한다


먼저 문제에서 기본적으로 행해져야하는 스택의 구성은 다음과 같다


| Buffer | SFP | DO |


위와 같은 스택 구성을 가질 때, main 함수가 종료되면서 pop eip & jmp eip 명령으로 인해 DO의 주소로 분기하게 되며 


또한 DO가 실행되고 프롤로그 과정인 push ebp & mov esp, ebp가 시작 되면 다음과 같은 스택 구조가 된다


| Buffer | SFP | SFP |


이 후 DO 함수의 에필로그 과정을 거치게 되면 결국 SFP에 담기는 값은 RET 값이되며 이는 다음으로 넘어가야하는 GYE 함수의 주소가 되어야 한다


따라서 RET 값에 연속으로 다음 함수의 주소를 넣어주어야 하며 함수 들을 차례 대로 실행하기 위해서는 아래와 같은 스택 구조가 된다


| Buffer | SFP | DO | GYE | GUL | YUT | MO |


마지막으로 MO가 실행되면 system 함수가 실행되며 이에 필요한 인자인 /bin/sh를 전달해 주어야하며 최종적으로 스택의 구조는 아래와 같이 구상 된다


| Buffer | SFP | DO | GYE | GUL | YUT | MO | Dummy | &"/bin/sh" | /bin/sh |


스택의 구상 및 예상 페이로드를 구해주었으니 이에 필요한 함수의 주소를 모두 구해 주어야한다


[그림 2] - 함수 주소 확인


또한 인자인 /bin/sh가 메모리 상에서 위치하는 주소를 확인하기 위해 아래와 같이 임의의 페이로드를 삽입 해 코어 파일을 생성해 주었으며


[그림 3] - core dump 파일 생성


생성된 코어 파일의 분석을 통해 /bin/sh의 문자열의 위치를 살펴보았더니 아래와 같이 0xbffffa58에 위치하는 것을 확인할 수 있다


[그림 4] - /bin/sh 문자열의 시작 위치 확인


따라서 최종적인 페이로드는 아래와 같으며 셸을 획득할 수 있다


| Buffer | SFP | DO | GYE | GUL | YUT | MO | Dummy | 0xbffffa58 | /bin/sh |


[그림 5] - 셸 획득



+ Recent posts