バイナリアンを目指して For a binaryen

117
1/116 バイナリアンを目指して - For a binaryen - 兼澤 侑也 - Yuya Kanesawa -

Transcript of バイナリアンを目指して For a binaryen

Page 1: バイナリアンを目指して For a binaryen

1/116

バイナリアンを目指して - For a binaryen -

兼澤 侑也 - Yuya Kanesawa -

Page 2: バイナリアンを目指して For a binaryen

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.)

Page 3: バイナリアンを目指して For a binaryen

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.)

Page 4: バイナリアンを目指して For a binaryen

4/116

Page 5: バイナリアンを目指して For a binaryen

5/116

Whooooooooooooo!!!! ワ―――ヽ(・∀・)ノ―――イ

Page 6: バイナリアンを目指して For a binaryen

6/116

ゴゴゴゴゴゴゴゴ・・・・・・・

Page 7: バイナリアンを目指して For a binaryen

7/116

次はお前だ!!!!

Page 8: バイナリアンを目指して For a binaryen

8/116

本題に入ります

Page 9: バイナリアンを目指して For a binaryen

9/116

そもそもバイナリアンって?

Page 10: バイナリアンを目指して For a binaryen

10/116

Page 11: バイナリアンを目指して For a binaryen

11/116

Page 12: バイナリアンを目指して For a binaryen

12/116

なんでバイナリ?

• 大和セキュリティ場阿忍愚CTFに参加

• 金子さんから聞いた「千田さん」

• 2年生になってから

Page 13: バイナリアンを目指して For a binaryen

13/116

なんでバイナリ?

• 大和セキュリティ場阿忍愚CTFに参加

• 金子さんから聞いた「千田さん」

• 2年生になってから

Page 14: バイナリアンを目指して For a binaryen

14/116

Page 15: バイナリアンを目指して For a binaryen

15/116

なんでバイナリ?

• 大和セキュリティ場阿忍愚CTFに参加

• 金子さんから聞いた「千田さん」

• 2年生になってから

Page 16: バイナリアンを目指して For a binaryen

16/116

Page 17: バイナリアンを目指して For a binaryen

17/116

なんでバイナリ?

• 大和セキュリティ場阿忍愚CTFに参加

• 金子さんから聞いた「千田さん」

• 2年生になってから

Page 18: バイナリアンを目指して For a binaryen

18/116

↑の本や、Webサイトなどで 勉強していました

Page 19: バイナリアンを目指して For a binaryen

19/116

目的

• バイナリって難しそう・・・・

• バイナリってなにが面白いの・・・?

このような人達に

「バイナリって楽しいよ!」と伝えたい

もし興味を持って頂けたら

一緒にバイナリアンを目指しましょう

Page 20: バイナリアンを目指して For a binaryen

20/116

目次

• バイナリとは

• バイナリに触れてみる

• 実践編

Page 21: バイナリアンを目指して For a binaryen

21/116

目次

• バイナリとは

• バイナリに触れてみる

• 実践編

Page 22: バイナリアンを目指して For a binaryen

22/116

バイナリとは

• 「binary」とは「2進数の」という意味

• 0と1で表現されているデータ形式を「バイナリファイル」など

• 実行ファイル、音声ファイル、画像ファイルなども、バイナリファイル

• データ構造の2分木は、バイナリツリーと呼ばれる(2つに分岐しているから)

Page 23: バイナリアンを目指して For a binaryen

23/116

バイナリとは

• バイナリファイルは「バイナリエディタ」などで開く

• テキストエディタでは、ほぼ無理

Page 24: バイナリアンを目指して For a binaryen

24/116

バイナリとは

有名なバイナリエディタ

• Ollydbg, Bz, Stirling, hexedit, etc

↑OSに合わせて選択

Page 25: バイナリアンを目指して For a binaryen

25/116

バイナリとは

有名なバイナリエディタ

• Ollydbg, Bz, Stirling, hexedit, etc

↑OSに合わせて選択

実はVimやEmacsでも開ける

(Emacsは使わないので、以下Vimの手順)

• 「-b」オプションを指定すればバイナリモード

• その後、「:%!xxd」とすれば16進ダンプ可能

今日は「積極的に」、Vimを使っていきます!

Page 26: バイナリアンを目指して For a binaryen

26/116

Vimは今日使うので この際、他のバイナリエディタも

