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

ELFに蔓延るNULL三姉妹

Drumato
September 23, 2019

 ELFに蔓延るNULL三姉妹

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. 本を買って、 買ってください!