BOF 원정대의 Xavius를 잡아보자!

* Xavius 코드


(xavius.c)



xavius의 특징
1. ret 주소에 라이브러리 함수를 사용하지 못한다.
2. 0x08, 0xbf 로 시작하는 주소 또한 ret 주소에 넣을 수 없다.
3. 단.! fgets를 사용한다.

fgets 함수의 특징을 알고 있어 이 문제를 쉽게 풀 수 있었다.
바로 fgets 함수는 입력 버퍼가 있어 그 곳에 입력을 저장한 후 실제 스택 버퍼에 옮긴다.
우리의 입력이 어딘가에 또 저장이 되어있다는 말이다.

사실을 확인해보기위해 strace를 통해 실제 시스템콜과 사용되는 메모리 주소를 확인해보자.



(read 시스템콜)



아래 write() 시스템 콜이 보인다. 그리고 그 바로 위에 어딘가에서 read 해오고 있는 모습을 볼 수 있다.
바로 이곳이 우리가 생각했던 임시 버퍼라는 것을 예상해 볼 수 있다.

그렇다면 진위를 파악하기 위해 gdb를 통해 실제 메모리를 확인해보자!


(임시 버퍼)


우리의 예상대로 0x40015000 주소가 바로 fgets의 임시버퍼였다.

우리는 바로 이곳에 쉘코드를 올리고 이곳으로 eip를 떨굴것이다.
그렇다면 ret 주소에 이 주소를 넣어야한다. ret 주소에 이 주소가 들어갈 수 있는지 확인!


(ret 주소)


ret 주소에 해당 주소를 입력해도 괜찮았다.

이제 이 주소에 Nop코드와 쉘코드를 올려주고 ret 주소에 해당 영역의 주소를 넣어준다.

공격!


(공격!)



(공격 성공)


쉘을 획득 할 수 있었다. :)

+ Recent posts