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 주소에 해당 영역의 주소를 넣어준다.
공격!
(공격!)
(공격 성공)
쉘을 획득 할 수 있었다. :)
'WarGame > 500 Project' 카테고리의 다른 글
(37/500) Suninatas - Binary(9) (0) | 2017.06.27 |
---|---|
(36/500) Lord of the BOF - death_knight (0) | 2017.06.27 |
(34/500) Lord of the BOF - nightmare (0) | 2017.06.23 |
(33/500) Lord of the BOF - succubus (0) | 2017.06.23 |
(32/500) Lord of the BOF - zombie_assassin (0) | 2017.06.23 |