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를 작성해보자.
다음 단계로 넘어가보자.
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 |
댓글 영역