2019. 3. 6. 18:46ㆍreversing/angr
ais3_crackme
참고 :
(cast_to 관련) https://docs.angr.io/appendix/migration
바이너리를 실행하려고 시도했지만 key를 입력하라는 문자열을 출력하고 종료 되어버렸다....
아무래도 key 문자열을 main함수 인자로 함께 줘야 하는 것 같다.
아무래도 알맞는 키를 구해야 하는 것 같다.
바이너리 파일을 ida로 열어본 결과, verify 함수 이후로 분기가 있다는 것을 볼 수 있었다.
피해야할 곳은 I'm sorry, that's the wrong secret key! 를 출력하는 0x40060E 이고,
찾아야 하는 곳은 Correct! that is the secret key! 를 출력하는 주소이다.
위 사진을 보면 찾아야 할 주소가 0x400607이라는 것을 알 수있다.
[CODE]
위에서 분석한 내용을 가지고 파이썬 코드를 작성하면 다음과 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import angr import claripy p = angr.Project('./ais3_crackme', auto_load_libs = False ) 1. key = claripy.BVS('key',8*23) find_addr = 0x400607 avoid_addr = 0x40060E 2. state = p.factory.entry_state(args = ['./ais3_crackme',key]) s = p.factory.simulation_manager(state) s.explore(find = find_addr, avoid = avoid_addr) print('[*] FIND FLAG : ') print( 3. s.one_found.solver.eval(key, cast_to=bytes) ) |
1. key = claripy.BVS('key',8*23)
: key라는 symbolic vector를 만든다.
: 문자열의 크기를 지정해주어야 하는데, 이부분에 있어서는 다른 분의 코드를 참고했다.
이전에 baby-re 문제 풀면서 symbolic vector 부분이 이해가 가질 않았는데, 어떤 분의 글에 잘 설명이 되어있었다.
참고 : http://bitxflow.synology.me/wordpress/?p=460
AIS3 2015 CRACKME 부분
* 해당 코드가 필요한 이유는 바이너리 외부 파라미터를 symbol로 사용하기 때문이라고 한다.
2. state = p.factory.entry_state(args = ['./ais3_crackme',key])
.entry_state() : 바이너리의 entry point에서 실행되도록 설정
: 파라미터가 파일 이름과 symbolic vector 라고 state를 설정
* angr에서 state가 무엇인지는 더 공부해야할 것 같다.
3. s.one_found.solver.eval(key, cast_to=bytes)
: key(symbolic vector)에 있는 문자열을 요청한다.
: 즉 정확한 key값을 가져온다.
* cast_to=bytes
'reversing > angr' 카테고리의 다른 글
[angr] CSCI-4968-MBE crackme0x02 (0) | 2019.03.11 |
---|---|
[angr] CSCI-4968-MBE crackme0x01 (0) | 2019.03.11 |
[angr] CSCI-4968-MBE crackme0x00a (1) | 2019.03.10 |
[angr] baby-re (0) | 2019.03.04 |
angr 설치 (0) | 2019.03.03 |