[angr] ais3_crackme

2019. 3. 6. 18:46reversing/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
 
= 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])
 
= p.factory.simulation_manager(state)
s.explore(find = find_addr, avoid = avoid_addr)
 
print('[*] FIND FLAG : ')
print3. s.one_found.solver.eval(key, cast_to=bytes) )

cs


1. key = claripy.BVS('key',8*23)

: key라는 symbolic vector를 만든다. 

: 문자열의 크기를 지정해주어야 하는데, 이부분에 있어서는 다른 분의 코드를 참고했다.

참고 : https://chp747.tistory.com/91 


이전에 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