CTFのReverse問題で最近 radare2(r2) を使うことが多くなってきたのでチートシートを残しておく。
1. 起動と基本解析
バイナリを開き、自動解析を行うまでのステップ。
| コマンド |
説明 |
r2 ./binary |
バイナリを開く(読み取り専) |
r2 -A ./binary |
開くと同時にaaa(全解析)を実行 |
r2 -d ./binary |
デバッグモードで起動 |
r2 -w ./binary |
書き込みモードで起動 |
aaa |
全自動解析(関数名や参照を特定する) |
2. 情報収集
バイナリの素性を調べるコマンド
| コマンド |
説明 |
iI |
バイナリ情報(Arch, OS, Canary/NX/PIEなどの保護情報) |
il |
インポート関数の表示(printf,strcmp等) |
is |
シンボルテーブルの表示 |
afl |
解析済みの関数一覧を表示 |
iz |
データセクション内の文字列を表示 |
izz |
バイナリ全体の文字列を検索 |
3. 移動と表示
コードの特定の場所に移動し、内容を確認するコマンド
| コマンド |
説明 |
s main |
main関数へ移動 |
s 0x401234 |
指定したアドレスへ移動 |
s- |
履歴を一つ戻る |
pdf |
現在の一の関数をディスアセンブル表示 |
pd 20 |
現在位置から20行分ディスアセンブル表示 |
px 64 |
現在位置から64バイト分をHex表示 |
| axt [addr/sym]` |
指定した場所への参照元を表示 |
4. ビジュアルモード
-
V: ビジュアルモードに入る(pで表示形式切り替え)
-
VV: グラフモード(関数フローを視覚化)
-
v: ビジュアルパネルモード
ビジュアル/グラフモード中の動作
| キー |
説明 |
hjkl |
移動(左下上右) |
g |
指定アドレス/関数へジャンプ |
u |
ジャンプから戻る |
dr |
レジスタ値を表示(デバッグ時) |
? |
モード内ヘルプ |
5. 検索とパッチ
バイナリを書き換えたり、特定のバイトを探したりする
| コマンド |
説明 |
/ string |
文字列を検索 |
/x 9090 |
16進数バイト列を検索 |
wa nop |
現在位置をnopで上書き |
wx 9090 |
現在位置を16進数(9090)で上書き |
6. デバッグ
動的解析(-dで起動時)に利用
| コマンド |
説明 |
db [addr] |
ブレークポイントを設定 |
db- [addr] |
ブレークポイントを解除 |
dc |
実行を継続 |
dso |
ステップオーバー |
dr |
全レジスタの値を表示 |
px @ [reg] |
指定レジスタの指すメモリを表示(例: px @ rsp) |
6. 特殊修飾子
| 修飾子 |
説明 |
例 |
@ [addr] |
一時的なシーク |
pd 5 @ sym.main(mainを5行表示) |
~[str] |
内部grep |
afl ~main(関数リストからmainを検索) |
~:n |
行抽出 |
iz~{0}(文字列リストの一行目だけ表示) |
j |
JSON出力。結果をJSON化 |
ij(バイナリ情報をJSONで出力 |
@@ [iterator] |
イテレータ。リストの各要素に対してコマンドを繰り返し実行 |
pdf @@ sym.*(全てのsymbolをpdf表示) |
7. その他・シェル連携
| コマンド |
説明 |
![cmd] |
外部シェルコマンドを実行(例: !ls,!python solve.py) |
. [cmd] |
コマンドの結果をr2内で実行 |
? [math] |
計算機。16進数や2進数の変換にも便利(例: ? 0x10 + 5) |