Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ELFに蔓延るNULL三姉妹

Ec9465c5a5f2ea26a80db56f9d2f99b0?s=47 Drumato
September 23, 2019

 ELFに蔓延るNULL三姉妹

Ec9465c5a5f2ea26a80db56f9d2f99b0?s=128

Drumato

September 23, 2019
Tweet

More Decks by Drumato

Other Decks in Technology

Transcript

  1. ELFに蔓延る null三姉妹 Drumato

  2. 最近やっていること

  3. 最近やっていること

  4. 前提知識 ・セクション → ELFにおける論理的単位 ・機械語列を格納するセクション→ .text ・データを格納するセクション → .data ・シンボル

    → 高水準言語で扱うメモリに対応した名前 ・変数・定数・関数等々がシンボルに対応する
  5. 前提知識 ・セクションヘッダ → セクションに対応するヘッダ情報 ・セクションとセクションヘッダは一対一で必ず存在 ・シンボルテーブル→シンボルについての情報を格納した配列 ・シンボルはただのメモリアドレスのエイリアス ・可視性やメモリ/ファイル上のサイズはこのテーブルに

  6. 本題

  7. ELFバイナリに潜む 3つの NULL

  8. 適当に書いたCプログラムを 適当にコンパイル& アセンブルしてみる

  9. セクションヘッダテーブルの一部

  10. セクションヘッダテーブルの一部

  11. ◦長女: NULLセクションヘッダ

  12. アセンブラ実装中の私

  13. ん? gccはNULLセクションを 吐いておるけ お気持ち →「GNU ldでリンク出来る 最低限必要なセクションは何か?」 .text → 勿論必要

    .shstrtab →これもマスト .symtab → 無いとエントリポイント(関数)を 指定できないなあ .strtab → mainシンボルがどれか教えないと
  14. こんなんいらんだろ! .text,.symtab,.shstrtab,.strtab だけのバイナリ作っちゃろ

  15. ところで… 各シンボルは自身の所属するセクションを Elf64_Sym.st_ndxというメンバで指定する これは非符号付き16bit整数を用いている。

  16. 私「あたしゃNULLセクションヘッダ なんて用意無いんだよ!」 セクション列の先頭(.text)を示す0を mainシンボルのst_shndxに設定 うきうきでシンボルテーブルをダンプすると…

  17. None
  18. 理由は、 Elf64_Sym.st_shndxにおいて0が 「実体の定義されていないシンボル」を 示すように予約されているから

  19. 私「なるほど、だからNULLセクション ヘッダが必要なのか…」

  20. 私「でもNULLセクションヘッダに 対応するセクションってどうする?」

  21. ◦次女: NULLセクション

  22. 要は 「サイズ0のセクションがある」 ということにしてしまえばいい という考え方

  23. NULLセクションヘッダ→ 全てのメンバが0の ヘッダが確かに存在する (64bitバイナリなら 0x40bytes) NULLセクション→ 1bitも存在しないけどある事にする NULLセクションヘッダを作れば 自動的にNULLセクションが存在することになる

  24. おぉー、バイナリフォーマットっぽい キモい仕様だ

  25. ま、これ以上キモい仕様はないだろ

  26. 待ていっ!

  27. その声はっ…!

  28. ◦ラスボス: NULLシンボル

  29. None
  30. 実体の定義と参照を関連付ける為 に必要な「再配置情報」

  31. それには「再配置テーブル」が必要

  32. ところで… 再配置時アドレス補填の対象となるシンボルを Elf64_Rela.r_infoというメンバの 上位32ビットで表す。 これは非符号付き64bit整数を用いている。

  33. 私「あたしゃNULLシンボルなんて用意無いんだよ!」 Elf64_Rela.r_infoの上位32ビットに シンボルテーブルの先頭である0(main)を格納 うきうきで再配置テーブルをダンプすると(以下略

  34. 詳細は省略

  35. 結論

  36. バイナリにはこういう事 が多い

  37. え?詳細を知りたい?

  38. 本を買って、 買ってください!