Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
ELFに蔓延るNULL三姉妹
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
1
280
DEMO Apps recently implemented
drumato
0
25
Writing an experimental eBPF disassembler
drumato
0
190
An incremental approach to implement an admission controller
drumato
0
110
Components of Kubernetes Cluster
drumato
0
140
cybozu-labs-youth-10th
drumato
1
830
Other Decks in Technology
See All in Technology
ChatGPT for Hacking
anugrahsr
0
2.3k
Red Hatが ひっそりと開発しているOSSデータストア
chiroito
0
110
S3とCloudWatch Logsの見直しから始めるコスト削減 / Cost saving S3 and CloudWatch Logs
shonansurvivors
0
150
OVN-Kubernetes-Introduction-ja-2023-01-27.pdf
orimanabu
1
250
PHPのimmutable arrayとは
hnw
1
150
Raspberry Pi Camera 3 介紹
piepie_tw
PRO
0
120
DNS権威サーバのクラウドサービス向けに行われた攻撃および対策 / DNS Pseudo-Random Subdomain Attack and mitigations
kazeburo
5
1.2k
創業1年目のスタートアップでAWSコストを抑えるために取り組んでいること / How to Keep AWS Costs Down at a Startup
yuj1osm
3
1.9k
Deep dive in Reserved Instance ~脳死推奨量購入からの脱却~
kzkmaeda
0
430
プログラミング支援AI GitHub Copilot すごいの話
moyashi
0
280
re:Inventで発表があったIoT事例の紹介と考察
kizawa2020
0
160
PCI DSS に準拠したシステム開発
yutadayo
0
280
Featured
See All Featured
Design by the Numbers
sachag
271
18k
For a Future-Friendly Web
brad_frost
166
7.7k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
22
1.7k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
31
20k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
120
29k
How to train your dragon (web standard)
notwaldorf
66
4.2k
Side Projects
sachag
451
37k
Statistics for Hackers
jakevdp
785
210k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
29
7.8k
jQuery: Nuts, Bolts and Bling
dougneiner
57
6.6k
GitHub's CSS Performance
jonrohan
1020
430k
Building Your Own Lightsaber
phodgson
96
4.9k
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)を格納 うきうきで再配置テーブルをダンプすると(以下略
詳細は省略
結論
バイナリにはこういう事 が多い
え?詳細を知りたい?
本を買って、 買ってください!