PB173 - Binární programování Linux V. ELF II. Jiri Slabý Fakulta informatiky Masarykova univerzita 29. 10. 2015 Jiri Slabý (Fakulta informatiky, MU) PB173/05 29. 10. 2015 1 / 17 ELF Executable and Linkable Format • Hlavní souborový formát na Linuxu • Přenositelný, relokovatelný, rozšiřitelný Jiri Slabý (Fakulta informatiky, MU) PB173/05 29.10.2015 2/ 17 Struktura ELFu • ELF hlavička • Hlavičky sekcí • Popis dat pro linkování, ladění apod. • Pro překladač, debugger, ... • Hlavičky programové • Pohled na data pro spuštění • Pro interpretr • Data o Odkazovány z obou typů hlaviček ELF header Zdroj: wikipedia Jiri Slabý (Fakulta informatiky, MU) PB173/05 29. 10. 2015 3/ 17 Sekce 1 Obsah sekcí Jiri Slabý (Fakulta informatiky, MU) PB173/05 29. 10. 2015 4/17 Obsah sekcí • Závislý na typu sekce (Shdr->sh_type) • Nic, řetězce, kód • Tabulky • Počet položek: Shdr->sh_size / Shdr->sh_entsize • Symbolů • Dynamické Jiri Slabý (Fakulta informatiky, MU) PB173/05 29. 10. 2015 5/ 17 Tabulka řetězců • Typ sekce: Shdr->sh_type == SHT.STRTAB • Řetězce odkazované odjinud • Uložené jako řetězce ukončené nulou • Obsah dostaneme z elf _getdata Příklad sekce Index +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 0 \o i n i t • c \0 c r 10 t s t u f f • c \o 20 _ J C R _ L I S T Demo: readelf -x .strtab -p .strtab Jiri Slabý (Fakulta informatiky, MU) PB173/05 29. 10. 2015 6/17 Tabulka symbolů • Typ sekce: Shdr->sh_type == SHT.SYMTAB nebo SHT.DYNSYM • Jména pro symboly jsou v sekci Shdr->sh_iink • Tabulka o různých „symbolech" • Symbol - GElf _Sym • st.name - jméno Symbolu (index do Shdr->sh_link) • st.value - hodnota symbolu • gelf_st_type (st_inf o) - k čemu se symbol váže (stt.object, stt.func, stt.section, stt.file, . . .) • st.shndx (pro stt.section) - které sekce se symbol týká (může být i shn.undef, shn.abs, . . .) • gelf_getsym(Elf_Data *data, int idx, GElf_Sym *dst) • data - dostaneme Z elf _getdata • idx - x-tý symbol • dst - návratová hodnota Jiri Slabý (Fakulta informatiky, MU) PB173/05 29. 10. 2015 7/17 Úkol Výpis symbolů ze sekcí O Pro všechny sekce typu sht.symtab nebo sht.dynsym O Iterujte přes všechny symboly O U všech vypište jméno symbolu O Pro stt.func vypište navíc hodnotu a index sekce 0 Pro stt.object vypište navíc hodnotu a velikost O Pro stt.section vypište navíc index sekce a hodnotu Jiri Slabý (Fakulta informatiky, MU) PB173/05 29. 10. 2015 8/17 Dynamická tabulka • Typ sekce: Shdr->sh_type == SHT.DYNAMIC • Jména pro symboly jsou v sekci Shdr->sh_iink • Tabulka pro spuštění • Dynamický symbol - GElf _Dyn • d_tag - druh symbolu (dt.needed, dt.init, ...) • d_u.d_ptr - hodnota symbolu (ukazatel) • d_u.d_vai - hodnota symbolu (ostatní) • gelf_getdyn(Elf_Data *data, int idx, GElf_Dyn *dst) • data - dostaneme Z elf _getdata • idx - x-tý dynamický symbol • dst - návratová hodnota Jiri Slabý (Fakulta informatiky, MU) PB173/05 29. 10. 2015 9/17 Úkol Výpis dynamických symbolů O Pro všechny sekce typu sht.dynamic Q Iterujte přes všechny dynamické symboly O Pro dt.needed vypište jméno knihovny (d_vai) O Pro dt.init vypište, kde se má začít (d_ptr) • Podívejte se do kódu, kde to je (objdump -d) O Pro dt.strsz vypište velikost tabulky řetězců (d_vai) Jiri Slabý (Fakulta informatiky, MU) PB173/05 29. 10. 2015 10/ 17 Tabulka relokací • Typ sekce: Shdr->sh_type == SHT.REL a SHT.RELA • Tabulka pro linkování - kde se má co a čím nahradit • Symbol relokace - GElf _Rei a GElf _Reia <* r_of f set - kde nahrazovat (odkaz do sekce č. Shdr->sh_inf o) • gelf_r_type(r_info) - typ (r_x86_64_pc32, r_x86_64_32, .. .) • gelf_r_sym(r_inf o) - za co nahrazovat (v sekci č. Shdr->sh_link) • r.addend (jen rela) - kolik přičíst k symbolu • gelf_getrel(Elf_Data *data, int idx, GElf_Rel *dst) a gelf_getrela(Elf_Data *data, int idx, GElf_Rela *dst) • data - dostaneme Z elf _getdata • idx - x-tý relokační symbol • dst - návratová hodnota Jiri Slabý (Fakulta informatiky, MU) PB173/05 29. 10. 2015 11 / 17 Úkol Výpis relokací O Pro všechny sekce typu sht.rela O Iterujte přes všechny relokace O Pro každou vypište • Č. sekce, která se bude měnit (Shdr->sh_inf o) • Pozici, kde se bude měnit (r_of f set) • Č. symbolu, kterého adresa se použije (gelf_r_sym(r_inf o)) O Vyzkoušejte na .o souboru Jiri Slabý (Fakulta informatiky, MU) PB173/05 29. 10. 2015 12/17 Sekce 2 Programové hlavičky Jiri Slabý (Fakulta informatiky, MU) PB173/05 29. 10. 2015 13/ 17 Programové hlavičky • readelf -1 • Vytvářené linkerem • Čtené jádrem/interpretem • Mapování na sekce • Předdefinované programové hlavičky: • pt.phdr: samotná hlavička • pt.interp: interpretr (.interp) • pt.dynamic: dynamická tabulka (.dynamic) • pt.load: data, kód (.text, .data, . ..) • ... Jiri Slabý (Fakulta informatiky, MU) PB173/05 29. 10. 2015 14/17 Úkol Výpis programových hlaviček O Vypište si programové hlavičky (readelf -1) O Prostudujte, jak se mapují na sekce O Podívejte se, které sekce jsou pro zápis Jiri Slabý (Fakulta informatiky, MU) PB173/05 29. 10. 2015 15/17 libelf Programové hlavičky • Počet: int elf_getphdrnum(Elf *elf, size_t *dst) • Hlavička: GElf_Phdr (gelf.h) • Získání hlavičky: GElf.Phdr *gelf_getphdr(Elf *elf, int idx, GElf.Phdr *dst) • p.type: PT.LOAD, PT.DYNAMIC, PT.INTERP, ... • p_of f set: offset v souboru • p_vaddr: kde bude v paměti • p_f ilesz: velikost v souboru • p.memsz: velikost v paměti (po načtení) Jiri Slabý (Fakulta informatiky, MU) PB173/05 29. 10. 2015 16/17 Úkol Výpis programových hlaviček O Otevřete ELF soubor pro čtení O Vypište interpretr • Může se hodit elf _rawf ile O Vypište programové hlavičky • Typ • Offset v souboru • Kde bude v paměti • Velikost v souboru a v paměti O Přeložte a vyzkoušejte Q Porovnejte S readelf -1 Jiri Slabý (Fakulta informatiky, MU) PB173/05 29.10.2015 17/ 17