Mac OS Xで逆アセンブル

created at 2016/08/30 00:09:53

objdump

Linuxで有名なobjdumpというツールが使えます。
objdumpは

objdump - display information from object files.

とありますが、逆アセンブルもしてくれます。

インストール

Homebrewでいれます。binutilsというパッケージに含まれています。

brew install binutils

コマンドはgobjdumpになります。

$ gobjdump -v
GNU objdump (GNU Binutils) 2.26.1
Copyright (C) 2015 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or (at your option) any later version.
This program has absolutely no warranty.

使い方

適当なプログラムを作って逆アセンブルしてみます。
ただ終了するだけのプログラムです。

exit0.c
int main() {
  return 0;
}

コンパイルします。1

gcc-6 exit0.c -o exit0

objdumpで逆アセンブルします。

$ gobjdump -d -M intel exit0

exit0:     ファイル形式 mach-o-x86-64


セクション .text の逆アセンブル:

0000000100000fa5 <_main>:
   100000fa5:   55                      push   rbp
   100000fa6:   48 89 e5                mov    rbp,rsp
   100000fa9:   b8 00 00 00 00          mov    eax,0x0
   100000fae:   5d                      pop    rbp
   100000faf:   c3                      ret

いい感じですね!

C => アセンブリ

Cからアセンブリに直接変換もできます。

$ gcc -S exit0.c
$ cat exit0.s
    .section    __TEXT,__text,regular,pure_instructions
    .macosx_version_min 10, 11
    .globl  _main
    .align  4, 0x90
_main:                                  ## @main
    .cfi_startproc
## BB#0:
    pushq   %rbp
Ltmp0:
    .cfi_def_cfa_offset 16
Ltmp1:
    .cfi_offset %rbp, -16
    movq    %rsp, %rbp
Ltmp2:
    .cfi_def_cfa_register %rbp
    xorl    %eax, %eax
    movl    $0, -4(%rbp)
    popq    %rbp
    retq
    .cfi_endproc


.subsections_via_symbols

ソースコードに対応するアセンブリ

C言語のソースコードと、対応するアセンブリをわかりやすく表示することもできます。

まずコンパイルします。

gcc -c -g exit0.c

-cはリンクしないオプション、-gはデバッグ情報を付与します。

gobjdumpで表示します。

$ gobjdump -d -S -M intel exit0.o
exit0.o:     ファイル形式 mach-o-x86-64


セクション .text の逆アセンブル:

0000000000000000 <_main>:
int main() {
   0:   55                      push   rbp
   1:   48 89 e5                mov    rbp,rsp
  return 0;
   4:   b8 00 00 00 00          mov    eax,0x0
}
   9:   5d                      pop    rbp
   a:   c3                      ret

いい感じですね :grin:


  1. Macだとgccclangになってしまってるので、gcc-6というコマンドでgccを使ってます。