プロジェクト

全般

プロフィール

Angr » 履歴 » バージョン 2

kanata, 2025/04/27 11:33

1 1 kanata
# Angr
2
3 2 kanata
{{>toc}}
4 1 kanata
5
ただいま勉強中
6
7
# Angrとは
8
9
angr is a framework for analyzing binaries. It focuses on both static and dynamic symbolic ("concolic") analysis, making it applicable to a variety of tasks.
10
11
>angrはバイナリを分析するためのフレームワークです。これは、さまざまなタスクにそれを適用すること、両方の静的および動的なシンボリック( 「 concolic 」 )の分析に焦点を当てています
12
>> by google翻訳先生
13
14
私は[SECCON2015](https://raintrees.net/news/59#A-Dozen-Year-of-Shellphish)で、その存在を知り衝撃を受けました。
15
16
# Angr公式
17
18
angr公式
19
http://angr.io/
20
21
angrインストール方法
22
https://github.com/angr/angr-doc/blob/master/INSTALL.md
23
24
## 日本語訳
25
26
有志の方の日本語訳 素晴らしい。。
27
28
https://ntddk.github.io/angr-doc-ja/
29
30
## 解説
31
32
Qiita - angr例文集 書いて覚えるバイナリ自動解析技術
33
https://qiita.com/RKX1209/items/a514e5727119796e9fd5
34
35
>さすがのるくす先生
36
37
# angr Management
38
39
angr Management
40
https://github.com/angr/angr-management
41
42
>https://twitter.com/angrdothorse/status/1433957988620980228
43
>Have you tried my GUI, angr-management, lately? I recently gained some great features like a hex viewer, view synchronization, color schemes, and more!
44
45
46
# 基本的(簡単な)な使い方
47
48
細かい話は、[本家のDoc](http://docs.angr.io/)と[API](http://angr.io/api-doc/)を参照して頂戴。
49
50
### インポート
51
52
まず、インポート
53
54
~~~python
55
import angr
56
~~~
57
58
### 解析対象のバイナリファイルを指定
59
60
~~~python
61
p = angr.Project('解析対象の実行体PATHを指定')
62
p = angr.Project('解析対象の実行体PATHを指定', load_options={'auto_load_libs':False})
63
p = angr.Project(sys.argv[1]) 
64
~~~
65
66
### 関数一覧を取得
67
68
~~~python
69
cfg = p.analyses.CFG()
70
print [x for x in cfg.functions.iteritems()]
71
~~~
72
73
### 任意の関数アドレスを取得する
74
75
~~~python
76
func_addr = p.loader.main_bin.get_symbol("探したい関数名").addr
77
print "main = %x" % func_addr
78
~~~
79
80
~~~python
81
addr_main = p.loader.main_bin.get_symbol('main').addr
82
~~~
83
84
### シンボルへのパスを分析
85
86
~~~
87
pg = p.factory.path_group()    # パス分析クラスのインスタンス
88
pg.explore(find = target_addr) # シンボルへのパスを分析
89
~~~
90
91
>使うシチュエーションをイマイチ理解していない
92
93
### 初期状態(プログラム実行時の状態)を作成する
94
95
~~~python
96
addr_main = p.loader.main_bin.get_symbol("main").addr
97
initial_state = p.factory.blank_state(addr=addr_main)
98
initial_path = p.factory.path(initial_state)
99
pg = p.factory.path_group(initial_path)
100
~~~
101
102
~~~python
103
initial_state = p.factory.blank_state(addr=0x1234567)
104
initial_path = p.factory.path(initial_state)
105
pg = p.factory.path_group(path)
106
~~~
107
108
~~~python
109
s = p.factory.entry_state()
110
initial_path = p.factory.path(s)
111
pg = p.factory.path_group(initial_path)
112
~~~
113
114
### 「SimMemoryAddressError」のエラーが出る時は、LAZY_SOLVES をdisableにすると良いらしい。
115
116
以下参照
117
>>https://github.com/angr/angr/issues/80
118
119
~~~python
120
import simuvex
121
122
s = p.factory.entry_state(remove_options={simuvex.o.LAZY_SOLVES})
123
~~~
124
125
126
### 初期状態の時にメモリやレジスタを弄る
127
128
~~~python
129
re = initial_state.se.BVS("x", 32*16)    
130
initial_state.memory.store(0x123456, re)
131
initial_state.regs.rdi = 0x123456
132
~~~
133
134
* 32の部分は32-bit symbolic bitvector(?)
135
* 16の部分は16Byte分用意という意味
136
* レジスタ rdi は関数の引数になる
137
138
### 条件を指定して実行(その1)
139
140
~~~python
141
addr_succeeded = p.loader.main_bin.get_symbol("succeeded").addr
142
addr_failed = p.loader.main_bin.get_symbol("failed").addr
143
a = pg.explore(find=(addr_succeeded,), avoid=(addr_failed,))
144
~~~
145
146
~~~python
147
a = pg.explore(find=0x1234567, avoid=0x7654321)
148
~~~
149
150
~~~python
151
avoid_list = (0x405000,0x405010,0x405020,0x405030)
152
a = pg.explore(find=0x123456, avoid=avoid_list)
153
~~~
154
155
~~~python
156
a = pg.explore()
157
~~~
158
159
>pathを全列挙する。
160
161
### 条件を指定して実行(その2)
162
163
~~~python
164
a = p.surveyors.Explorer(find=[*1],avoid=[*2]).run()
165
~~~
166
167
 * find=0x123456
168
169
プログラムが0x123456(flagを表示しているあたりのアドレス)に到達するような条件を検索するよう指定。
170
171
 * avoid=0x789abc
172
173
プログラムが0x789abc(異常系のルートを指定するとよい)は通らないよう指定。
174
175
これにより、「avoidで指定したルートを通らないようにしながら、findのアドレスに到達するような条件を探せ」という解析になります。
176
177
>他の引数を確認中。
178
179
### 実行結果の1番めをダンプ
180
181
~~~python
182
a.found[0].state.posix.dumps(0)
183
a.found[0].state.posix.dumps(1)
184
a.found[0].state.state.se.any_str(a.found[0].state.state.memory.load(メモリアドレス, 長さ))
185
a.found[0].state.se.any_str(re).strip("\x00")
186
~~~
187
188
>dumpsの引数の意味がわからん。調べ中。
189
>>dumpsはfile descriptorを取ってその中身の文字列を返す。らしい。
190
191
~~~python
192
for path in pg.deadended:
193
  if path.state.posix.dumps(1).startswith('success!!'):
194
    print path.state.posix.dumps(0)
195
~~~
196
197
>pathを全列挙した中から、標準出力に'success!!'と表示された時の標準入力を表示。
198
199
# 実際に使ってみる
200
201
ちょっと時間を見つけてやってみる
202
203
# Memo
204
205
angrをいろいろ使ってみる【yoshi-camp備忘録】
206
https://ptr-yudai.hatenablog.com/entry/2019/08/17/223044
207
208
バイナリ萌えの彼女がシンボリック実行に恋着してますが、制約に挑む幼気な表情が最高です!(1)
209
https://speakerdeck.com/katc/bainarimeng-efalsebi-nu-gasinboritukushi-xing-nilian-zhao-sitemasuga-zhi-yue-nitiao-muyou-qi-nabiao-qing-gazui-gao-desu-1
210
211
一生あとで読んでろ - angr, AFL, Driller
212
http://ntddk.github.io/2016/08/27/angr-afl-driller/
213
214
>[driller](https://github.com/shellphish/driller)はangrの開発陣によるAFLの拡張。シンボリック(コンコリック)実行は実用的ではないと切って捨てている。
215
>>おおぅ。。
216
217
>[一生あとで読んでろ - z3pyリンク集 ](https://ntddk.github.io/2017/08/24/z3py-link-collection/)
218
>これがangrやらTritonやらmiasmやらmanticoreやら,その他いまどきのバイナリ解析ツール群の基盤となっている
219
220
ももいろテクノロジー - angrでシンボリック実行をやってみる
221
http://inaz2.hatenablog.com/entry/2016/03/16/190756
222
223
メモ書き - b.a.b.y.r.e.
224
http://ei-seimemo.hatenablog.com/entry/2016/05/23/180012
225
226
saotake’s blog - angr on PythonをCTFに使う
227
http://saotake.hatenablog.com/entry/2016/06/03/213100
228
229
angrによるシンボリック実行でRev問を解いてみたまとめ【WaniCTF2021】
230
https://qiita.com/kash1064/items/f942a5d1af1579808622
231
232
----
233
234
実際に使われたソースコード
235
236
Unbreakable Enterprise Product Activation (solved with angr)
237
https://gist.github.com/Bono-iPad/a030b4317a96999e44475e5c6da5877b
238
239
Nuit du Hack CTF Quals - 2016 Matriochka stage 3 (solved with angr)
240
https://gist.github.com/Bono-iPad/47644c455a39e6df6314190314adb164
241
242
Nuit du Hack CTF Quals - 2016 Matriochka stage 2 (solved with angr)
243
https://gist.github.com/Bono-iPad/99a226f5ec4661af41f66f5c2a76cd11
244
245
angr writeup of CSAW Quals CTF 2015 crackme 
246
https://gist.github.com/inaz2/f397b63375ac58af6b47aa3479e6e574
247
248
DEF CON Capture the Flag 2016 予選参加レポート(angrを使った解法あり)
249
http://www.ntt.com/content/dam/nttcom/hq/jp/business/services/security/security-management/wideangle/pdf/DEFCON_CTF_2016.pdf
250
251
Bono-iPad 年賀状CTF stage1(PEファイルのangr)
252
https://gist.github.com/Bono-iPad/53b65488395c0ad113bd1a0bf9f99d5b
253
254
Bono-iPad INS'hAck 2018 GCorp Stage 4 (solved by angr) 
255
https://gist.github.com/Bono-iPad/e8650885d1255f55440a4a467503b2da
256
257
SECCON Beginners CTF 2018 Activation & crackme
258
http://ywkw1717.hatenablog.com/entry/2018/05/27/145312
259
260
CTFするぞ - Harekaze CTF 2019のWriteup
261
https://ptr-yudai.hatenablog.com/entry/2019/05/19/154344
262
263
Harekaze CTF 2019 Baby ROP, Baby ROP 2, scramble
264
http://ywkw1717.hatenablog.com/entry/2019/05/19/170256
265
266
SECCON Beginners CTF 2019 Writeup - Qiita
267
https://qiita.com/nicklegr/items/f67288ea00017e2f49b0
268
269
angr decompiler  アンガー逆コンパイラ
270
https://rndt.pages.dev/private/angr-decompiler-G7MaVwdu3JqrQqIuOxWCbQ45vdcWDxv9Z1GNBIX78XOqOyR/
271
272
シンボリック実行
273
https://github.com/Xornet-Euphoria/smt_and_symbolic_execution/blob/main/ctf_adc_2024.md