profile image

L o a d i n g . . .

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"

rp++를 이용해서 구한다.

pop pop pop ret : 0x80484b6

 

 


 

3. Exploit

위의 논리대로 exploit 코드를 작성해보았다.

 

성공적으로 쉘을 획득한 모습이다.

 

 

이 문제의 경우 symbol table이 없어서 디버깅 시 bp가 잘 걸리지 않는다.

이때 해결방법은 text 영역 시작점에 bp를 걸면 똑같이 디버깅 할 수 있는데, 다음 블로그를 참고하였다.

blog.ch4n3.kr/291

 

심볼 없을 때 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
복사했습니다!