見てみます

Page 27: バイナリアンを目指して For a binaryen

27/116

ファイルの先頭からのアドレスを16進数で

表している

Page 28: バイナリアンを目指して For a binaryen

28/116

表示可能文字

ファイルの内容

Page 29: バイナリアンを目指して For a binaryen

29/116

Bzエディタは

このようなビットマップ表示できるのが便利だったりします

(実はVimでもできます)

Page 30: バイナリアンを目指して For a binaryen

30/116

「熱血バイナリアン十訓」より

一、

まずは読め!

「熱血!アセンブラ入門」より引用

Page 31: バイナリアンを目指して For a binaryen

31/116

目次

• バイナリとは

• バイナリに触れてみる

• 実践編

Page 32: バイナリアンを目指して For a binaryen

32/116

バイナリに触れてみる

• ELFファイルのヘッダ(Hello World)が

どうなっているか見てみる ↓

/usr/include/elf.h

実行環境:Ubuntu15.04 64bit版

Page 33: バイナリアンを目指して For a binaryen

33/116

ELFファイルについて

• 「Executable and Linking Format」

• Linuxディストリビューションの多くで採用されている実行ファイルのこと

(WindowsでいうEXE的な)

• CTFなどでもほぼ必ず出てくる

Page 34: バイナリアンを目指して For a binaryen

34/116

ってことで今回は、 ELFがどういう構造をしているのか

見ていきたいと思います

Page 35: バイナリアンを目指して For a binaryen

35/116

ELFの構造

ELFヘッダ

プログラムヘッダ

セクションヘッダ

ELFヘッダ

プログラムヘッダ

データ部分

セクションヘッダ

主にこの4つで構成される

Page 36: バイナリアンを目指して For a binaryen

36/116

ELFの構造

ELFヘッダ

プログラムヘッダ

セクションヘッダ

ELFヘッダ

今回見ていくのは

この部分

Page 37: バイナリアンを目指して For a binaryen

37/116

ELFの構造

ELFヘッダ

プログラムヘッダ

セクションヘッダ

ELFヘッダ

今回見ていくのは

この部分

こっちは今回は

あまり触れません!

Page 38: バイナリアンを目指して For a binaryen

38/116

$ vim hello.c

Hello World を書く

Page 39: バイナリアンを目指して For a binaryen

39/116

Page 40: バイナリアンを目指して For a binaryen

40/116

$ gcc hello.c –o hello コンパイル

Page 41: バイナリアンを目指して For a binaryen

41/116

Page 42: バイナリアンを目指して For a binaryen

42/116

Page 43: バイナリアンを目指して For a binaryen

43/116

$readelf –h でELFヘッダの情報は見ることができます

Page 44: バイナリアンを目指して For a binaryen

44/116

でも、なんでこうなるのか 知りたいですよね?

Page 45: バイナリアンを目指して For a binaryen

45/116

知りたいですよね!!???

Page 46: バイナリアンを目指して For a binaryen

46/116

$ vim /usr/include/elf.h

Vim で elf.h を開く

Page 47: バイナリアンを目指して For a binaryen

47/116

Page 48: バイナリアンを目指して For a binaryen

48/116

なるほど・・・・

Page 49: バイナリアンを目指して For a binaryen

49/116

「熱血バイナリアン十訓」より

一、

勘で読め!

「熱血!アセンブラ入門」より引用

Page 50: バイナリアンを目指して For a binaryen

50/116

なるほど!!!!

Page 51: バイナリアンを目指して For a binaryen

51/116

・Elf64_Half : 2バイト

・Elf64_Word : 4バイト

・Elf64_Addr : 8バイト

・Elf64_Off : 8バイト

Page 52: バイナリアンを目指して For a binaryen

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

Page 53: バイナリアンを目指して For a binaryen

53/116

(余談ですが・・・) じゃあ32bitのELFヘッダは

32Byte?

Page 54: バイナリアンを目指して For a binaryen

54/116

そう思った方は残念

Page 55: バイナリアンを目指して For a binaryen

55/116

実は52Byteだったりします

Page 56: バイナリアンを目指して For a binaryen

56/116

・マジックナンバーについて

(マジックナンバーとは、ファイルの識別子として用いられるもの)

Page 57: バイナリアンを目指して For a binaryen

57/116

・マジックナンバーについて

(マジックナンバーとは、ファイルの識別子として用いられるもの)

