cgy12306
Rooters CTF vuln Write-up 본문
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