Description
Category: Reversing
Source: DEFCON CTF 2016 Quals.
Points: 100
Author: Jisoon Park(js00n.park)
Description:
Get to reversing.
Write-up
문제 파일을 다운받아 정보를 확인해보고 실행해보면, 총 13개의 숫자를 입력받도록 되어있다.
동작 형태로 비추어 보아, 적절한 입력값을 찾아야 하는 문제임을 알 수 있다.
실제로 코드를 disassemble하여 확인해보면 13개의 미지수로 이루어진 방정식을 만족시키는 값을 찾으면 되는 문제인데, reversing을 통해 13개의 방정식 각각을 확인하고 이를 풀어볼 수도 있지만, 입력을 받는 포인트와 도달하고자 하는 포인트가 명확하니 symbolic execution을 통해 문제를 해결해보도록 한다.
먼저, 분석을 시작할 주소와 도달하고자 하는 주소, 탐색이 실패한 곳의 주소를 main 함수에서 확인한다.
해당 주소들과 symbolic execution 도구인 angr를 이용해서 flag 값을 찾는다.
(source code from : https://ctftime.org/writeup/3403)
import angr
START_ADDR = 0x00000000004028d9
AVOID_ADDR = 0x0000000000402941
FIND_ADDR = 0x000000000040293f
BASE_ADDR = 0x7fffffffe5c0
STACK_ADDR = 0x7fffffffe560
INPUT_ADDR = 0x7fffffffe560
INPUT_LENGTH = 13
p = angr.Project('baby-re')
state = p.factory.blank_state(addr=START_ADDR)
state.regs.rbp = BASE_ADDR
state.regs.rsp = STACK_ADDR
for i in range(INPUT_LENGTH):
s = state.se.BVS('Var[{}]'.format(i), 32, explicit_name=True)
state.memory.store(INPUT_ADDR + i * 4, s)
path = p.factory.path(state)
ex = p.surveyors.Explorer(start=path, find=(FIND_ADDR,), avoid=(AVOID_ADDR,0x00000000004025e0))
ex.run()
print "The Flag: " + ex.found[0].state.posix.dumps(1)
angr을 사용하지 않고, 방정식을 풀어서 푸는 것도 가능하다.
http://duksctf.github.io/DCquals2016-baby-re/
Flag : Math is hard!
'writeups > Reversing' 카테고리의 다른 글
Cr4ckZ33C0d3 (0) | 2019.11.23 |
---|---|
Cheesy (0) | 2019.11.23 |
keypad CrackMe (0) | 2019.11.23 |
flag (0) | 2019.11.23 |
DLL with notepad (0) | 2019.11.23 |