bof 원정대의 golem을 잡아보자!

* 소스코드 분석



(golem.c)


...! 스택영역을 사용해야하는데 버퍼부터 스택 밑바닥까지 싹 초기화 시킨다.

기존의 방법으로는 접근이 안된다... 그래도 한번 실화인지 눈으로 체크해보자.



(스택 초기화)


우리가 쓰던 그리고 찾아내었던 구석구석 0으로 전부 초기화가 되었다.

여기서는 LD_PRELOAD를 제외하고는 방법이 없었다..

LD_PRELOAD란 유닉스계열에서 전역후킹을 위한 방법이다. 

예를 들어 간단한 LD_PRELOAD를 이용한 getuid 후킹 파일을 만들어보겠다.



(hook.c 파일)


getuid를 후킹하려면 그 원형과 똑같은 포멧의 함수여야한다.
return은 7777로 후킹이 되었는지 확인해본다. getuid 함수를 호출할때 이 파일이 불려나가 일을 할 것이다.

컴파일을 해준다.



(hook.so)


컴파일 방식이 조금 다르다.

그 후 export!


(export)



이제 getuid함수가 호출되면 내가 만든 hook.so가 일을 할 것이다. getuid가 불리는 대표적인 명령어 id를 사용해 보겠다.


(id 명령어)



id를 사용해보니 uid 가 7777로 나온다. 바로 내가 만든 so 파일이 일을 한 것이다.

그렇다면 이걸 여기서 어떻게 이용한단 말인가?...
물론 여기서 후킹을 이용해 my-pass 명령을 실행하여 답을 알아내는 방식이 있지만 그 방법은 불법이므로 정석대로 가볼것이다!

gdb를 통해 메모리 낮은 쪽을 찬찬히 훑다보면 LD_PRELOAD로 export한 내용이 담겨있는 것을 볼 수 있다.



(hook파일)



이 것을 이용할 것이다.
바로 hook파일에 링크를 걸어 바로 저 위치에 쉘코드를 올리고 ret주소로 저 주소를 입력하는 것이다!!!!

늘 그렇듯 경로 생성!



(경로 생성)



생성 후! 링크를 걸어준다. 바로 내가 만든 후킹파일에!


(링크 생성)



이제 export해준다.


(export)



이제 내가 건 링크 파일이 스택영역에 담길 것이고 즉 쉘코드가 올라갈 것이다.


(메모리 상황)


짠!
내가 넣은 Nop코드와 쉘코드가 보인다. 이제 Nop영역의 아무 주소나 하나 골라서 ret주소에 입력해주면 공격에 성공하게 된다.




(공격 성공!)


쉘 획득!


'WarGame > 500 Project' 카테고리의 다른 글

(29/500) Lord of the BOF - bugbear  (0) 2017.06.20
(28/500) Lord of the BOF - darkknight  (0) 2017.06.20
(26/500) Lord of the BOF - skeleton  (0) 2017.06.20
(25/500) Lord of the BOF - vampire  (0) 2017.06.20
(24/500) Lord of the BOF - troll  (0) 2017.06.20

+ Recent posts