#About


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




#Solution


해당 문제는 아래의 두 그림처럼 스택 영역에서의 실행권한이 없는 NX bits 설정과 메모리 영역을 랜덤하게 바꾸는 ASLR이 설정되어 


있다는것 이외에는 기본적인 BOF 문제이며, 문제를 해결하기 위해선 hint에서 주어진 RET sleding과 RTL 을 이용해야할 것 같다


[그림 2] - NX bits 설정


(스택 영역에 실행을 의미하는 x 권한이 없는 것을 확인할 수 있음)


[그림 3] - ASLR 설정


( [그림 2]와 [그림3]의 메모리 주소를 살펴보면 ASLR의 영향으로 메모리 주소가 다른것을 확인할 수 있음 )


RET Sleding을 사용하기 전, RTL에 사용할 함수는 execl이며 execl의 함수의 특성상 인자의 끝이 NULL로 끝나야한다 따라서 아래와 같이 


ret에 중단점을 걸어 둔 뒤, 두 번의 실행을 통해 비교분석 결과, 변하지 않는 부분을 다수 찾을 수 있지만 그 중 아래와 같이 0x008caff4를 확인할 수 있다


[그림 4] - 두 번의 실행을 통한 결과 비교


또한 0x008caff4는 아래와 같이 NULL값을 가지는 것을 확인할 수 있다


[그림 5] - NULL 값 확인


따라서 RET Sleding 기법을 통해 7번의 ret과 그 후 오게 될 4바이트는 execl 함수의 주소가 되어야 하며, 


0x008bad44에 담긴 값인 0x008cad3c는 execl 함수가 실행할 파일명이 된다


[그림 6] - 링크 파일 생성


실행할 주소인 0x008cad3c를 위와 같이 셸을 띄우는 코드를 작성 후 링크파일을 걸어주고 


마지막으로 페이로드에 필요한 execl함수와 ret의 주소를 아래와 같이 구해주었다


[그림 7] - execl 함수 주소 확인


[그림 8] - ret 명령 주소 확인


모두 구해주었으니 최종 페이로드는 | buffer 260 | ret 4 * 7 | execl | 이 될 것이고 아래와 같이 셸을 획득할 수 있다


[그림 9] - 셸 획득

+ Recent posts