SlideShare una empresa de Scribd logo
1 de 117
Descargar para leer sin conexión
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
ご清聴ありがとうございました!

Más contenido relacionado

La actualidad más candente

日本語テストメソッドについて
日本語テストメソッドについて日本語テストメソッドについて
日本語テストメソッドについて
kumake
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
Yoji Kanno
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
 
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Preferred Networks
 

La actualidad más candente (20)

CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
 
オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫
 
初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
CTF for ビギナーズ バイナリ講習資料
CTF for ビギナーズ バイナリ講習資料CTF for ビギナーズ バイナリ講習資料
CTF for ビギナーズ バイナリ講習資料
 
実践イカパケット解析
実践イカパケット解析実践イカパケット解析
実践イカパケット解析
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 
日本語テストメソッドについて
日本語テストメソッドについて日本語テストメソッドについて
日本語テストメソッドについて
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
 
Python 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそうPython 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそう
 
Glibc malloc internal
Glibc malloc internalGlibc malloc internal
Glibc malloc internal
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
 
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
 
30分で分かる!OSの作り方
30分で分かる!OSの作り方30分で分かる!OSの作り方
30分で分かる!OSの作り方
 
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
 

Más de Eyes, JAPAN

Enigma
EnigmaEnigma
Enigma
Eyes, JAPAN
 

Más de Eyes, JAPAN (9)

お前のWebカメラ、大丈夫か?
お前のWebカメラ、大丈夫か?お前のWebカメラ、大丈夫か?
お前のWebカメラ、大丈夫か?
 
P進と僕
P進と僕P進と僕
P進と僕
 
ぼくがかんがえたさいきょうのキーボード配列
ぼくがかんがえたさいきょうのキーボード配列ぼくがかんがえたさいきょうのキーボード配列
ぼくがかんがえたさいきょうのキーボード配列
 
Enigma
EnigmaEnigma
Enigma
 
人工知能の歴史 & HTM
人工知能の歴史 & HTM人工知能の歴史 & HTM
人工知能の歴史 & HTM
 
ソフトウェア設計 はじめの一歩
ソフトウェア設計 はじめの一歩ソフトウェア設計 はじめの一歩
ソフトウェア設計 はじめの一歩
 
Teamwork
TeamworkTeamwork
Teamwork
 
わかるコードを書くために For writing clean code
わかるコードを書くために For writing clean codeわかるコードを書くために For writing clean code
わかるコードを書くために For writing clean code
 
ハイパフォーマンスなウェブサイトの作り方 - Eyes, JAPAN
ハイパフォーマンスなウェブサイトの作り方 - Eyes, JAPANハイパフォーマンスなウェブサイトの作り方 - Eyes, JAPAN
ハイパフォーマンスなウェブサイトの作り方 - Eyes, JAPAN
 

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