Angr를 사용하다보면 바이너리 분석이 필요할때가 있는데..
IDA-pro는 사용할 수 있는 환경이 아니어서 찾아보니!?
NSA에서 만든 오픈 소스 도구인 Ghidra가 있었다. IDA-pro 대적하며 쉬운? 사용법과 문서를 통해 무료로! 바이너리를 분석할 수 있는 프레임워크가 있음을 알게되었다.
그러니 확인해보자
Github 페이지에서 다운로드 받을 수 있으며 원하는 Release 버전을 다운로드 받으면 된다. 요구사항은 매우 간단한데 JDK만 시스템 환경 변수에 있으면 사용할 수 있다. 아 여기서는 Window 환경에서 사용한다.
평소에는 JDK 버전 등의 호환성 문제로 9.2.3 이나 9.2 를 사용하는데 여기서는 최신 버전인 10.0 버전을 사용한다.
https://www.reddit.com/r/ghidra/comments/mfr39k/issue_with_ghidra_pe_loader/
사용법
설피한 Ghidra 압축파일을 풀어 GhidraRun 배치파일을 눌러 실행하자. 그리고 File -> new project를 통해 원하는 경로에 프로젝트를 생성하면 아래와 같은 결과를 얻을 수 있다. 이제 이 test라는 프로젝트안에 분석할 바이너리 파일을 로드한다.
프로젝트를 생성하고 file -> import file을 누르거나 바이너리 파일을 드래그하여 import 할수있다.
이후 해당 바이러니 파일을 더블클릭하여 새롭게 뜬 UI창을 확인할 수 있다.
Analyze버튼을 눌러 분석을 진행하고 이제 IDA-pro와 같이 주소별 IR코드와 메모리 등을 확인할 수 있다.
빨간색으로 표시한 부분이 주로 내가 사용하는 부분이며 Filter에서는 어떤 메서드 이름을 알때, 입력하면 해당 메서드로 바로 점프할 있다. Search에서 string을 통해 문자열로 검색할 수 있고 Windows에서는 다양한 분석 툴을 사용할 수 있는데 Function call graph 기능까지 있으니 유용하게 사용할 수 있다.
커맨드 키로는 'g' 버튼으로 주소를 입력하면 해당 주소로 점프하고 'alt+ <-' 'alt + ->' 로 되돌리기 돌아가기를 진행할 수 있다.
해당 바이너리는 Angr Example에 있는 fauxware이다.
main을 시작으로 어느 부분에서 undefined8 authenticate() 메서드를 호출하는데 해당 호출 함수로 진입한 결과이다. 여기서 뭔가를 알 수 있는데 좌측의 문자열인 "SOSNEAKY"가 이 문제의 해답키이다.
Reference
Angr with Ghidra
- main.py -
1
2
3
4
5
6
7
8
9
10
11
|
import angr
import sys
if __name__ == '__main__':
p = angr.Project("angr-doc/examples/fauxware/fauxware", auto_load_libs=False)
print(p)
state = p.factory.entry_state()
print(state)
simgr = p.factory.simgr(state)
simgr.run()
print(simgr.active)
|
cs |
Angr 코드이다. Angr에 대한 기본 설명은 하지않는다. 다른 글을 찾아보면 문제가 어떤지 어떻게 푸는지 설명되어 있다. 여기서는 동작을 확인하고 앞으로 이 코드를 토대로 커스텀 확장을 진행할 생각이다.
먼저 로그를 볼텐데 simgr 즉, SimulationManager에 대해 로그를 찍어볼 수 있다.
- Sim_manager.py -
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
.....
l.warning("Stepping %s of %s", stash, self)
l.warning(f"here is my log.... {self.active}")
# 8<----------------- Compatibility layer -----------------
if n is not None or until is not None:
if once('simgr_step_n_until'):
print("\x1b[31;1mDeprecation warning: the use of `n` and `until` arguments is deprecated. "
"Consider using simgr.run() with the same arguments if you want to specify "
"a number of steps or an additional condition on when to stop the execution.\x1b[0m")
return self.run(stash, n, until, selector_func=selector_func, step_func=step_func,
successor_func=successor_func, filter_func=filter_func, **run_args)
# ------------------ Compatibility layer ---------------->8
bucket = defaultdict(list)
for state in self._fetch_states(stash=stash):
.....
|
cs |
Angr의 Sim_manager.py 에 정의된 step 함수이다. run() 함수를 부르면 SimmulationManager 클래스의 생성자가 초기화되고 step() 함수를 부르는데 여기서 로그를 확인할 수 있다. Angr에서 설명하는대로 state에 대한 active, errored 와 같은 상태를 확인할 수 있다.
로그를 확인하기 위해서는 로깅 레벨을 warning으로 적용한다.
프로그램을 실행하면 state에 대한 로그를 볼수 있는데 이 주소는 Ghidra에서 확인할 수 있는 주소와 같다. strcmp 부분이 몇번째 주소인지 그 블록의 명령어 코드가 어떤지 확인할 수 있다.
그리고 procedures가 있는데 현재 찍힌 로그는 strcmp에 대한 state이다. 이는 angr/procedures/libc/strcmp.py
경로에 있다. angr가 분석을 진행하다 이와 같은 procedure를 만나게된다면 해당 procedure를 호출하고 그에 따른 행동을 취한다. 이 procedure에 대해서도 사용자 정의로 새로 만들어서 적용해보고자 한다.
state의 경우 state_plugin을 통해 사용자 정의 레지스터등을 생성하고 다양한 작업을 진행할 수 있다. 다음글에서 이 내용들에 진행하며 python의 기능과 angr의 api를 적용해 볼 것이다.
0040068e를 보면 if(...) 를 뜻한다. 그래서 다음 상태는 2가지를 나타낼 것이다. 참인 경우와 거짓인 경우로 2개의 state가 분리되고 각각의 state에 대해 진행될 것이다.
이제 angr에서 제공한 아주 간단한 바이너리 파일을 바탕으로 angr에서 제공하는 여러 api를 사용하고 일부 수정하여 변경하여 결과가 어떻게 되는지 보면서 python 언어에 대해 더 깊이 이해하고 angr에 대해 살펴보도록 한다.
Ghidra는 angr의 state 상태 주소와 op code 및 디컴파일러를 위해 사용된다.
아 여담으로 위 문제의 답은 아래의 로그 결과를 통해 확인할 수 있다.
Refernce
'python > angr' 카테고리의 다른 글
[Angr] angr Window 설치 및 Pycharm 설정 (0) | 2021.07.02 |
---|