
1. 문제
NX bit 만이 걸려있음을 알 수 있다.
NX bit + ASAL이 걸려있는 상황이다.
파일을 실행해보니 단순히 입력을 받고, "WIN"을 출력한다.
다음은 ida로 까본 모습이다. main이 상당히 심플하다.
read 함수로 입력을 받는데, 버퍼 크기보다 더 크게 입력받아 overflow가 발생한다.
우리의 목표는 system 함수로 binsh을 실행시키는 것이다.
그런데, ASLR로 인해 system 함수, binsh의 주소를 모두 모르고 문제에서 주소가 leak 되지도 않는다.
이런 상황에선 어떻게 쉘을 획득할 수 있을까?
lazenca rop x86에서 적용했던 기법을 생각할 수 있다.
일단 우리가 이용할 수 있는 것은 read, write 함수이다.
-> gadget을 이용해 위 함수들을 연속으로 호출하며 쉘을 실행시키면 된다.
1. read 함수를 통해 쓰기 가능한 영역에 binsh을 입력받아 저장한다.
2. write 함수를 통해 read_got(고정된 주소)를 leak 한다.
3. leak 된 주소를 가지고 system 함수의 주소를 구할 수 있는데, read 함수로 read_got에 system 함수의 주소를 입력받아 overwrite한다.
4. read 함수를 호출하면 system 함수가 대신 호출되며 쉘을 획득할 수 있을 것이다.
2. 문제 해결 과정
이제 그럼 필요한 것들을 구해보자.
1. read, write 함수의 got, plt
write_plt : 0x804830C
read_plt : 0x804832C
ida에서 구한 plt 주소를 가지고 read, write 함수의 got 주소를 구했다.
write_got : 0x8049614
read_got : 0x804961C
2. 쓰기 가능한 영역
objdump -h ~/Downloads/ropasaurusrex
bss 영역의 크기가 8바이트라 bss 영역을 사용해보자(.dynamic 영역이나 .got 영역을 이용해도 된다)
writableArea = 0x8049628
3. read_system offset
read_system offset = 0x9ae50
4. gadget(pop pop pop ret)
/rp-lin-x86 -f ./ropasaurusrex -r 4 | grep "pop"
pop pop pop ret : 0x80484b6
3. Exploit
위의 논리대로 exploit 코드를 작성해보았다.
성공적으로 쉘을 획득한 모습이다.
이 문제의 경우 symbol table이 없어서 디버깅 시 bp가 잘 걸리지 않는다.
이때 해결방법은 text 영역 시작점에 bp를 걸면 똑같이 디버깅 할 수 있는데, 다음 블로그를 참고하였다.
심볼 없을 때 gdb 디버깅
가끔씩 포너블 문제를 풀다보면 이상하게 Break Point가 걸리지 않는 경우가 있다. 대표적으로 'ropasaurusrex' 문제가 있다. 이런 문제를 디버깅하려고 할 때는 다음과 같은 화면이 뜬다. ch4n3@ip-172-31-0-
blog.ch4n3.kr
'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 |
[HITCON training] lab4 ret2libc (0) | 2021.03.21 |