サイズ: 3326
コメント:
|
← 2015-01-14 19:22:28時点のリビジョン5 ⇥
サイズ: 3423
コメント:
|
削除された箇所はこのように表示されます。 | 追加された箇所はこのように表示されます。 |
行 1: | 行 1: |
## page was renamed from CTF/inside/Toolkit/udis86 ## page was renamed from CTF/Toolkit/udis86 |
|
行 10: | 行 12: |
デフォルトでは32-bit modeで逆コンパイルする。64bitのコードを逆コンパイルするときには`-64`オプションを指定する。 | デフォルトでは32-bit modeで逆アセンブルする。64bitのコードを逆アセンブルするときには`-64`オプションを指定する。 |
udis86
udis86は逆アセンブラライブラリである。x86系の16-, 32-, 64-bit modeに対応している。Intel記法とAT&T記法両方に対応している。 udcliというCLIの逆アセンブラが付属しており、シェルコードのようなコードの断片の逆アセンブルに向いている。
インストール
udis86のサイトからソースのtarボールをダウンロードしてconfigureしてmakeする。 make installするまでもなく、生成されたudcli/udcliを適当にコピーして使うことが出来る。
使い方
デフォルトでは32-bit modeで逆アセンブルする。64bitのコードを逆アセンブルするときには-64オプションを指定する。
ファイル名を省略すると標準入力から読み取る。
x86の場合(デフォルト)
$ udcli file
x86-64の場合
$ udcli -64 file
Intel記法(デフォルト)
$ udcli -intel file
AT&T記法
$ udcli -att file
入力を16進数で
$ echo "90 90" | udcli -x
ずれる場合
文字列などが挟まっていて、命令の開始位置ずれる場合には複数回に分けて逆アセンブルする。1
-cオプションで読み込むバイト数を指定、-oで開始アドレスを指定、-sで先頭を読み飛ばす。
次のコード片を逆アセンブルしてみる。
$ udcli -64 sc 0000000000000000 eb08 jmp 0xa 0000000000000002 2f invalid 0000000000000003 62 invalid 0000000000000004 696e2f736800b8 imul ebp, [rsi+0x2f], 0xb8006873 000000000000000b 3b00 cmp eax, [rax] 000000000000000d 0000 add [rax], al 000000000000000f 488d3decffffff lea rdi, [rip-0x14] 0000000000000016 be00000000 mov esi, 0x0 000000000000001b ba00000000 mov edx, 0x0 0000000000000020 0f05 syscall
jump先の0xaが前の文字列とくっついてしまっている。 一回目の逆アセンブルで-cオプションで先頭10バイトのみ処理、二回目の逆アセンブルで-sオプションで10バイト目以降を処理する。さらにm二回目の開始アドレスを-oオプションで合わせる。
$ udcli -64 -c 10 sc; udcli -64 -o 10 -s 10 sc 0000000000000000 eb08 jmp 0xa 0000000000000002 2f invalid 0000000000000003 62 invalid 0000000000000004 696e2f736800 invalid 0000000000000010 b83b000000 mov eax, 0x3b 0000000000000015 488d3decffffff lea rdi, [rip-0x14] 000000000000001c be00000000 mov esi, 0x0 0000000000000021 ba00000000 mov edx, 0x0 0000000000000026 0f05 syscall
ちょっとパッチを書いたほうがいい気がする。 (1)