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 |