cgy12306

Rooters CTF vuln Write-up 본문

CTF Write-up

Rooters CTF vuln Write-up

cgy12306 2019. 10. 31. 15:16
vuln 파일을 IDA로 열어봤다.


read로 0x256 만큼 쓰고, 써진걸 puts로 출력해준다.

buf의 위치는 rbp-100h 이다. 그러면 0x100만큼 덮어주고 rbp도 0x8만큼 덮어주면 ret에 접근할 수 있을 것이다.

rop 기법을 사용할 것이다.

puts의 offset을 구한다.


offset은 0x809c0이다.

puts는 인자를 한 개 받는다.64bit 함수 호출 규약에서는 처음 인자를 rdi에 넣기 때문에 pop rdi ; ret 가젯의 주소를 알아야 한다.

ROPgadget을 이용해서 가젯의 주소를 알아내자


pr(pop ret)의 주소는 0x401223이다.


pr 가젯을 실행한 후 puts로 puts의 got를 출력해준다. 이후 rbp와 pr의 주소까지 recv 해준다.(B*8 + '\x23\x12\x40\x0a')
이렇게 해주면 puts의 got만 출력버퍼에 남는다.

콘솔창에 버퍼를 찍어봤다.


다시 돌아와서 oneshot gadget 툴로 쉘을 따는 가젯을 얻을 것이다.


사용할 가젯의 주소는 0x4f322이다. 이 원샷 가젯을 사용하려면 사용 조건을 맞춰줘야 한다.

조건은 rsp+0x40에 NULL이 들어가야 한다.

이제 recv로 얻은 값으로 libc의 base를 구해주고, 원샷 가젯 + libcbase를 해준다.

첫번째 payload에서 puts의 plt를 호출한 후 다시 main을 호출해서 ret에 원샷 가젯을 호출한다.

main을 다시 호출했으므로 버퍼를 덮어줄 값을 넣어줘야 한다.

payload2에 0x108만큼 넣어주고 ret에 원샷 가젯의 주소를 넣어준다.

스택에 0을 11개 넣어주는 것을 볼 수 있다.

원샷 가젯에서 execve함수의 인자가 3개가 들어가므로 0x18(3개) + 0x40(8개)를 넣어줘야 한다.

최종 페이로드는 다음과 같다.


실행 시켜보자.


성공적으로 권한을 얻었다.


'CTF Write-up' 카테고리의 다른 글

WITHCON 2016 malloc  (0) 2020.04.18
Codegate 2016 floppy  (0) 2020.04.18
Codegate 2017 Angrybird  (0) 2020.03.02
Rooters CTF ch03 Write-up  (0) 2019.10.31
Holyshield CTF jmper Write-up  (0) 2019.10.31
Comments