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でやったネタを記事にしました。