radare2 メモ

基本

https://radare.gitbooks.io/radare2book/content/introduction/basic_usage.html

radare2 をいじるにはアドレスへの seek, バッファの print そして alternate(write, append) の3つのコマンドが大切

seek コマンド

コマンドは s
引数としていくつかの式を指定することができる(ex: 10, +0x25, [0x100+ptr_table])
ブロックをベースにしたファイルをシークする場合は、ブロックサイズを b コマンドに指定して利用する
アドレスを前にシークする場合は >, 後ろにシークする場合は < を指定する

VA モード

radare2 が実行ファイルを開くと VA モードとしてファイルをオープンし、実行ファイルの各セクションを仮想アドレスにマッピングする
この VA モードではシークに仮想アドレスを利用し、radare2 開始時のアドレスを実行ファイルのエントリーポイントにセットする
-n オプションを指定すると non-VA モードとしてファイルオープンをする
non-VA モードではファイルの先頭からのオフセットを利用してシークを行う

print コマンド

コマンドは p
print コマンドにはいくつかのサブモードが存在し、そのサブモードは p コマンドの2番目の文字で指定することができる
例えば、 px とすると16進数で表示することができ、 pd であれば逆アセンブルを表示する

ファイル書き込み

-w オプションを指定すると書き込み可能でファイルオープンする
w コマンドで文字列や16進数のセット(x サブコマンド)、アセンブリのオペコード(a サブコマンド)をファイルへ書き込むことができる

w hello world    ; 文字列
wx 90 90 90 90   ; 16進数のセット
wa jmp 0x8048140 ; オペコード
wf inline.bin    ; ファイルコンテンツ
ヘルプメッセージ

コマンドへ ? を付加すると、そのコマンドのヘルプメッセージが表示される(ex: p?)

ビジュアルモード

V を押すとビジュアルモードになる
vim のように HJKL で移動、 q で終了
c でカーソルモードに移行する
複数バイトの範囲指定をする場合は Shift キーを押しながら移動して範囲を指定する
バイト列の上書きをする場合は i でモード切替をする
Tab キーを利用することで、バイト列と文字列のカラム間移動ができる
q で通常のビジュアルモードへ戻る

コマンドフォーマット

https://radare.gitbooks.io/radare2book/content/introduction/command_format.html

[.][times][cmd][~grep][@[@iter]addr!size][|>pipe] ;

コマンドは「大文字小文字を区別する1文字」で表される

繰り返し

コマンドを繰り返す場合は、コマンドの直前に繰り返す回数分の数値を記入する

シェルコンテキスト

! をコマンドの直前に記入するとシェルコンテキストからコマンドを実行する
いまいち使い道わからず、!ls とかやると ls コマンドが動いたりする

ds                   ; デバッガの step コマンド
px 200 @ esp         ; esp から20バイトを表示
pc > file.c          ; ダンプバッファを C のバイト列に変換、file.c に保存
wx 90 @@ sym.*       ; nop 命令をすべてのシンボルに書き込み
pd 2000 | grep eax   ; オペコードを grep eax して絞り込み表示
px 20 ; pd 3 ; px 40 ; 複数コマンドを1行で実行
一時的なオフセット指定

@ を利用すると一時的にシーク位置を移動しコマンド実行を行う
例えば pd 5 @ 0x100000fce とするとシーク位置を一時的に 0x100000fce へ移動、逆アセンブルを表示し、完了時にシーク位置をコマンド呼び出し時の位置へ戻す

コマンド実行 + grep

pd 20~call で逆アセンブル結果の表示内容から call が含まれた部分のみを抽出して表示する

デバッガの基本

https://radare.gitbooks.io/radare2book/content/introduction/basic_debugger_session.html

プログラムのデバッグには -d オプションを radare 実行時に付加する
プログラムのアタッチはアタッチ先のプロセス ID を指定する

$ r2 -d /bin/ls
初回ブレークポイント

デバッガは動作に必要なライブラリを動的リンクをする前に実行をストップする
この振る舞いは ~/.radare2rc へ設定を追加することによって変更することができる
例えば e dbg.bep=main の設定を追加すると、 main 関数の直前まで実行してデバッガが起動する

デバッガでよく使うコマンド
ds 3          ; 3回ステップ実行
db 0x8048920  ; ブレークポイントの設定
db -0x8048920 ; ブレークポイントの削除
dc            ; 実行を再開(continue)
dcs           ; syscall が呼ばれるまで実行を再開
dd            ; ファイルディスクリプタの操作
dm            ; プロセスマップの表示
dmp A S rwx   ; ページを A, サイズをS, 権限 rwx に変更
dr eax=33     ; レジスタの値を変更、ここでは eax を 33 に変更
ビジュアルモード

V でビジュアルモードでデバッグができる