## page was renamed from CTF/inside/Toolkit/Radare ## page was renamed from CTF/Toolkit/Radare = Radare2 = Radare2はリバースエンジニアリングとバイナリ解析のためのフレームワークである。 Unix-like OS向けに設計されているが[[https://raw.github.com/radare/radare2/master/doc/windows|Windowsでも動作する]]。 対応アーキテクチャ:: 8051, arm, arc, avr, bf, c55+, csr, dcpu16, dalvik, i8080, mips, m68k, mips, msil, sh, sparc, rar, powerpc, i386, x86-64 対応フォーマット:: bios, dex, elf, elf64, filesystem, java, fatmach0, mach0, mach0-64, MZ, PE, PE+, TE, plan9, dyldcache http://radare.org/ 総合評価: 細かい仕様の不自然さが目立つ。対応アーキテクチャの都合によって使わざるを得ない場合を除いて使用を推奨しない。 <> == Tools == * r2 (radare2) * インタラクティブな逆アセンブラ + 何か * rabin2 * 実行可能ファイルの情報抽出 * objdump - disassembler + strings * ragg2 * シェルコード生成支援(r_egg) * ragg2-cc * シェルコード生成支援(C) * rarun2 * chdirやらリダイレクトやらpreloadやらを設定してからプログラムを起動 * rasm2 * アセンブラ/逆アセンブラ 有用性が微妙なもの * radiff2 * ファイルの間の異なっている部分を表示する * rafind2 * ファイルから指定したパターンを探す * rahash2 * ファイルの一部のハッシュ値を計算 * ranal2 * 与えた機械語の挙動を表示する * rax2 * 基数変換 もうひとつ、以前はrarc2が存在した。しばしば例に出てくるがobsoleteなコマンドである。ragg2に移行した。 == 文字列抽出 == 文字列中の記号を消してしまうように見える。注意が必要。 {{{ $ rabin2 -z shellcode [strings] addr=0x00000002 off=0x00000002 ordinal=000 sz=8 section=unknown string=binsh 1 strings }}} == 逆アセンブル(r2, インタラクティブ) == === 使用例 === {{{ $ r2 hello [0x00400428]> aa [0x00400428]> pdf@main ; [13] va=0x00400410 pa=0x00000410 sz=472 vsz=472 rwx=-r-x .text / function: section..text (21) | 0x00400410 section..text: | 0x00400410 4883ec08 sub rsp, 0x8 | 0x00400414 bffc054000 mov edi, str.hello | 0x00400419 e8d2ffffff call dword imp.puts | ; imp.puts() | 0x0040041e 31c0 xor eax, eax | 0x00400420 4883c408 add rsp, 0x8 \ 0x00400424 c3 ret ; ------------ }}} {{{ $ r2 -a mips sc-mips [0x00000000]> pd 14 0x00000000 ffff1004 bltzal zero,0x00000000 0x00000004 ab0f0224 li v0,4011 0x00000008 55f04620 addi a2,v0,-4011 0x0000000c 6606ff23 addi ra,ra,1638 0x00000010 c2f9ec23 addi t4,ra,-1598 0x00000014 6606bd23 addi sp,sp,1638 0x00000018 9af9acaf sw t4,-1638(sp) 0x0000001c 9ef9a6af sw a2,-1634(sp) 0x00000020 9af9bd23 addi sp,sp,-1638 0x00000024 21208001 move a0,t4 0x00000028 2128a003 move a1,sp 0x0000002c cccd4403 syscall 0xd1337 0x00000030 str.binsh: 0x00000030 string (8): "binsh" 0x00000038 ffffffff sd ra,-1(ra) }}} === help === {{{ [0x00000000]> ? a ; perform analysis of code b [bsz] ; get or change block size ... }}} {{{ [0x00000000]> p? Usage: p[fmt] [len] p= show entropy bars of full file p6[de] [len] base64 decode/encode p8 [len] 8bit hexpair list of bytes ... }}} === 解析 === ==== 全領域を解析 ==== {{{ [0x00400428]> aa }}} ==== 特定の関数を解析 ==== {{{ [0x00400428]> af@main }}} === 逆アセンブル === ==== 指定アドレスを解析 ==== {{{ [0x00400428]> pd (命令数) @ (開始アドレス or 関数名など) }}} ==== 関数を解析 ==== {{{ [0x00400428]> pdf@(関数名) }}} == 逆アセンブル(非インタラクティブ) == rasm2コマンドが簡易な逆アセンブラになる。 === ファイルを逆アセンブル === {{{ $ rasm2 -o 0 -d - -B -l (対象の長さ) < file }}} * `-o 0`: メモリアドレスのオフセットを0にする。つけておかないと0.9ではjmpするときに0x8048000基準になる。 * `-d -`: 標準入力から読み取って逆アセンブル * `-B`: 入力を16進数ではなくバイナリを扱う * `-l (対象の長さ)`: `-B`は長さの指定が必須 === コマンドラインから16進数の命令列を逆アセンブル === {{{ $ rasm2 -o 0 -d 9090 nop nop }}} * `-o 0`: メモリアドレスのオフセットを0にする。つけておかないと0.9ではjmpするときに0x8048000基準になる。 * `-d 9090`: 9090(命令列)を逆アセンブル == アセンブル == jmp shortを行う方法が見当たらない。生成できないコードが存在する可能性がある。 === ファイルからアセンブル === {{{ $ rasm2 -o0 -B - < file | xxd 0000000: 89d8 90 ... }}} === コマンドラインからアセンブル === {{{ $ rasm2 -o0 -B "mov eax,ebx; nop" | xxd 0000000: 89d8 90 ... }}} * `-o 0`: メモリアドレスのオフセットを0にする。つけておかないと0.9ではjmpするときに0x8048000基準になる。 * `-B`: 出力を16進ではなくバイナリで行う == シェルコードを生成する == === Cで書く === {{{ $ cat hi.c main(){ execve("/bin/sh", 0, 0); } }}} {{{ $ ragg2-cc -c hi.c }}} * `-c`: シェルコードを生成 シェルコードはサフィックスとして`.text`を加えたファイルに生成される。 === r_eggで書く(不明) === ragg2を使用する方法であるが、不明。 == 基数変換 == rax2コマンドでコマンドラインから簡単に基数変換ができる。 のだが、挙動が全く直感的でなく間違った変換をしかねないので使うべきではないと思う。 マニュアルに書いてあるはずのfloat<->hex変換にいたっては、行って戻ってくると元の値にならない面白仕様なので絶対に使ってはいけない。 ||in\out||bin||oct||dec||hex|| ||bin|| || ||1111d||1111b|| ||oct|| || || ||77o|| ||dec||b99|| || ||99|| ||hex||Bxff||Oxff||0xff|| ||