Angr » 履歴 » リビジョン 2
リビジョン 1 (kanata, 2025/04/27 11:33) → リビジョン 2/3 (kanata, 2025/04/27 11:33)
# Angr {{>toc}} # Angr {{toc}} ただいま勉強中 # Angrとは 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. >angrはバイナリを分析するためのフレームワークです。これは、さまざまなタスクにそれを適用すること、両方の静的および動的なシンボリック( 「 concolic 」 )の分析に焦点を当てています >> by google翻訳先生 私は[SECCON2015](https://raintrees.net/news/59#A-Dozen-Year-of-Shellphish)で、その存在を知り衝撃を受けました。 # Angr公式 angr公式 http://angr.io/ angrインストール方法 https://github.com/angr/angr-doc/blob/master/INSTALL.md ## 日本語訳 有志の方の日本語訳 素晴らしい。。 https://ntddk.github.io/angr-doc-ja/ ## 解説 Qiita - angr例文集 書いて覚えるバイナリ自動解析技術 https://qiita.com/RKX1209/items/a514e5727119796e9fd5 >さすがのるくす先生 # angr Management angr Management https://github.com/angr/angr-management >https://twitter.com/angrdothorse/status/1433957988620980228 >Have you tried my GUI, angr-management, lately? I recently gained some great features like a hex viewer, view synchronization, color schemes, and more! # 基本的(簡単な)な使い方 細かい話は、[本家のDoc](http://docs.angr.io/)と[API](http://angr.io/api-doc/)を参照して頂戴。 ### インポート まず、インポート ~~~python import angr ~~~ ### 解析対象のバイナリファイルを指定 ~~~python p = angr.Project('解析対象の実行体PATHを指定') p = angr.Project('解析対象の実行体PATHを指定', load_options={'auto_load_libs':False}) p = angr.Project(sys.argv[1]) ~~~ ### 関数一覧を取得 ~~~python cfg = p.analyses.CFG() print [x for x in cfg.functions.iteritems()] ~~~ ### 任意の関数アドレスを取得する ~~~python func_addr = p.loader.main_bin.get_symbol("探したい関数名").addr print "main = %x" % func_addr ~~~ ~~~python addr_main = p.loader.main_bin.get_symbol('main').addr ~~~ ### シンボルへのパスを分析 ~~~ pg = p.factory.path_group() # パス分析クラスのインスタンス pg.explore(find = target_addr) # シンボルへのパスを分析 ~~~ >使うシチュエーションをイマイチ理解していない ### 初期状態(プログラム実行時の状態)を作成する ~~~python addr_main = p.loader.main_bin.get_symbol("main").addr initial_state = p.factory.blank_state(addr=addr_main) initial_path = p.factory.path(initial_state) pg = p.factory.path_group(initial_path) ~~~ ~~~python initial_state = p.factory.blank_state(addr=0x1234567) initial_path = p.factory.path(initial_state) pg = p.factory.path_group(path) ~~~ ~~~python s = p.factory.entry_state() initial_path = p.factory.path(s) pg = p.factory.path_group(initial_path) ~~~ ### 「SimMemoryAddressError」のエラーが出る時は、LAZY_SOLVES をdisableにすると良いらしい。 以下参照 >>https://github.com/angr/angr/issues/80 ~~~python import simuvex s = p.factory.entry_state(remove_options={simuvex.o.LAZY_SOLVES}) ~~~ ### 初期状態の時にメモリやレジスタを弄る ~~~python re = initial_state.se.BVS("x", 32*16) initial_state.memory.store(0x123456, re) initial_state.regs.rdi = 0x123456 ~~~ * 32の部分は32-bit symbolic bitvector(?) * 16の部分は16Byte分用意という意味 * レジスタ rdi は関数の引数になる ### 条件を指定して実行(その1) ~~~python addr_succeeded = p.loader.main_bin.get_symbol("succeeded").addr addr_failed = p.loader.main_bin.get_symbol("failed").addr a = pg.explore(find=(addr_succeeded,), avoid=(addr_failed,)) ~~~ ~~~python a = pg.explore(find=0x1234567, avoid=0x7654321) ~~~ ~~~python avoid_list = (0x405000,0x405010,0x405020,0x405030) a = pg.explore(find=0x123456, avoid=avoid_list) ~~~ ~~~python a = pg.explore() ~~~ >pathを全列挙する。 ### 条件を指定して実行(その2) ~~~python a = p.surveyors.Explorer(find=[*1],avoid=[*2]).run() ~~~ * find=0x123456 プログラムが0x123456(flagを表示しているあたりのアドレス)に到達するような条件を検索するよう指定。 * avoid=0x789abc プログラムが0x789abc(異常系のルートを指定するとよい)は通らないよう指定。 これにより、「avoidで指定したルートを通らないようにしながら、findのアドレスに到達するような条件を探せ」という解析になります。 >他の引数を確認中。 ### 実行結果の1番めをダンプ ~~~python a.found[0].state.posix.dumps(0) a.found[0].state.posix.dumps(1) a.found[0].state.state.se.any_str(a.found[0].state.state.memory.load(メモリアドレス, 長さ)) a.found[0].state.se.any_str(re).strip("\x00") ~~~ >dumpsの引数の意味がわからん。調べ中。 >>dumpsはfile descriptorを取ってその中身の文字列を返す。らしい。 ~~~python for path in pg.deadended: if path.state.posix.dumps(1).startswith('success!!'): print path.state.posix.dumps(0) ~~~ >pathを全列挙した中から、標準出力に'success!!'と表示された時の標準入力を表示。 # 実際に使ってみる ちょっと時間を見つけてやってみる # Memo angrをいろいろ使ってみる【yoshi-camp備忘録】 https://ptr-yudai.hatenablog.com/entry/2019/08/17/223044 バイナリ萌えの彼女がシンボリック実行に恋着してますが、制約に挑む幼気な表情が最高です!(1) https://speakerdeck.com/katc/bainarimeng-efalsebi-nu-gasinboritukushi-xing-nilian-zhao-sitemasuga-zhi-yue-nitiao-muyou-qi-nabiao-qing-gazui-gao-desu-1 一生あとで読んでろ - angr, AFL, Driller http://ntddk.github.io/2016/08/27/angr-afl-driller/ >[driller](https://github.com/shellphish/driller)はangrの開発陣によるAFLの拡張。シンボリック(コンコリック)実行は実用的ではないと切って捨てている。 >>おおぅ。。 >[一生あとで読んでろ - z3pyリンク集 ](https://ntddk.github.io/2017/08/24/z3py-link-collection/) >これがangrやらTritonやらmiasmやらmanticoreやら,その他いまどきのバイナリ解析ツール群の基盤となっている ももいろテクノロジー - angrでシンボリック実行をやってみる http://inaz2.hatenablog.com/entry/2016/03/16/190756 メモ書き - b.a.b.y.r.e. http://ei-seimemo.hatenablog.com/entry/2016/05/23/180012 saotake’s blog - angr on PythonをCTFに使う http://saotake.hatenablog.com/entry/2016/06/03/213100 angrによるシンボリック実行でRev問を解いてみたまとめ【WaniCTF2021】 https://qiita.com/kash1064/items/f942a5d1af1579808622 ---- 実際に使われたソースコード Unbreakable Enterprise Product Activation (solved with angr) https://gist.github.com/Bono-iPad/a030b4317a96999e44475e5c6da5877b Nuit du Hack CTF Quals - 2016 Matriochka stage 3 (solved with angr) https://gist.github.com/Bono-iPad/47644c455a39e6df6314190314adb164 Nuit du Hack CTF Quals - 2016 Matriochka stage 2 (solved with angr) https://gist.github.com/Bono-iPad/99a226f5ec4661af41f66f5c2a76cd11 angr writeup of CSAW Quals CTF 2015 crackme https://gist.github.com/inaz2/f397b63375ac58af6b47aa3479e6e574 DEF CON Capture the Flag 2016 予選参加レポート(angrを使った解法あり) http://www.ntt.com/content/dam/nttcom/hq/jp/business/services/security/security-management/wideangle/pdf/DEFCON_CTF_2016.pdf Bono-iPad 年賀状CTF stage1(PEファイルのangr) https://gist.github.com/Bono-iPad/53b65488395c0ad113bd1a0bf9f99d5b Bono-iPad INS'hAck 2018 GCorp Stage 4 (solved by angr) https://gist.github.com/Bono-iPad/e8650885d1255f55440a4a467503b2da SECCON Beginners CTF 2018 Activation & crackme http://ywkw1717.hatenablog.com/entry/2018/05/27/145312 CTFするぞ - Harekaze CTF 2019のWriteup https://ptr-yudai.hatenablog.com/entry/2019/05/19/154344 Harekaze CTF 2019 Baby ROP, Baby ROP 2, scramble http://ywkw1717.hatenablog.com/entry/2019/05/19/170256 SECCON Beginners CTF 2019 Writeup - Qiita https://qiita.com/nicklegr/items/f67288ea00017e2f49b0 angr decompiler アンガー逆コンパイラ https://rndt.pages.dev/private/angr-decompiler-G7MaVwdu3JqrQqIuOxWCbQ45vdcWDxv9Z1GNBIX78XOqOyR/ シンボリック実行 https://github.com/Xornet-Euphoria/smt_and_symbolic_execution/blob/main/ctf_adc_2024.md