プロジェクト

全般

プロフィール

Angr » 履歴 » バージョン 1

kanata, 2025/04/27 11:33

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