PB173 - Binární programování Linux V. ELF II. Jiri Slabý Fakulta informatiky Masarykova univerzita 18. 10. 2016 Jiri Slabý (Fakulta informatiky, MU) PB173/05 18. 10. 2016 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 18. 10. 2016 2/17 Struktura ELFu • ELF hlavička 9 Hlavičky sekcí • Popis dat pro linkování, ladění apod. o Pro překladač, debugger, ... o Hlavičky programové • Pohled na data pro spuštění • Pro interpretr • Data • Odkazovány z obou typů hlaviček Jiri Slabý (Fakulta informatiky, MU) PB173/05 18. 10. 2016 3/17 Sekce 1 Obsah sekcí Jiri Slabý (Fakulta informatiky, MU) PB173/05 18. 10. 2016 4/17 Obsah sekcí • Závislý na typu sekce (Shdr->sh_type) Nic (sht.null) • Pro spuštění (sht.progbits) o Tabulky (sht_*tab) • Počet položek: Shdr->sh_size / Shdr->sh_entsize Symbolů Dynamické Jiri Slabý (Fakulta informatiky MU) PB 173/05 18.10.2016 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 \o 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 18. 10. 2016 6/17 Tabulka symbolů • Typ sekce: Shdr->sh_type == SHT.SYMTAB nebo SHT.DYNSYM • Dump: readelf --syms • Tabulka s různými „symboly" 9 Symbol - GElf _Sym • st_name - jméno Symbolu (offset do Shdr->sh_link) • st_vaiue - 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 shnjjndef, 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 18. 10. 2016 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 9 0 .. Shdr->sh_size / Shdr->sh_entsize O U všech vypište jméno symbolu (elf _strptr) O Pro typ stt.func vypište navíc • Adresu (st_vaiue) a index sekce, ve které je (st_shndx) O Pro typ stt_object vypište navíc • Hodnotu (st_value) a velikost (st_size) O Pro typ stt.section vypište navíc • Hodnotu (st_vaiue) a index sekce (st_shndx) Jiri Slabý (Fakulta informatiky, MU) PB173/05 18. 10. 2016 8/17 Dynamická tabulka • Typ sekce: Shdr->sh_type == SHT.DYNAMIC • Dump: readelf --dynamic o Tabulka pro spuštění • Dynamický symbol - GElf _Dyn 9 d_tag - druh symbolu (dt_needed, dt_init, ...) • d_u.d_ptr - hodnota symbolu (ukazatel) • d_u.d_vai - hodnota symbolu (ostatní) • Pro jména: offset do sekce Shdr->sh_iink • 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 18. 10. 2016 9/17 Úkol Výpis dynamických symbolů O Pro všechny sekce typu sht.dynamic O Iterujte přes všechny dynamické symboly O Pro dt.needed vypište jméno knihovny (elf _strptr a d_val) 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) PB 173/05 18. 10. 2016 10/17 Tabulka relokací O Typ sekce: Shdr->sh_type == SHT.REL a SHT.RELA Dump: readelf -r • 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 9 idx - x-tý relokační symbol • dst - návratová hodnota Jiri Slabý (Fakulta informatiky MU) PB173/05 18. 10. 2016 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 18. 10. 2016 12/17 Sekce 2 Programové hlavičky Jiri Slabý (Fakulta informatiky MU) PB 173/05 18. 10. 2016 13/17 Programové hlavičky • readelf -1 9 Vytvářené linkerem • Ctené 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_L0AD: data, kód (.text, .data, .. .) «... Jiri Slabý (Fakulta informatiky MU) PB173/05 18. 10. 2016 14/17 Úkol Výpis programových hlaviček O Vypište si programové hlavičky (readelf -i) O Prostudujte, jak se mapují na sekce O Podívejte se, které sekce jsou pro zápis Jiri Slabý (Fakulta informatiky MU) PB173/05 18. 10. 2016 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_L0AD, 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 18. 10. 2016 16/17 Úkol Výpis programových hlaviček O Otevřete ELF soubor pro čtení O Vypište interpretr o 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 O Porovnejte S readelf -i Jiri Slabý (Fakulta informatiky, MU) PB173/05 18.10.2016 17/17