BOF 원정대의 Assassin을 잡아보자!

* 소스코드


(assassin.c)



assassin의 특징이다.
1. 버퍼 40바이트
2. ret주소에 스택주소 입력 불가.
3. ret주소에 라이브러리주소 입력 불가.
4. 버퍼 초기화

바로 전 문제까지 ret주소에 라이브러리 함수를 이용하여 쉘을 획득해왔다.
하지만 이제 라이브러리 함수를 사용하지 못한다??
-> 잘보면 ret주소만 체크하고 있다. 그러므로 우리는 ret주소 그 옆에 주소(4바이트 높은주소)에 넣고 인자를 구성하여 사용할 것이다.

그렇다면 문제는 어떻게 ret주소에 무엇을 넣어야 eip가 그 다음 4바이트를 꺼내갈까?
바로 ret 명령을 이용하는 것이다!

ret 명령은 pop eip 로 이루어져있다. main 함수의 ret 명령 때 ret주소에 적혀있는 주소를 꺼내어 그 곳의 명령을 실행한다. 즉 eip를 그 주소에 있는 것을 가져간다.
여기서 트릭을 쓰는 것이다. ret 주소에 ret명령어를 넣으면?
-> ret 명령이 일어날 때 ret명령의 주소를 가져가게 된다. 그러면 eip에는 ret 명령 주소가 들어가있고 ret명령을 실행시킬 준비가 되있다. 그러면서 pop 이기 때문에 esp가 증가하게 된다.(다음 4바이트를 가리키게 된다.) 여기서 ret 명령을 실행하게 되면 우리가 준비해둔 라이브러리 함수를 만나고 그 주소를 꺼내어 실행하게 되는 것이다.

이런 트릭을 이용해 ret 슬레이딩이라고도 한다. 여기서는 4바이트만 내려가 주는 용도로 사용하여 ret주소 검열을 우회하여 쉘을 획득할 것이다.

필요한 것
1. system 주소


(system 주소)



2. /bin/sh 문자열


(/bin/sh 주소)



3. ret 명령 주소


(ret 명령 주소)



필요한 주소들은 전부 구했다. 이제 gdb에서 메모리에 잘 들어갔는지 체크해보자.
(돌다리도 두들겨보라)


(gdb 실행)



(체크)



0x0804851e (ret명령)이 ret주소에 잘 들어갔고 그 뒤로 system 주소가 잘 들어간 것을 체크!

공격!


(공격 성공)



쉘을 획득하였다. :)


+ Recent posts