SlideShare a Scribd company logo
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

PPT
Glibc malloc internal
PDF
(2021.3) 不均一系触媒研究のための機械学習と最適実験計画
PDF
機械学習による統計的実験計画(ベイズ最適化を中心に)
PDF
初心者向けCTFのWeb分野の強化法
PDF
PWNの超入門 大和セキュリティ神戸 2018-03-25
PDF
CyberAgentのプライベートクラウド Cycloudの運用及びモニタリングについて #CODT2020 / Administration and M...
PDF
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2
PPTX
Spring Fest 2017 「エンタープライズで利用するSpring Boot」#jsug #sf_h1
Glibc malloc internal
(2021.3) 不均一系触媒研究のための機械学習と最適実験計画
機械学習による統計的実験計画(ベイズ最適化を中心に)
初心者向けCTFのWeb分野の強化法
PWNの超入門 大和セキュリティ神戸 2018-03-25
CyberAgentのプライベートクラウド Cycloudの運用及びモニタリングについて #CODT2020 / Administration and M...
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2
Spring Fest 2017 「エンタープライズで利用するSpring Boot」#jsug #sf_h1

What's hot (20)

PDF
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015
PPTX
DockerコンテナでGitを使う
PDF
実践イカパケット解析
PDF
CTF for ビギナーズ バイナリ講習資料
PDF
組み込み関数(intrinsic)によるSIMD入門
PDF
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
PDF
ゲーム開発者のための C++11/C++14
PPTX
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
PDF
Python入門 : 4日間コース社内トレーニング
PPT
整数列圧縮
PDF
コンテナを突き破れ!! ~コンテナセキュリティ入門基礎の基礎~(Kubernetes Novice Tokyo #11 発表資料)
PDF
CTF for ビギナーズ ネットワーク講習資料
PDF
TLS 1.3 と 0-RTT のこわ〜い話
PDF
Singularityで分散深層学習
PDF
VirtualBox と Rocky Linux 8 で始める Pacemaker ~ VirtualBox でも STONITH 機能が試せる! Vi...
PDF
Scapyで作る・解析するパケット
PDF
20分くらいでわかった気分になれるC++20コルーチン
PDF
外部キー制約に伴うロックの小話
PDF
マーク&スイープ勉強会
PDF
ELFの動的リンク
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015
DockerコンテナでGitを使う
実践イカパケット解析
CTF for ビギナーズ バイナリ講習資料
組み込み関数(intrinsic)によるSIMD入門
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
ゲーム開発者のための C++11/C++14
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
Python入門 : 4日間コース社内トレーニング
整数列圧縮
コンテナを突き破れ!! ~コンテナセキュリティ入門基礎の基礎~(Kubernetes Novice Tokyo #11 発表資料)
CTF for ビギナーズ ネットワーク講習資料
TLS 1.3 と 0-RTT のこわ〜い話
Singularityで分散深層学習
VirtualBox と Rocky Linux 8 で始める Pacemaker ~ VirtualBox でも STONITH 機能が試せる! Vi...
Scapyで作る・解析するパケット
20分くらいでわかった気分になれるC++20コルーチン
外部キー制約に伴うロックの小話
マーク&スイープ勉強会
ELFの動的リンク
Ad

More from Eyes, JAPAN (9)

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

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