SlideShare a Scribd company logo
1 of 117
Download to read offline
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
ご清聴ありがとうございました!

More Related Content

What's hot

開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)mosa siru
 
katagaitai CTF勉強会 #5 Crypto
katagaitai CTF勉強会 #5 Cryptokatagaitai CTF勉強会 #5 Crypto
katagaitai CTF勉強会 #5 Cryptotrmr
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」Takuto Wada
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなKentaro Matsui
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説murachue
 
シェル芸初心者によるシェル芸入門
シェル芸初心者によるシェル芸入門シェル芸初心者によるシェル芸入門
シェル芸初心者によるシェル芸入門icchy
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!mosa siru
 
人生がときめくAPIテスト自動化 with Karate
人生がときめくAPIテスト自動化 with Karate人生がときめくAPIテスト自動化 with Karate
人生がときめくAPIテスト自動化 with KarateTakanori Suzuki
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織Takafumi ONAKA
 
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介MITSUNARI Shigeo
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjugYahoo!デベロッパーネットワーク
 
Scapyで作る・解析するパケット
Scapyで作る・解析するパケットScapyで作る・解析するパケット
Scapyで作る・解析するパケットTakaaki Hoyo
 
冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safeKumazaki Hiroki
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドAkihiro Suda
 
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門Kohei Tokunaga
 
初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法kazkiti
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれKumazaki Hiroki
 

What's hot (20)

開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)
 
katagaitai CTF勉強会 #5 Crypto
katagaitai CTF勉強会 #5 Cryptokatagaitai CTF勉強会 #5 Crypto
katagaitai CTF勉強会 #5 Crypto
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
 
シェル芸初心者によるシェル芸入門
シェル芸初心者によるシェル芸入門シェル芸初心者によるシェル芸入門
シェル芸初心者によるシェル芸入門
 
入門 シェル実装
入門 シェル実装入門 シェル実装
入門 シェル実装
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
人生がときめくAPIテスト自動化 with Karate
人生がときめくAPIテスト自動化 with Karate人生がときめくAPIテスト自動化 with Karate
人生がときめくAPIテスト自動化 with Karate
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
 
WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介
 
Scapyで作る・解析するパケット
Scapyで作る・解析するパケットScapyで作る・解析するパケット
Scapyで作る・解析するパケット
 
冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safe
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
 
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門
 
初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法
 
Docker Tokyo
Docker TokyoDocker Tokyo
Docker Tokyo
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれ
 

More from Eyes, JAPAN

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

More from 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