Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ELFに蔓延るNULL三姉妹
Search
Drumato
September 23, 2019
Technology
1
2.8k
ELFに蔓延るNULL三姉妹
Drumato
September 23, 2019
Tweet
Share
More Decks by Drumato
See All by Drumato
仕様と実装で学ぶOpenTelemetry
drumato
2
1.8k
Activities about Kubernetes operation improvements as an SRE
drumato
2
500
DEMO Apps recently implemented
drumato
0
57
Writing an experimental eBPF disassembler
drumato
0
270
An incremental approach to implement an admission controller
drumato
0
170
Components of Kubernetes Cluster
drumato
0
220
cybozu-labs-youth-10th
drumato
1
1k
Other Decks in Technology
See All in Technology
フルリモートワークはエンジニアの夢を叶えたか? #cm_odyssey
mamohacy
2
600
Git 研修 Basic【MIXI 24新卒技術研修】
mixi_engineers
PRO
0
310
Azure Pipelinesを使用したCICDベースラインアーキテクチャ実践
yuriemori
0
190
RAGのサービスをリリースして1年3ヶ月が経ちました
segavvy
4
910
ソフトウェアエンジニアリングの知見を活かして データ基盤をいい感じにする on Snowflake [MIERUNE BBQ #10]
mtpooh
2
150
MySQLのロックの種類とその競合
yoku0825
6
1.6k
OSSコミットしてZennの課題を解決した話
dyoshikawa1993
0
150
データ分析を支える技術 生成AI再入門
ishikawa_satoru
0
380
[NIKKEI Tech Talk]Bias for Action!! 実践から学ぶための仕組とコミュニティ / Community for Practice and Learning
kanamasa
0
270
目標設定は好きですか? アジャイルとともに目標と向き合い続ける方法 / Do you like target Management?
kakehashi
10
3k
LINE WORKSへ簡単通知!Incoming Webhookアプリの紹介
mmclsntr
0
110
CEL(Common Expression Language)で書いた条件にマッチしたIAM Policyを見つける / iam-policy-finder
fujiwara3
0
710
Featured
See All Featured
Scaling GitHub
holman
458
140k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
325
21k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
26
1.8k
We Have a Design System, Now What?
morganepeng
46
7k
Into the Great Unknown - MozCon
thekraken
20
1.3k
VelocityConf: Rendering Performance Case Studies
addyosmani
321
23k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
502
140k
Making the Leap to Tech Lead
cromwellryan
127
8.7k
Bash Introduction
62gerente
607
210k
For a Future-Friendly Web
brad_frost
173
9.2k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
121
18k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
360
22k
Transcript
ELFに蔓延る null三姉妹 Drumato
最近やっていること
最近やっていること
前提知識 ・セクション → ELFにおける論理的単位 ・機械語列を格納するセクション→ .text ・データを格納するセクション → .data ・シンボル
→ 高水準言語で扱うメモリに対応した名前 ・変数・定数・関数等々がシンボルに対応する
前提知識 ・セクションヘッダ → セクションに対応するヘッダ情報 ・セクションとセクションヘッダは一対一で必ず存在 ・シンボルテーブル→シンボルについての情報を格納した配列 ・シンボルはただのメモリアドレスのエイリアス ・可視性やメモリ/ファイル上のサイズはこのテーブルに
本題
ELFバイナリに潜む 3つの NULL
適当に書いたCプログラムを 適当にコンパイル& アセンブルしてみる
セクションヘッダテーブルの一部
セクションヘッダテーブルの一部
◦長女: NULLセクションヘッダ
アセンブラ実装中の私
ん? gccはNULLセクションを 吐いておるけ お気持ち →「GNU ldでリンク出来る 最低限必要なセクションは何か?」 .text → 勿論必要
.shstrtab →これもマスト .symtab → 無いとエントリポイント(関数)を 指定できないなあ .strtab → mainシンボルがどれか教えないと
こんなんいらんだろ! .text,.symtab,.shstrtab,.strtab だけのバイナリ作っちゃろ
ところで… 各シンボルは自身の所属するセクションを Elf64_Sym.st_ndxというメンバで指定する これは非符号付き16bit整数を用いている。
私「あたしゃNULLセクションヘッダ なんて用意無いんだよ!」 セクション列の先頭(.text)を示す0を mainシンボルのst_shndxに設定 うきうきでシンボルテーブルをダンプすると…
None
理由は、 Elf64_Sym.st_shndxにおいて0が 「実体の定義されていないシンボル」を 示すように予約されているから
私「なるほど、だからNULLセクション ヘッダが必要なのか…」
私「でもNULLセクションヘッダに 対応するセクションってどうする?」
◦次女: NULLセクション
要は 「サイズ0のセクションがある」 ということにしてしまえばいい という考え方
NULLセクションヘッダ→ 全てのメンバが0の ヘッダが確かに存在する (64bitバイナリなら 0x40bytes) NULLセクション→ 1bitも存在しないけどある事にする NULLセクションヘッダを作れば 自動的にNULLセクションが存在することになる
おぉー、バイナリフォーマットっぽい キモい仕様だ
ま、これ以上キモい仕様はないだろ
待ていっ!
その声はっ…!
◦ラスボス: NULLシンボル
None
実体の定義と参照を関連付ける為 に必要な「再配置情報」
それには「再配置テーブル」が必要
ところで… 再配置時アドレス補填の対象となるシンボルを Elf64_Rela.r_infoというメンバの 上位32ビットで表す。 これは非符号付き64bit整数を用いている。
私「あたしゃNULLシンボルなんて用意無いんだよ!」 Elf64_Rela.r_infoの上位32ビットに シンボルテーブルの先頭である0(main)を格納 うきうきで再配置テーブルをダンプすると(以下略
詳細は省略
結論
バイナリにはこういう事 が多い
え?詳細を知りたい?
本を買って、 買ってください!