Chapter 01無料公開

はじめに

Drumato
Drumato
2021.08.29に更新

はじめに

挨拶

こんにちは.Drumatoです.
この本はLinux OSなどで標準採用されている,
ELF(Executable and Linkable Format) というbinary formatを理解しつつ,
実際にbinary parsingを楽しんでもらおう,という趣旨のもと執筆されました.
GWだしちょっと書いてみるか,みたいなノリもあります

ELFを理解することで,
一般的には次のような恩恵が得られると思います.

  • toolchainの出力結果が読めるようになる
    • {dynamically, statically} linkedなbinaryを読めるようになります
    • object fileやcore dump, shared libraryもELFに則っています
  • ELFを扱うsoftwareが書けるようになる
    • ELF analyzerやlinker等を作る人にとっては必須の知識です
    • 自作emulator等に興味がある人にとっては特に楽しいかも
      • やっぱり既存toolchainの生成するexecutableを読みたいですよね
  • 他のbinary formatを理解する前段階としても良い
    • ELFはかなりsimpleな構造になっているので,入門者におすすめです
    • PE32+など,別のbinary formatはELFよりよっぽど複雑だが,binary parsingのtipsは活かせる
  • 単にELFの構造について話せる人はあまり多くない
    • 私はELFが好きなので,お友達が増えて私が嬉しいです(何が"一般的な恩恵"なのか)

簡単な自己紹介

筆者のbackgroundがわからないと信用できないかもしれないので,簡単に.

この本でわかること

  • ELF fileの構造
  • Rustでbinary parserを記述するときのtips
  • この本の後,より深く理解するためにやること
    • binary analysisがやりたい人
    • toolchain自作をやりたい人
    • 高級なELF analyzerを作りたい

この本でわからないこと

  • 各属性値がどのような意味を持ち,linker等がどのように解釈するのか
  • ELF sectionの中身の深い話
    • 例えば,x64 branch instructionのformatみたいな,machine codeの話とか
    • dynamic sectionにはこんな情報があって,こういう使われ方をしてるとか
  • Linux kernelがELF loaderをどう実装しているかとか
    • 気になる人はexecve(2)とかを読むといいと思います
  • assemblerがどのようにobject fileを生成しているのか
    • gcc -o等を注意深く観察すると色々わかります
  • ELF analyzerの作り方
    • parserはただbinary representationを読み込むもので,readelfのような高級な機能は持ちません

環境

Linux OS + Rust環境であれば,特に問題なく動きます.
userspace programなので,VMなりWSLなりで普通に動作します.
そこまでplatform sensitiveでもないです.

一応筆者の環境を貼っておきます.

$ uname -a
Linux debian 4.19.0-17-amd64 #1 SMP Debian 4.19.194-3 (2021-07-18) x86_64 GNU/Linux
$ cargo version
cargo 1.54.0 (5ae8d74b3 2021-06-22)

実装

この本で紹介するelf-parserは https://github.com/Drumato/elf-parser-in-rust-book/tree/impl に置いてあります.
これはdemo levelの実装で,実用性はないので注意してください.

注意点

この本では,実際に必要な実装のうち大部分を省いています.
実用的なELF parserを作るためには,

  • 各fieldで許されていない範囲のbyteを見つけたらerror
  • 実装していない形式はpanicではなくerror
  • usabilityを高めるための仕組み

などなど(これ以外にもあります),いくつかの考慮事項があると思います.
が,今回はあくまでも"最小限の理解"を目指すので,これらの多くを無視します.
ご自身で実際に作るときは,software robustnessに注意してください.

また,私はELFの専門家ではありません.
自分の作りたいものを作るために必要最低限な情報だけpick upしてきたので,
すごい詳しい仕様とかにはあまり明るくありません.
"zennにELF parserのこと書いてる記事あんまないし書こうかな"ぐらいの気持ちで書きました.

Rustのもっと良い書き方があるとか,
説明が間違っているみたいなことがあったらぜひスクラップに書いていただけると.
というか,スクラップに自分の書いたELF parserを載っけて盛り上がってくださいね!