Angr » 履歴 » バージョン 3
kanata, 2025/05/10 09:16
| 1 | 1 | kanata | # Angr |
|---|---|---|---|
| 2 | |||
| 3 | 3 | kanata | {{last_updated_at}} |
| 4 | |||
| 5 | 2 | kanata | {{>toc}} |
| 6 | 1 | kanata | |
| 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 |