Mac OS Xで逆アセンブル

Posted on Aug 30, 2016

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.

使い方

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


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を使ってます。