6 ポイント 投稿者 GN⁺ 2024-02-03 | 1件のコメント | WhatsAppで共有

バイナリ実行ファイルはどのように構成されているのだろう? 探ってみよう!

  • 実行ファイルは理解不能なものではなく、通常のファイル形式である。
  • LinuxでELFバイナリを扱い、C言語を使うが、他のコンパイル言語でも可能。
  • シンボル(symbol)セクション(section)、**セグメント(segment)**について学ぶ。
  • シンボルは関数名のようなもので、セクションに整理され、セクションはセグメントで構成される。
  • readelf ツールを使ってそれらを調べる。

1段階: テキストエディタで開く!

  • 最も単純な方法でバイナリを見ることができ、"Penguin!" と "ELF" というテキストを確認できる。

2段階: readelf を使ってシンボルテーブルを見る

  • readelf --symbols を使ってシンボルを見ることができる。
  • mainputs_start などのシンボルを確認できる。
  • プログラムは main ではなく _start から始まる。

シンボル

  • プログラムを書くと関数に対するシンボルが生成される。
  • ライブラリから関数を呼び出すとき、その関数のコードを見つけるためにシンボルが必要になる。
  • 静的リンク(static linking)と動的リンク(dynamic linking)によってリンクが行われる。

3段階: objdump を使ってバイナリを見て、セクションについて学ぶ!

  • objdump はバイナリをよりよく見るための方法を提供する。
  • .text.rodata.interp などのセクションを見ることができる。
  • セクションはリンク時に使われ、セグメントは実行時に使われる。

4段階: アセンブリを見る!

  • .text セクションにはアセンブリコードが含まれている。
  • objdump -d を使ってアセンブリコードを見ることができる。

5段階: セグメントを見る!

  • プログラムはセグメント、またはプログラムヘッダで構成されている。
  • readelf --segments を使ってセグメントを見ることができる。
  • セグメントは、プログラムの異なる部分をメモリ上でどのように分離するかを決定する。

魔法ではない!

  • 実行ファイルは魔法ではなく、ELFは他のファイル形式と同じである。
  • readelfnmobjdump を使ってLinuxバイナリを調査できる。

GN⁺の見解

  • この記事は、初級ソフトウェアエンジニアがバイナリ実行ファイルの構造を理解するうえで非常に有益である。
  • シンボル、セクション、セグメントの概念と、それらを調べるためのツール (readelfobjdump) に関する実用的な情報を提供している。
  • プログラムが実際にどのようにメモリにロードされ実行されるのかについての基本的な理解を助ける内容が含まれており、システムプログラミングへの興味をかき立てることができる。

1件のコメント

 
GN⁺ 2024-02-03
Hacker Newsのコメント
  • あるユーザーは、ELF(Executable and Linkable Format)を自分で直接書いてみることを勧めており、これは実行ファイルの基本的な構成要素を理解するのに大いに役立つと述べている。また、この記事は従来のボトムアップ型アプローチではなく、トップダウン型アプローチを求める人にとって有用だという。

  • 別のユーザーは、プログラムは実行時に main から始まると考えがちだが、実際には _start から始まると説明している。_startmain を呼び出すなど、いくつもの重要な処理を行うが、これは C 言語に特化したものではなく、言語に依存しないバイナリのエントリーポイントだという。

  • あるユーザーは、Julia の記事はいつも素晴らしいと言及し、コンパイル済みコードが秘密を隠していないことを strings コマンドの実演によって人々に教える際に良い成果を得たと述べている。

  • あるユーザーは、数学から計算機科学へと学問上のキャリアを移したときにこのテーマを初めて学んだと語り、このような深い探究を後悔したことはなかったと述べている。Julia もまた数学のバックグラウンドを持っており、このようなトップダウンの推論への欲求が数学者たちをこうした実験へと導いたのかもしれないと考えている。

  • あるユーザーは、実行ファイルがプラットフォーム固有であることを踏まえつつ、「実際にポータブルな実行ファイル」がさまざまなプラットフォームで動作できることを証明したときの経験を共有している。これは、Java やクロスプラットフォームライブラリなど、さまざまな方法で解決しようとしてきたクロスプラットフォーム問題の答えが、長い間ずっと私たちの目の前にあったことを意味するという。

  • あるユーザーは、90年代初頭に実行ファイル形式に魅了され、DOS と Windows の実行ファイルビューアを Modula 2 で書いたと語っている。このプログラムは VEXE という名前のシェアウェアとして 1991 年に公開され、クラッカーたちの間で一定の支持を得て、+ORC チュートリアルでも言及されたという。

  • あるユーザーは、バイナリファイルをターミナルに出力するのは悲しみの原因だと述べ、その代わりに hexdump -C を使う方を好むとしている。

  • 複数のユーザーが、このテーマに関する素晴らしいスレッドだと述べている。

  • あるユーザーは、このテーマに関心がある人に向けて、Cosmopolitan と RedBean、そして「αcτµαlly pδrταblε εxεcµταblε (2020)」を読んでみることを勧めている。