見出し画像

#20 executable

 いよいよ来週、資格の試験です。がんばりまーす!

今週は、C++でコンパイルするとできる実行ファイルをのぞいてみます。


作業

以前作ったhello.cppを使います。

//hello.cpp
#include <iostream>
int main() 
{
   printf("Hello World");
   return 0;
}
$ make hello
c++     hello.cpp   -o hello
$ ./hello
Hello World


binwalkで、シグネチャを見ます。

$ binwalk hello
DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
1196          0x4AC           Unix path: /usr/lib/dyld
1336          0x538           Unix path: /usr/lib/libc++.1.dylib

うーん、なんかちょっと足りない感じですね。

$xxd hello
00000000: cffa edfe 0700 0001 0300 0000 0200 0000  ................
00000010: 1100 0000 8805 0000 8500 2000 0000 0000  .......... .....
00000020: 1900 0000 4800 0000 5f5f 5041 4745 5a45  ....H...__PAGEZE
00000030: 524f 0000 0000 0000 0000 0000 0000 0000  RO..............
00000040: 0000 0000 0100 0000 0000 0000 0000 0000  ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000060: 0000 0000 0000 0000 1900 0000 d801 0000  ................
00000070: 5f5f 5445 5854 0000 0000 0000 0000 0000  __TEXT..........

.....

000004a0: 0e00 0000 2000 0000 0c00 0000 2f75 7372  .... ......./usr
000004b0: 2f6c 6962 2f64 796c 6400 0000 0000 0000  /lib/dyld.......
000004c0: 1b00 0000 1800 0000 ef59 d301 cd4f 3e83  .........Y...O>.
000004d0: aa46 0b0d d42d b9fd 3200 0000 2000 0000  .F...-..2... ...
000004e0: 0100 0000 000f 0a00 060f 0a00 0100 0000  ................
000004f0: 0300 0000 0000 6102 2a00 0000 1000 0000  ......a.*.......
00000500: 0000 0000 0000 0000 2800 0080 1800 0000  ........(.......
00000510: 603f 0000 0000 0000 0000 0000 0000 0000  `?..............
00000520: 0c00 0000 3000 0000 1800 0000 0200 0000  ....0...........
00000530: 0001 8603 0000 0100 2f75 7372 2f6c 6962  ......../usr/lib
00000540: 2f6c 6962 632b 2b2e 312e 6479 6c69 6200  /libc++.1.dylib.
00000550: 0c00 0000 3800 0000 1800 0000 0200 0000  ....8...........
00000560: 0164 0105 0000 0100 2f75 7372 2f6c 6962  .d....../usr/lib
00000570: 2f6c 6962 5379 7374 656d 2e42 2e64 796c  /libSystem.B.dyl
00000580: 6962 0000 0000 0000 2600 0000 1000 0000  ib......&.......
00000590: 60c0 0000 0800 0000 2900 0000 1000 0000  `.......).......
000005a0: 68c0 0000 0000 0000 0000 0000 0000 0000  h...............​

000004a0 ~ 0000005a0まででライブラリを読み込んでいるのでしょうか。

.....

00003f50: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00003f60: 5548 89e5 4883 ec10 c745 fc00 0000 0048  UH..H....E.....H
00003f70: 8d3d 3400 0000 b000 e80d 0000 0031 c989  .=4..........1..
00003f80: 45f8 89c8 4883 c410 5dc3 ff25 7040 0000  E...H...]..%p@..
00003f90: 4c8d 1d71 4000 0041 53ff 2561 0000 0090  L..q@..AS.%a....
00003fa0: 6800 0000 00e9 e6ff ffff 4865 6c6c 6f20  h.........Hello 
00003fb0: 576f 726c 6400 0000 0100 0000 1c00 0000  World...........
00003fc0: 0000 0000 1c00 0000 0000 0000 1c00 0000  ................
00003fd0: 0200 0000 603f 0000 3400 0000 3400 0000  ....`?..4...4...
00003fe0: 8b3f 0000 0000 0000 3400 0000 0300 0000  .?......4.......
00003ff0: 0c00 0100 1000 0100 0000 0000 0000 0001  ................

.....

ここはプログラムの部分でしょう。"Hello World"の文字があります。

試しに、"Hello W0rld"に書き換えてみると、

$ ./hello
Hello W0rld

置き換わりました。つまり、ここ以外の部分も適切に置き換えれば処理を変更できてしまうということですね。

......

0000bff0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000c000: 1123 0051 0000 0000 1240 6479 6c64 5f73  .#.Q.....@dyld_s
0000c010: 7475 625f 6269 6e64 6572 0051 7200 9000  tub_binder.Qr...
0000c020: 7300 1240 5f70 7269 6e74 6600 9000 0000  s..@_printf.....
0000c030: 0001 5f00 0500 025f 6d68 5f65 7865 6375  .._...._mh_execu
0000c040: 7465 5f68 6561 6465 7200 216d 6169 6e00  te_header.!main.
0000c050: 2502 0000 0003 00e0 7e00 0000 0000 0000  %.......~.......
0000c060: e07e 0000 0000 0000 3500 0000 0e08 0000  .~......5.......
0000c070: 0880 0000 0100 0000 0200 0000 0f01 1000  ................
0000c080: 0000 0000 0100 0000 1600 0000 0f01 0000  ................
0000c090: 603f 0000 0100 0000 1c00 0000 0100 0002  `?..............
0000c0a0: 0000 0000 0000 0000 2400 0000 0100 0002  ........$.......
0000c0b0: 0000 0000 0000 0000 0300 0000 0400 0000  ................
0000c0c0: 0300 0000 0000 0000 2000 5f5f 6d68 5f65  ........ .__mh_e
0000c0d0: 7865 6375 7465 5f68 6561 6465 7200 5f6d  xecute_header._m
0000c0e0: 6169 6e00 5f70 7269 6e74 6600 6479 6c64  ain._printf.dyld
0000c0f0: 5f73 7475 625f 6269 6e64 6572 005f 5f64  _stub_binder.__d
0000c100: 796c 645f 7072 6976 6174 6500 0000 0000  yld_private.....

実行ファイルの最下部には、なにやらheaderとかmainとか書かれています。


まとめ

Binaryファイルをみると面食らいますが、つぶさに見ていけば、何が起きているかはわかります。今回はざっとながめただけですが、そのうち、もう少し細かく調査できたらと思います。便利なツールもたくさんあるので、活用しながらさらに理解を深めていきたいです。



454F46





いいなと思ったら応援しよう!