LOB_13.darkknight->bugbear

해킹/LOB 2016. 1. 29. 19:16


이제 스텍으로 리턴할 수 없어졌다.

스텍이 나를 배신했단다..ㅎㅎ

윗쪽에 힌트를 보니 RTL이라고 써져있다 Return To Library 즉 라이브러리로 리턴하는 문제이다.


리턴주소를 변조할수는 있되 \xbf가 첫바이트로 들어가서는 안되니 0x40으로 시작하는 라이브러리 영역으로 점프를 하면 된다.

그중에서도 나는 쉘을 실행시키고 싶으니 system함수로 점프해서 인자로 "/bin/sh"를 전달해주면 되겠다.


그러기위해서는 system 함수의 주소와 "/bin/sh"의 주소가 필요하겠다.

"/bin/sh"를 스텍에 넣어주는 방법도 생각했으나 뒤에 널바이트가 필요하다. 페이로드의 맨 뒤에 널과 함께 넣어줘도 될것 같기는 하지만 더 나은 방법이 있어서 패스했다.





이런식으로 라이브러리를 로딩시키기 위해 프로그램을 실행시킨 뒤

p system을 해서 system 함수의 주소를 찾았다.

그리고 그 뒷주소를 검색해보니 저런식으로 얼마 지나지 않아 /bin/sh라는 문자열의 주소가 있는것을 볼 수 있었다.

라이브러리에 저렇게 편리하게 써먹을 수 있는 문자열이 박혀잇는 이유는 system 함수가 /bin/sh -c 명령어 이런식으로 실행되기 때문이란다. 즉 언제나 저 위치에 "/bin/sh"라는 문자열이 박혀있을 수밖에 없다.


아무튼 그렇게 해서 찾은 주소는

system 함수의 주소: 0x40058ae0

"/bin/sh"의 주소:0x400fbff9


------------------------------------------------------------------------------------------------------------------------------

에... 여기서 문제를 간단하게 풀려면 "a"*44+"\x40058ae0"+"bbbb"+"\x400fbff9" 이런식으로 페이로드를 작성하면 된다.

이렇게 하면 프로그램에서 40058ae0으로 리턴한 다음 system 함수의 프롤로그 과정에서 ebp가 "a"*44가 끝나는 부분으로 맞춰진다.

그리고 거기서 8바이트 뒤가 인자를 전달받는 부분이므로 \x400fbff9가 인자로 들어가서 쉘을 실행시켜줄 것이다.

이게 사실 정답이고 가장 합리적으로 이 문제를 푸는 방법이다. 페이로드까지 작성하자면

./bugbear `python -c 'print "a"*44+"\xe0\x8a\x05\x40"+"bbbb"+"\xf9\xbf\x0f\x40"'`

-------------------------------------------------------------------------------------------------------------------------------


음 하지만 나는 fake ebp도 연습할겸 리턴주소 뒷부분(bbbb~)을 채우지 않고 풀어봤다. 아마 나중에 버퍼길이 제한이 있는 문제가 나오면 요긴하게 써먹을 수 있을 것이다.

fake ebp는 함수가 실행될때 ebp 주소를 착각하도록 하는 방식이다.

전에도 다뤘지만 SFP에 들어있는 내용이 leave ret 하면서 ebp로 들어가게 된다.

보통은 이렇게 SFP만 바꿔주면 되지만 0x40058ae0같이 함수의 첫부분으로 이동하게 되면 함수의 프롤로그(push ebp, mov ebp, esp)가 실행되면서 ebp가 esp를 기준으로 다시 맞춰져버린다.

그렇기 때문에 여기서는 프롤로그 3바이트를 뛰어넘어 0x40058ae3으로 리턴할 것이다.

그때 ebp가 가르키는값 +8 부분에 "/bin/sh"의 주소인 0x400fbff9가 들어있으면 되겠다.

즉 스택안에 0x400fbff9라는 값을 집어넣어주고 SFP를 저 값이 들어있는 주소 -8로 조작해주면 된다.




gdb에서 일단 대충 집어넣고 실행시켰다. 블록지정한 0x62626262가 /bin/sh의 주소가 들어갈 부분, 0x63636363과 0x64646464가 각각 SFP와 리턴이 들어갈 부분이다.

어차피 gdb에서 실행했을때와 주소가 다를게 뻔하므로 나와서 다시 실행시킨 뒤 core 파일을 분석해서 정확한 주소를 알아보는게 낫겠다.



똑같이 실행을 시켜준후에 코어파일을 보자.




방금전 buffer가 시작되었던 주소 근처를 뒤져보니 역시나 약간 밀린채로 들어있다.


이제 저 0x62626262부분에 "/bin/sh"가 들어있는 주소인 0x400fbff9를 넣어주고 

SFP에는 0x62626262의 주소 -8인 0xbffffa8c를 넣어준다.

마지막으로 리턴주소는 system함수의 주소 +3(프롤로그 생략) 부분인 0x40058ae3을 넣어주면 된다.


그러면 system함수는 fake ebp인 0xbffffa8c의 8바이트 뒷쪽에서 문자열을 찾을것이고 그부분에 0x400fbff9가 들어있으니 "/bin/sh"가 전달될 것이다.


이제 이 시나리오에 맞게 페이로드를 구성하면

./bugbear `python -c 'print "a"*36+"\xf9\xbf\x0f\x40"+"\x8c\xfa\xff\xbf"+"\xe3\x8a\x05\x40"'`

이렇게 되겠다. 시도해보자.




성공이다.

끝- 하고싶지만 RTL에 들어가면서 \x90을 사용했던 스텍 리턴에 비해 정확한 주소를 요구하게 되면서... bash2와 관련된 예상하지 못했던 심각한 삽질을 요하는 문제가 생겼었다. 주소가 계속 바뀌고 되던 페이로드가 안되는 현상이 있다면 다음 포스팅을 참고하자.

http://satanel001.tistory.com/99

끝-


'해킹 > LOB' 카테고리의 다른 글

LOB_14.bugbear->giant  (0) 2016.01.31
LOB_번외.bash2의 함정.  (0) 2016.01.29
LOB_12.golem->darkknight  (0) 2016.01.28
LOB_번외.my-pass파일을 공격해서 한번에 마지막까지 뚫기  (0) 2016.01.27
LOB_11.skeleton->golem  (0) 2016.01.27
Tags
Social