プロジェクト

全般

プロフィール

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