상세 컨텐츠

본문 제목

14. bugbear -> giant

Pwnable Write-Up/02.hackerschool L.O.B

by RACC8N 2020. 3. 11. 10:06

본문

execve_addr를 사용해야 한다. 첫번째 popen으로 libc의 주소를 얻어오고, 두 번째 popen으로 libc에서의 execve의 offset을 얻어온다.

 

libc start + execve offset = execve_addr 임을 알 수있다.

 

libc 주소를 얻으려하는데 코드에서는 ldd /home/giant/assassin으로 되어있다. 아직 giant에 대한 권한이 없으므로 

/home/bugbear/giant로 고쳐서 얻어보자.  libc의 주소는 모두 같다. 

0x40018000이다.  이제 libc.so.6에서의 execve의 offset을 찾아보자. 

00091d48이다.  그러면 execve의 실제 주소는 0x40018000+00091d48인 0x400a9d48이다.

 execve의 인자로는 파일이름, argv, env가 오게된다. exploit할 때 배열을 인자로 보내려면, 필요한 배열요소들의 주소를 다 찾아야하므로 어렵다. 

 

따라서 여러 함수를 호출하는 방법으로 해보겠다.

 

BUF + SFP + EXEC + SYS + EXIT + /BIN/SH

 

다음과 같이 payload를 구성하면, exec가 인자 exit, /bin/sh를 갖고 실행되고, exit함수로 인해 바로 종료된다. 

 

종료되면 바로 sys함수가 호출되고, 이때 인자 /bin/sh를 갖게된다. 따라서 쉘을 획득할 수 있다.

 

그러면 필요한 주소들을 얻어보자.

 

exit()와 system()의 주소를 execve와 같이 libc에서 offset을 찾아 더해서 구해보겠다.

 

system offset = 00040ae0,    exit offset = 00091d10   ->따라서 각각의 주소는 system = 0x40058ae0, exit =
0x400a9d10 이다.

 

이제 system함수에서 /bin/sh 문자열을 찾아보자.

0x400fbff9이다. 필요한 정보는 모두 얻었으니 payload를 작성해보자.

 

다음 단계로 넘어가보자.

'Pwnable Write-Up > 02.hackerschool L.O.B' 카테고리의 다른 글

16. assassin -> zombie_assassin  (0) 2020.03.11
15. giant -> assassin  (0) 2020.03.11
13. darkknight -> bugbear  (0) 2020.03.10
12. golem -> darknight  (0) 2020.03.10
11. skeleton -> golem  (0) 2020.03.10

관련글 더보기

댓글 영역