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
いい感じですね 😁
-
Macだと
gcc
がclang
になってしまってるので、gcc-6
というコマンドでgccを使ってます。 ↩︎