naoya_t@hatenablog

いわゆるチラシノウラであります

バイナリ(というかアセンブリコード)を元のCソースと対訳で読みたいのだけれど… on Mac

ぐぐる先生もBINARY HACKS先生も

objdump -d -S hogehoge.o

で出来るよ、っていうんで

brew install binutils

でインストールされた gobjdump で試してみたけどCのソースが出てこない

  • ・・・もしかしてLinuxではできるのにMacではできないとか?
  • ・・・というとELFには対応してるけどMach-Oには対応してないとか?

で、objdump mach-o でぐぐったらshinh先生の正月の記事ですよ

Mach-O バイナリをコード見ながら逆アセンブルする方法が無いってのがずっと困っていました。つまり linux でよくやっている objdump -S みたいなことがやりたかったんですが、 objdump -S は Mach-O に対しては動かないし、 otool -tvV もソースコードは見せてくれないし、っていう。でまぁ一念発起して binutils というか libbfd をいじってみたのでした。

binutils にパッチ投げてみた話 - 兼雑記

てかこの記事正月に読んだはずなのに

で、http://ftp.gnu.org/gnu/binutils/ の最新版 (2.22) が 2011/11/21 とあるので、もっと新しいやつないかなと思って ftp://sourceware.org/pub/binutils/snapshots から最新スナップショット (1/23現在 2.22.51) を貰ってきてビルドしてみるなう

$ tar jxf binutils-2.22.51.tar.bz2
$ cd binutils-2.22.51
$ ./configure
$ make
$ sudo make install

試してみよう。hello.cはこんな感じで:

#include <stdio.h>

main(int argc, char *argv[])
{
  printf("Hello, world\n");
}
$ vi hello.c
$ gcc -g hello.c -o hello
$ objdump -d -S hello

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


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

0000000100000eb0 <start>:
   100000eb0:   6a 00                   pushq  $0x0
   ...
(略)
   ...
   100000eef:   90                      nop

0000000100000ef0 <_main>:
#include <stdio.h>

main(int argc, char *argv[]) {
   100000ef0:   55                      push   %rbp
   100000ef1:   48 89 e5                mov    %rsp,%rbp
   100000ef4:   48 83 ec 20             sub    $0x20,%rsp
   100000ef8:   89 f8                   mov    %edi,%eax
   100000efa:   89 45 fc                mov    %eax,-0x4(%rbp)
   100000efd:   48 89 75 f0             mov    %rsi,-0x10(%rbp)
  printf("Hello, world\n");
   100000f01:   48 8d 05 44 00 00 00    lea    0x44(%rip),%rax        # 100000f4c <_puts$stub+0x2c>
   100000f08:   48 89 c7                mov    %rax,%rdi
   100000f0b:   e8 10 00 00 00          callq  100000f20 <_puts$stub>
}
   100000f10:   8b 45 ec                mov    -0x14(%rbp),%eax
   100000f13:   48 83 c4 20             add    $0x20,%rsp
   100000f17:   5d                      pop    %rbp
   100000f18:   c3                      retq   

セクション __TEXT.__stubs の逆アセンブル:
   ...
(略)
   ...

イイネ!!

BINARY HACKSの裏表紙の裏にしてもらったshinh先生のサインが今日も輝いてるぜ
f:id:n4_t:20120123150550j:plain:medium
↑教科書の裏に自分の名前を書くみたいな感じで書いてあるけど我が家の蔵書です