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.9k
Activities about Kubernetes operation improvements as an SRE
drumato
2
510
DEMO Apps recently implemented
drumato
0
59
Writing an experimental eBPF disassembler
drumato
0
280
An incremental approach to implement an admission controller
drumato
0
170
Components of Kubernetes Cluster
drumato
0
240
cybozu-labs-youth-10th
drumato
1
1k
Other Decks in Technology
See All in Technology
[RSJ24] Object Segmentation from Open-Vocabulary Manipulation Instructions Based on Optimal Transport Polygon Matching with Foundation Models
keio_smilab
PRO
0
120
実践ジオフェンス 効率的に開発するために
navitimejapan
PRO
2
130
[RSJ24] Object Retrieval in Large-Scale Indoor Environments Using Dense Text with a Multi-Modal Large Language Model
keio_smilab
PRO
0
220
スーパーマリオRPGのリメイク版の変更点からみるUX
nishiharatsubasa
1
110
日経電子版から始まった内製開発の現在地と向き合っている課題/inhouse
nishiuma
0
230
LLM を現場で評価する
asei
4
680
エンジニア採用ノウハウ0から継続的な採用に至るまで / Try recruiting engineers
ohageeq
0
130
トレタO/X アーキテクチャ移行記 Next.js App Router化への道のり / TORETA TECH UPDATE 1
okunokentaro
2
560
実践的なバグバウンティ入門
scgajge12
4
2.1k
#Zenoh 完全に理解した 〜組込み純情篇〜
takasehideki
1
450
Hyperledger Fabricの成長、成熟を振り返る / Looking back history of Hyperledger Fabric
gakumura
0
180
音声AIエージェントの世界とRetell AI入門 / Introduction to the World of Voice AI Agents and Retell AI
rkaga
3
470
Featured
See All Featured
Facilitating Awesome Meetings
lara
49
5.9k
What’s in a name? Adding method to the madness
productmarketing
PRO
21
3k
Into the Great Unknown - MozCon
thekraken
28
1.4k
Fashionably flexible responsive web design (full day workshop)
malarkey
400
65k
Building Flexible Design Systems
yeseniaperezcruz
324
37k
Happy Clients
brianwarren
96
6.6k
Making the Leap to Tech Lead
cromwellryan
128
8.8k
Intergalactic Javascript Robots from Outer Space
tanoku
268
26k
What the flash - Photography Introduction
edds
67
11k
The Mythical Team-Month
searls
218
43k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
88
15k
StorybookのUI Testing Handbookを読んだ
zakiyama
25
5k
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)を格納 うきうきで再配置テーブルをダンプすると(以下略
詳細は省略
結論
バイナリにはこういう事 が多い
え?詳細を知りたい?
本を買って、 買ってください!