ログイン
編集不可のページディスカッション情報添付ファイル
"CTF/Toolkit/Radare"の差分

MMA
3と4のリビジョン間の差分
2013-07-31 08:10:48時点のリビジョン3
サイズ: 2037
編集者: ytoku
コメント:
2013-07-31 09:26:30時点のリビジョン4
サイズ: 6560
編集者: ytoku
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 11: 行 11:

総合評価: 細かい仕様の不自然さが目立つ。対応アーキテクチャの都合によって使わざるを得ない場合を除いて使用を推奨しない。

<<TableOfContents>>
行 41: 行 45:
== rax2 ==
コマンドラインから簡単に基数変換ができる。
== 文字列抽出 ==
文字列中の記号を消してしまうように見える。注意が必要。
{{{
$ 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コマンドでコマンドラインから簡単に基数変換ができる。
行 45: 行 190:
マニュアルに書いてあるはずのfloat<->hex変換にいたっては、って戻ってくると元の値にならない面白仕様なので絶対に使ってはいけない。 マニュアルに書いてあるはずのfloat<->hex変換にいたっては、って戻ってくると元の値にならない面白仕様なので絶対に使ってはいけない。

Radare2

Radare2はリバースエンジニアリングとバイナリ解析のためのフレームワークである。 Unix-like OS向けに設計されているが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

CTF/Toolkit/Radare (最終更新日時 2015-01-14 19:24:01 更新者 ytoku)