よくわかんないけど、

とにかくこれが

マジックナンバーだろう・・・

Page 58: バイナリアンを目指して For a binaryen

58/116

・マジックナンバーについて

(マジックナンバーとは、ファイルの識別子として用いられるもの)

E: 16進数で45

L: 16進数で4c

F: 16進数で46

よって、ELFの

マジックナンバーは

「7f 45 4c 46」のはず

Page 59: バイナリアンを目指して For a binaryen

59/116

$ vim –b hello バイナリモード $ :%!xxd 16進ダンプ

Page 60: バイナリアンを目指して For a binaryen

60/116

Page 61: バイナリアンを目指して For a binaryen

61/116

Page 62: バイナリアンを目指して For a binaryen

62/116

\(´∀`) /ワ-イ!!!

Page 63: バイナリアンを目指して For a binaryen

63/116

ってことで、どんどん見ていきましょう

Page 64: バイナリアンを目指して For a binaryen

64/116

Page 65: バイナリアンを目指して For a binaryen

65/116

ファイルのタイプ

を表している

・実行ファイルなら2

下の部分はアーキテクチャ(どういった構成か)

実行環境より、x86-64なので、どこかにないか見ていく

Page 66: バイナリアンを目指して For a binaryen

66/116

あっ、あった

x86-64なら62らしい

16進数にして、3e

Page 67: バイナリアンを目指して For a binaryen

67/116

よって、Hello Worldは実行ファイルなのでファイルタイプの部分は 2

また、アーキテクチャはx86-64なので

3e になっているはず・・・

Page 68: バイナリアンを目指して For a binaryen

68/116

Page 69: バイナリアンを目指して For a binaryen

69/116

Page 70: バイナリアンを目指して For a binaryen

70/116

それぞれ、Elf64_Halfなので

ファイルタイプとアーキテクチャは2Byteずつ

Page 71: バイナリアンを目指して For a binaryen

71/116

ん・・・?

Page 72: バイナリアンを目指して For a binaryen

72/116

ちゃんと2Byteずつ 02と3e入ってるけど 格納されてる順番 おかしくね・・・?

Page 73: バイナリアンを目指して For a binaryen

73/116

???「はっはっは!!!」

Page 74: バイナリアンを目指して For a binaryen

74/116

そ・・・その声は・・・!!

Page 75: バイナリアンを目指して For a binaryen

75/116

Page 76: バイナリアンを目指して For a binaryen

76/116

ここで出てくるバイトオーダの話

• ビッグエンディアンとリトルエンディアン

(リトルエンディアンってなんかカッコイイですよね)

要は、値をどういう順序で

メモリ上に格納するかということ

そのままの順序なら、ビッグエンディアン

逆順なら、リトルエンディアン

Page 77: バイナリアンを目指して For a binaryen

77/116

ここで出てくるバイトオーダの話

• ビッグエンディアン

人間にとってわかりやすい(そのままの順番の為)

• リトルエンディアン

コンピュータにとって処理しやすい

• ところで、バイトオーダって?

2Byte以上(多バイト)のデータをメモリ上に

配置する時の方式のこと

Page 78: バイナリアンを目指して For a binaryen

78/116

つまり、こいつは リトルエンディアン

Page 79: バイナリアンを目指して For a binaryen

79/116

マジックナンバーの下にかいてあります

Page 80: バイナリアンを目指して For a binaryen

80/116

リトルエンディアンなら1らしいです

Page 81: バイナリアンを目指して For a binaryen

81/116

リトルエンディアンなら1らしいです

こっちは

32bitの場合は1

64bitの場合は2

ってことが書かれていますね

Page 82: バイナリアンを目指して For a binaryen

82/116

Page 83: バイナリアンを目指して For a binaryen

83/116

ってことで、64bitで リトルエンディアンなことが

確認できます

Page 84: バイナリアンを目指して For a binaryen

84/116

ここら辺のその他の情報も

Page 85: バイナリアンを目指して For a binaryen

85/116

ここの部分は

ファイルのバージョン

Value must be EV_CURRENTとあるので、

とにかくEV_CURRENT

でなければならないらしい

Page 86: バイナリアンを目指して For a binaryen

86/116

EV_CURRENTは1

Page 87: バイナリアンを目指して For a binaryen

87/116

下の部分は

ABI(Application Binary

Interface)を表す

Page 88: バイナリアンを目指して For a binaryen

88/116

下の部分は

ABI(Application Binary

Interface)を表す

APIよりもっと低レベルのインターフェース

(システムコール仕様や呼び出し規約など)

Page 89: バイナリアンを目指して For a binaryen

89/116

Page 90: バイナリアンを目指して For a binaryen

90/116

ってことで、ちゃんとバージョンは 1になっていてABIの部分は0なので

UNIX System V ABI であることがわかる!

Page 91: バイナリアンを目指して For a binaryen

91/116

残りはゼロパディング(0で調整みたいな)されている部分です

Page 92: バイナリアンを目指して For a binaryen

92/116

ここまでくれば、あとはそのまま

Page 93: バイナリアンを目指して For a binaryen

93/116

Page 94: バイナリアンを目指して For a binaryen

94/116

先ほども確認したとおり

64bitのELFヘッダは64Byte

で、1行に16Byte * 4 行 = 64Byte

よって、この部分までが

ELFヘッダ

Page 95: バイナリアンを目指して For a binaryen

95/116

今まで見てきたのは

ここまで!

Page 96: バイナリアンを目指して For a binaryen

96/116

では、ささっと

残りの部分を見ていきましょう

Page 97: バイナリアンを目指して For a binaryen

97/116

エントリーポイント(開始位置)

Addrなので8バイト

よって、0x400440とわかる

Page 98: バイナリアンを目指して For a binaryen

98/116

プログラムの開始ヘッダ(プログラムヘッダ)

セクションヘッダ始点

それぞれ8バイトなので、

0x40と0x19e8とわかる

Page 99: バイナリアンを目指して For a binaryen

99/116

フラグは0x0

Page 100: バイナリアンを目指して For a binaryen

100/116

ここからはHalf(2バイトずつ)

ELFヘッダのサイズは0x40

(10進数で64なので、最初に確認した通りですね!)

Page 101: バイナリアンを目指して For a binaryen

101/116

プログラムヘッダのサイズ

プログラムヘッダの数

それぞれ、0x38(56バイト)と9

Page 102: バイナリアンを目指して For a binaryen

102/116

セクションヘッダのサイズ

セクションヘッダの数

それぞれ、0x40(64バイト)と0x1e(30)

Page 103: バイナリアンを目指して For a binaryen

103/116

セクションヘッダ文字列テーブルセクションへのインデックスを表す

0x1b(27)です

Page 104: バイナリアンを目指して For a binaryen

104/116

(ノ´・ω・)ノ お疲れ様です

Page 105: バイナリアンを目指して For a binaryen

105/116

これでELFヘッダは 完璧ですね!!!

Page 106: バイナリアンを目指して For a binaryen

106/116

ってか、これ どんなことに役立つの・・・?

Page 107: バイナリアンを目指して For a binaryen

107/116

目次

• バイナリとは

• バイナリに触れてみる

• 実践編

Page 108: バイナリアンを目指して For a binaryen

108/116

CTFみたいな 問題を作ったので 一緒に解きましょう

Page 109: バイナリアンを目指して For a binaryen

109/116

Decrypt me!!!

(ヒント: ELFファイル)

Page 110: バイナリアンを目指して For a binaryen

110/116

「熱血バイナリアン十訓」より

一、

わからなくても気にせず読め!

「熱血!アセンブラ入門」より引用

Page 111: バイナリアンを目指して For a binaryen

111/116

では、やりましょう

Page 112: バイナリアンを目指して For a binaryen

112/116

まとめ

• バイナリアンとはバイナリ大好きな人

• ELFファイルはELFヘッダやプログラムヘッダなどからできている(それらは構造体で定義されている)

• 64bitのELFヘッダは64Byte

• ELFのマジックナンバーは「7f 45 4c 46」

↑この2つだけ覚えて

帰って頂ければ結構です

Page 113: バイナリアンを目指して For a binaryen

113/116

ちょいと、おまけ

Page 114: バイナリアンを目指して For a binaryen

114/116

Page 115: バイナリアンを目指して For a binaryen

115/116

2進表示も できたりしちゃいます

(バイナリアンならこっちで

読まないと・・・?)

Page 116: バイナリアンを目指して For a binaryen

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

Page 117: バイナリアンを目指して For a binaryen

117/116

ご清聴ありがとうございました!