バイナリアンを目指して for a binaryen
TRANSCRIPT
1/116
バイナリアンを目指して - For a binaryen -
兼澤 侑也 - Yuya Kanesawa -
2/116
Self-Introduction
• My name is Yuya Kanesawa.
• I’m second grader of University of Aizu.
• My hobby is Rubik’s Cube and drawing.
• My favorite anime is Fate/Zero.
• I’m really into BABYMETAL.
(Sorry, English section is this only.)
3/116
Self-Introduction
• My name is Yuya Kanesawa.
• I’m second grader of University of Aizu.
• My hobby is Rubik’s Cube and drawing.
• My favorite anime is Fate/Zero.
• I’m really into BABYMETAL.
(Sorry, English section is this only.)
4/116
5/116
Whooooooooooooo!!!! ワ―――ヽ(・∀・)ノ―――イ
6/116
ゴゴゴゴゴゴゴゴ・・・・・・・
7/116
次はお前だ!!!!
8/116
本題に入ります
9/116
そもそもバイナリアンって?
10/116
11/116
12/116
なんでバイナリ?
• 大和セキュリティ場阿忍愚CTFに参加
• 金子さんから聞いた「千田さん」
• 2年生になってから
13/116
なんでバイナリ?
• 大和セキュリティ場阿忍愚CTFに参加
• 金子さんから聞いた「千田さん」
• 2年生になってから
14/116
15/116
なんでバイナリ?
• 大和セキュリティ場阿忍愚CTFに参加
• 金子さんから聞いた「千田さん」
• 2年生になってから
16/116
17/116
なんでバイナリ?
• 大和セキュリティ場阿忍愚CTFに参加
• 金子さんから聞いた「千田さん」
• 2年生になってから
18/116
↑の本や、Webサイトなどで 勉強していました
19/116
目的
• バイナリって難しそう・・・・
• バイナリってなにが面白いの・・・?
このような人達に
「バイナリって楽しいよ!」と伝えたい
もし興味を持って頂けたら
一緒にバイナリアンを目指しましょう
20/116
目次
• バイナリとは
• バイナリに触れてみる
• 実践編
21/116
目次
• バイナリとは
• バイナリに触れてみる
• 実践編
22/116
バイナリとは
• 「binary」とは「2進数の」という意味
• 0と1で表現されているデータ形式を「バイナリファイル」など
• 実行ファイル、音声ファイル、画像ファイルなども、バイナリファイル
• データ構造の2分木は、バイナリツリーと呼ばれる(2つに分岐しているから)
23/116
バイナリとは
• バイナリファイルは「バイナリエディタ」などで開く
• テキストエディタでは、ほぼ無理
24/116
バイナリとは
有名なバイナリエディタ
• Ollydbg, Bz, Stirling, hexedit, etc
↑OSに合わせて選択
25/116
バイナリとは
有名なバイナリエディタ
• Ollydbg, Bz, Stirling, hexedit, etc
↑OSに合わせて選択
実はVimやEmacsでも開ける
(Emacsは使わないので、以下Vimの手順)
• 「-b」オプションを指定すればバイナリモード
• その後、「:%!xxd」とすれば16進ダンプ可能
今日は「積極的に」、Vimを使っていきます!
26/116
Vimは今日使うので この際、他のバイナリエディタも
見てみます
27/116
ファイルの先頭からのアドレスを16進数で
表している
28/116
表示可能文字
ファイルの内容
29/116
Bzエディタは
このようなビットマップ表示できるのが便利だったりします
(実はVimでもできます)
30/116
「熱血バイナリアン十訓」より
一、
まずは読め!
「熱血!アセンブラ入門」より引用
31/116
目次
• バイナリとは
• バイナリに触れてみる
• 実践編
32/116
バイナリに触れてみる
• ELFファイルのヘッダ(Hello World)が
どうなっているか見てみる ↓
/usr/include/elf.h
実行環境:Ubuntu15.04 64bit版
33/116
ELFファイルについて
• 「Executable and Linking Format」
• Linuxディストリビューションの多くで採用されている実行ファイルのこと
(WindowsでいうEXE的な)
• CTFなどでもほぼ必ず出てくる
34/116
ってことで今回は、 ELFがどういう構造をしているのか
見ていきたいと思います
35/116
ELFの構造
ELFヘッダ
プログラムヘッダ
・
・
・
・
・
・
・
・
・
・
・
・
・
・
セクションヘッダ
ELFヘッダ
プログラムヘッダ
データ部分
セクションヘッダ
主にこの4つで構成される
36/116
ELFの構造
ELFヘッダ
プログラムヘッダ
・
・
・
・
・
・
・
・
・
・
・
・
・
・
セクションヘッダ
ELFヘッダ
今回見ていくのは
この部分
37/116
ELFの構造
ELFヘッダ
プログラムヘッダ
・
・
・
・
・
・
・
・
・
・
・
・
・
・
セクションヘッダ
ELFヘッダ
今回見ていくのは
この部分
こっちは今回は
あまり触れません!
38/116
$ vim hello.c
Hello World を書く
39/116
40/116
$ gcc hello.c –o hello コンパイル
41/116
42/116
43/116
$readelf –h でELFヘッダの情報は見ることができます
44/116
でも、なんでこうなるのか 知りたいですよね?
45/116
知りたいですよね!!???
46/116
$ vim /usr/include/elf.h
Vim で elf.h を開く
47/116
48/116
なるほど・・・・
49/116
「熱血バイナリアン十訓」より
一、
勘で読め!
「熱血!アセンブラ入門」より引用
50/116
なるほど!!!!
51/116
・Elf64_Half : 2バイト
・Elf64_Word : 4バイト
・Elf64_Addr : 8バイト
・Elf64_Off : 8バイト
52/116
Half * 8 = 16Byte
Word * 2 = 8Byte
Addr * 1 = 8Byte
Off * 2 = 16Byte
16 + 8 + 8 + 16 = 48
16Byte + 48Byteの64Byteが
64bitのELFヘッダ
EI_NIDENT(なんて読むんでしょう・・?)は、
上の部分でマクロで16と定義していて、さらにunsigned charで宣言しているので、16Byte
53/116
(余談ですが・・・) じゃあ32bitのELFヘッダは
32Byte?
54/116
そう思った方は残念
55/116
実は52Byteだったりします
56/116
・マジックナンバーについて
(マジックナンバーとは、ファイルの識別子として用いられるもの)
57/116
・マジックナンバーについて
(マジックナンバーとは、ファイルの識別子として用いられるもの)
よくわかんないけど、
とにかくこれが
マジックナンバーだろう・・・
58/116
・マジックナンバーについて
(マジックナンバーとは、ファイルの識別子として用いられるもの)
E: 16進数で45
L: 16進数で4c
F: 16進数で46
よって、ELFの
マジックナンバーは
「7f 45 4c 46」のはず
59/116
$ vim –b hello バイナリモード $ :%!xxd 16進ダンプ
60/116
61/116
62/116
\(´∀`) /ワ-イ!!!
63/116
ってことで、どんどん見ていきましょう
64/116
65/116
ファイルのタイプ
を表している
・実行ファイルなら2
下の部分はアーキテクチャ(どういった構成か)
実行環境より、x86-64なので、どこかにないか見ていく
66/116
あっ、あった
x86-64なら62らしい
16進数にして、3e
67/116
よって、Hello Worldは実行ファイルなのでファイルタイプの部分は 2
また、アーキテクチャはx86-64なので
3e になっているはず・・・
68/116
69/116
70/116
それぞれ、Elf64_Halfなので
ファイルタイプとアーキテクチャは2Byteずつ
71/116
ん・・・?
72/116
ちゃんと2Byteずつ 02と3e入ってるけど 格納されてる順番 おかしくね・・・?
73/116
???「はっはっは!!!」
74/116
そ・・・その声は・・・!!
75/116
76/116
ここで出てくるバイトオーダの話
• ビッグエンディアンとリトルエンディアン
(リトルエンディアンってなんかカッコイイですよね)
要は、値をどういう順序で
メモリ上に格納するかということ
そのままの順序なら、ビッグエンディアン
逆順なら、リトルエンディアン
77/116
ここで出てくるバイトオーダの話
• ビッグエンディアン
人間にとってわかりやすい(そのままの順番の為)
• リトルエンディアン
コンピュータにとって処理しやすい
• ところで、バイトオーダって?
2Byte以上(多バイト)のデータをメモリ上に
配置する時の方式のこと
78/116
つまり、こいつは リトルエンディアン
79/116
マジックナンバーの下にかいてあります
80/116
リトルエンディアンなら1らしいです
81/116
リトルエンディアンなら1らしいです
こっちは
32bitの場合は1
64bitの場合は2
ってことが書かれていますね
82/116
83/116
ってことで、64bitで リトルエンディアンなことが
確認できます
84/116
ここら辺のその他の情報も
85/116
ここの部分は
ファイルのバージョン
Value must be EV_CURRENTとあるので、
とにかくEV_CURRENT
でなければならないらしい
86/116
EV_CURRENTは1
87/116
下の部分は
ABI(Application Binary
Interface)を表す
88/116
下の部分は
ABI(Application Binary
Interface)を表す
APIよりもっと低レベルのインターフェース
(システムコール仕様や呼び出し規約など)
89/116
90/116
ってことで、ちゃんとバージョンは 1になっていてABIの部分は0なので
UNIX System V ABI であることがわかる!
91/116
残りはゼロパディング(0で調整みたいな)されている部分です
92/116
ここまでくれば、あとはそのまま
93/116
94/116
先ほども確認したとおり
64bitのELFヘッダは64Byte
で、1行に16Byte * 4 行 = 64Byte
よって、この部分までが
ELFヘッダ
95/116
今まで見てきたのは
ここまで!
96/116
では、ささっと
残りの部分を見ていきましょう
97/116
エントリーポイント(開始位置)
Addrなので8バイト
よって、0x400440とわかる
98/116
プログラムの開始ヘッダ(プログラムヘッダ)
と
セクションヘッダ始点
それぞれ8バイトなので、
0x40と0x19e8とわかる
99/116
フラグは0x0
100/116
ここからはHalf(2バイトずつ)
ELFヘッダのサイズは0x40
(10進数で64なので、最初に確認した通りですね!)
101/116
プログラムヘッダのサイズ
と
プログラムヘッダの数
それぞれ、0x38(56バイト)と9
102/116
セクションヘッダのサイズ
と
セクションヘッダの数
それぞれ、0x40(64バイト)と0x1e(30)
103/116
セクションヘッダ文字列テーブルセクションへのインデックスを表す
0x1b(27)です
104/116
(ノ´・ω・)ノ お疲れ様です
105/116
これでELFヘッダは 完璧ですね!!!
106/116
ってか、これ どんなことに役立つの・・・?
107/116
目次
• バイナリとは
• バイナリに触れてみる
• 実践編
108/116
CTFみたいな 問題を作ったので 一緒に解きましょう
109/116
Decrypt me!!!
(ヒント: ELFファイル)
110/116
「熱血バイナリアン十訓」より
一、
わからなくても気にせず読め!
「熱血!アセンブラ入門」より引用
111/116
では、やりましょう
112/116
まとめ
• バイナリアンとはバイナリ大好きな人
• ELFファイルはELFヘッダやプログラムヘッダなどからできている(それらは構造体で定義されている)
• 64bitのELFヘッダは64Byte
• ELFのマジックナンバーは「7f 45 4c 46」
↑この2つだけ覚えて
帰って頂ければ結構です
113/116
ちょいと、おまけ
114/116
115/116
2進表示も できたりしちゃいます
(バイナリアンならこっちで
読まないと・・・?)
116/116
文字列テーブル
https://docs.oracle.com/cd/E26924_01/html/E25909/chapter6-73709.html
ABI
http://www.wdic.org/w/TECH/ABI
Impressive
http://impressive.sourceforge.net/manual.php#cli
場阿忍愚CTF
http://burningctf.yamatosecurity.com/score/about
ELF
http://docs.oracle.com/cd/E19620-01/805-5821/6j5ga47bq/index.html#chapter6-35342
千田さんSlide
http://www.slideshare.net/codeblue_jp/masaaki-chida-japub
117/116
ご清聴ありがとうございました!