ELF
- executable and linkable format.
- Linux の実行ファイルの形式
header
program header
sections
.text // program
.rodata
.data // 書き換え可能な変数 e.g. global, static変数
.bss
section headers
- ELF header
- Prog headers(
e_phnum個ある) - 各 section
- section headers(
e_phnum個ある)
が並んでいる.
ELFの二面性
ELF形式の最大の特徴、つまり ELF を理解する上で重要なポイントは、プログラムの「リンク」と「実行」に応じて二重構造(二面性)が埋め込まれている点にあります。
ELF header
- tips C言語で末尾に U は unsigned
c postfix uでぐぐった
- archによって headerのフォーマットも違う(同じだと思っていた)
i386=x86では offset がu32x64では, offset がu64- 先頭16byteでどっちかはわかる
Program header
segment: section の集まりが順番に並んでいる
- $ readelf: Section to Segment mapping に対応が書いてある
program header : segment のメタ情報
-
p_vadder,p_padder- ユーザープログラムでは一致
- kernel programでは変わる
-
p_filesz: segment size in file(Bytes) -
p_memsz: segment size in memory(Bytes).bssの分(ex. static 変数) が膨れるらしい- 大量にstaticな配列確保すると
p_memsz大きくなる
- 大量にstaticな配列確保すると
-
idea modern alternative readelf CLI
-
type
PT_GNU_STACK: ELFがメモリにロードされた際にどのようにstackをコントロールするのかをシステムに伝えるためのもの- todo
- linux - Is there a way to remove segment GNU_STACK - Stack Overflow
- asm混ぜるとexecutable flag付くらしい, todo 悪いこと?
- todo
PT_GNU_RELRO: dataセグメントの一部である。- pwn で出がちらしい?
-
2022-03-27 GitHub - moshego189/tiny-link: Simple elf linker implementation
