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
Activities about Kubernetes operation improvements as an SRE
drumato
2
460
DEMO Apps recently implemented
drumato
0
45
Writing an experimental eBPF disassembler
drumato
0
240
An incremental approach to implement an admission controller
drumato
0
150
Components of Kubernetes Cluster
drumato
0
200
cybozu-labs-youth-10th
drumato
1
970
Other Decks in Technology
See All in Technology
Tableau事例紹介 / Tableau Case Study of Eureka
kazuya_araki_tokyo
1
170
プロデザ! BY リクルート vol.18_リクルートのリサーチ実践組織「リサーチブーストコミュニティ」
recruitengineers
PRO
2
230
元インフラエンジニアに成る / Human Resources to Human Relations
bobtani
2
740
Databricks:『生成AI World Cup』のご案内
databricksjapan
1
130
〜小さく始めて大きく育てる〜データ分析基盤の開発から活用まで
kniino
0
2k
レガシーをぶっ壊せ。AEONで始めるDevRelの話 / Qiita Night 2024-2-22
aeonpeople
3
140
o11y入門_外形監視を利用したWebアプリケーションへの最適なモニタリング_TechBrew
k5k
2
100
人間の尊厳、幸福、アクセシビリティ / 第116回「WEB TOUCH MEETING」アクセシビリティSP
nulabinc
PRO
2
180
日本におけるデータエンジニアリングのこれまでとこれから
foursue
9
2k
アプリがつくるNOT A HOTELブランド
hokuts
0
450
コンテナセキュリティの基本と脅威への対策
kyohmizu
3
680
PHP"オレ"カンファレンスの告知
ysknsid25
0
320
Featured
See All Featured
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
24
2.3k
Building an army of robots
kneath
300
41k
Learning to Love Humans: Emotional Interface Design
aarron
266
39k
Building Applications with DynamoDB
mza
88
5.6k
Stop Working from a Prison Cell
hatefulcrawdad
265
19k
The Pragmatic Product Professional
lauravandoore
24
5.8k
WebSockets: Embracing the real-time Web
robhawkes
59
7k
Designing with Data
zakiwarfel
95
4.8k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
658
120k
We Have a Design System, Now What?
morganepeng
42
6.7k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
118
38k
The Cult of Friendly URLs
andyhume
73
5.7k
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)を格納 うきうきで再配置テーブルをダンプすると(以下略
詳細は省略
結論
バイナリにはこういう事 が多い
え?詳細を知りたい?
本を買って、 買ってください!