tmxklab
2021 DiceCTF - babymix(rev) 본문
1. 문제 확인
- 올바른 패스워드를 입력받아야 함
2. 접근 방법
main()
- sub_10B0 : fgets()로 v6에 input size 48만큼 입력을 받는다.
- check815546()의 파라미터로 들어감
- 이후에...
.....
...
이런 식으로 계속 check???()안에 또 다른 check???()를 호출한다.
계속 check???()를 호출하다가 마지막에 위에 함수를 호출하고 return한다.
요약하면 입력 값을 검증하기 위해 check???()를 여러 번 호출하고 if문이 참이어야 하므로 일일히 리버싱을 하기에는
시간이 오래 걸린다.
따라서, 바이너리 분석을 위한 파이썬 모듈인 angr모듈을 사용하여 문제를 해결한다. angr은 간단한 조건을 주면 자동으로 무작위 대입을 시작하여 결과를 도출해주는 모듈이다.
angr 모듈 설치는 간단하다.
pip3 install angr
python2지원을 종료하고 python3로 마이그레이션하였으므로 python3를 사용하여야 한다.
사용방법 및 angr관련 문서 참고는 다음 링크에서 확인)
3. 문제 풀이
1) 익스코드
import angr
import claripy
p = angr.Project('./babymix')
flag_chars = [claripy.BVS('flag_%d' %i, 8) for i in range(48)]
flag = claripy.Concat(*flag_chars + [claripy.BVV(b'\n')])
st = p.factory.full_init_state(
add_options=angr.options.unicorn,
stdin=flag
)
for k in flag_chars:
st.solver.add(k < 0x7f)
st.solver.add(k > 0x20)
sm = p.factory.simulation_manager(st)
sm.run()
for i in sm.deadended:
if b'Correct!' in i.posix.dumps(1):
print(i.posix.dumps(0))
- 전체 익스코드는 위와 같고 아래에서 자세히 코드의 의미를 살펴보자
angr, claripy모듈 import 및 바이너리 파일 지정
첫 번째 줄 : 입력 값 8bit(1byte)로 지정 및 input size를 48byte로 지정
두 번째 줄 : 입력 값 마지막에 개행문자 추가
stdin을 위에서 설정한 flag값으로 지정하고 바이너리가 수행될 때마다 영구적으로 초기화를 진행하기 위해 unicorn옵션을 추가
무작위로 대입하는 입력 값을 제한한다. → constrain to ascii-only char
그리고 분석을 시작한다.
"Correct!"문자열이 출력되는 조건이 만족할 때 입력 값을 출력
2) 실행결과
총 48byte입력 값이 존재할 줄 알았으나 "~~!1!"뒤에 문자열은 제대로 나오지 않는 것을 통해 m1x_it_4ll_t0geth3r!1!까지가 플래그 값임을 생각해볼 수 있다.
'CTF 문제' 카테고리의 다른 글
2020 DamCTF - schlage(rev) (0) | 2020.10.15 |
---|---|
2020 DamCTF - side-channel(misc) (0) | 2020.10.15 |
2020 DamCTF - allokay(pwn) (0) | 2020.10.15 |
2020 DamCTF - ghostbusters(pwn) (2) | 2020.10.15 |
2020 DownUnderCTF - [misc] homepage (0) | 2020.09.21 |