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

Post on 15-Apr-2017

670 views 1 download

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

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

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