nownab.log

nownabe's daily posts

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

いい感じですね 😁


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