r2pipe101
r2pipe
radare2のPluginを作る時に便利なPythonのライブラリ
名前通り、pipeでしかない
import r2pipe
pipe = r2pipe.open()
作成したpipeにコマンドを渡すとその出力が返ってくる
example
関数の総数を数える
/some/path/to/count_func.py
import r2pipe
pipe = r2pipe.open()
pipe.cmd('aaaaaa')
# radare2ではコマンドの末尾に"j"を付けるとjsonで出力してくれる
# cmdjでいい感じにパースしてくれる
funcs = pipd.cmdj('aflj')
print(f'functions count: {len(funcs)}')
~/.radare2rc
(count_func; "#!pipe python3 /some/path/to/count_func.py")
$ r2 /bin/ls
[0x00006ab0]> .(count_func)
[x] Analyze all flags starting with sym. and entry0 (aa)
[x] Analyze all functions arguments/locals
[x] Analyze function calls (aac)
[x] Analyze len bytes of instructions for references (aar)
[x] Finding and parsing C++ vtables (avrr)
[x] Type matching analysis for all functions (aaft)
[x] Propagate noreturn information (aanr)
[x] Finding function preludes
[x] Enable constraint types analysis for variables
functions count: 366
seccomp dump
seccompとは
簡単に言うと実行できるシステムコールを制限する機能
バイナリ中にコンパイルされたルールがある
seccomp-toolsというRuby製のツールを使うとseccompのルールをダンプできる
が、別でターミナル開くのはめんどくさい
そこでr2pipe
import r2pipe
import subprocess
pipe = r2pipe.open()
binfile = str(pipe.cmdj('ij')['core']['file']) # ファイル名を取得
subprocess.run(f'seccomp-tools dump ./{binfile}', shell=True)
example: ProjectSekaiCTF 2022 saveme
[0x00401130]> .(seccomp_dump)
line CODE JT JF K
=================================
0000: 0x20 0x00 0x00 0x00000004 A = arch
0001: 0x15 0x00 0x07 0xc000003e if (A != ARCH_X86_64) goto 0009
0002: 0x20 0x00 0x00 0x00000000 A = sys_number
0003: 0x35 0x00 0x01 0x40000000 if (A < 0x40000000) goto 0005
0004: 0x15 0x00 0x04 0xffffffff if (A != 0xffffffff) goto 0009
0005: 0x15 0x02 0x00 0x00000000 if (A == read) goto 0008
0006: 0x15 0x01 0x00 0x00000001 if (A == write) goto 0008
0007: 0x15 0x00 0x01 0x000000e7 if (A != exit_group) goto 0009
0008: 0x06 0x00 0x00 0x7fff0000 return ALLOW
0009: 0x06 0x00 0x00 0x00000000 return KILL
便利〜
r2の出力と別のツールを組み合わせたい時等にかなり便利です
おわりに
この記事はn01e0 Advent Calendar 2023の23日目の記事です。
今日はSECCONの準備で忙しいので昔LTでやったネタを記事にしました。
Comments