1. 문제
NX 만 걸려있어 RTL 문제임을 알 수 있다.
주소를 10진수 형태로 입력하면 그 주소의 내용을 출력해준다.
만약 이중 포인터 값을 넣어주면 또 다시 주소를 출력할 것이다. 여기서 뭔가 leak이 될 것 같은 강한 예감이 든다..!
그리고 메시지를 입력하라고 하고 입력한 메시지를 출력해주는 형태이다.
처음에 주소를 10진수 형태로 입력받고, 16진수로 변환해준 다음 이중포인터인 v8에 저장한다.
그리고 v8을 인자로 하는 See_something 함수가 실행된다.
See_something 함수이다.
입력받은 주소의 내용을 %p 형태로 출력한다.
Print_message 함수이다.
여기서 bof 취약점이 발생한다.
dest 버퍼의 크기는 56 byte 지만, 256 byte 짜리 src를 dest에 복사할 때 입력값 검증을 하지 않기 때문이다.
따라서 bof를 일으켜 ret 값을 실행 가능한 라이브러리 함수인 "system" 함수의 주소로 덮고, RET를 주고, system 함수의 인자로 "/bin/sh"의 주소를 주면 쉘을 얻을 수 있을 것이다.
다만, 이때 ASLR이 적용되어 있음을 고려할 때 라이브러리 함수의 주소를 하나 leak 해서 그것을 통해 libc base address를 얻고, 위에서 필요로 하는 함수들의 offset들을 구해서 문제를 해결할 수 있을 것이다.
-> Lazenca x86 RTL에서 했던 익스코드와 상당히 유사할 것으로 보인다.
2. 문제 해결 과정
RET 전까지 즉, 60 byte 만큼을 dummy 값으로 채우고 RET에 system 함수의 주소를, 그 뒤에 return address를, 그리고 뒤에 "/bin/sh" 주소를 넣어주면 될 듯하다.
system offset
binsh offset
printf offset
3. Exploit
위의 논리대로 exploit code를 짜보았다.
aslr이 걸려있기에 leak 된 printf 주소로 libcbase 주소를 구했다.
그리고 system 함수와 "/bin/sh" offset들을 libcbase에 더해서 system 함수 주소와 "/bin/sh" 주소를 구해 RTL 기법을 이용하였다!
성공적으로 쉘을 획득한 모습이다!!
ASLR과 NX 보호 기법이 걸려있는 상황에서 RTL 을 통해 익스하는 문제였다!
'Wargame > etc' 카테고리의 다른 글
[HITCON training] lab 12 secretgarden (0) | 2021.05.11 |
---|---|
[HITCON training] lab 5 simplerop (0) | 2021.04.12 |
[codegate quals 2018] - BaskinRobins31(basic x64) (0) | 2021.04.04 |
[pliadCTF 2013] - ropasaurusrex(basic x86) (0) | 2021.04.03 |