PB173 - Binární programování Linux III. Binární objektové soubory Jiri Slabý Fakulta informatiky Masarykova univerzita 30. 9. 2014 Jiri Slabý (Fakulta informatiky, MU) PB173/03 30.9.2014 1 /20 Obsah cvičení Q Objektové soubory Q ELF 0 libbfd Jiri Slabý (Fakulta informatiky, MU) PB173/03 30. 9. 2014 2120 Sekce 1 Objektové soubory Jiri Slabý (Fakulta informatiky, MU) PB173/03 30. 9. 2014 3/20 Objektové soubory a Vznikají při překladu i linkování • Výstup překladače (gcc -c) • Výstup linkeru jako: • Dynamická knihovna • Spustitelná binárka • Literatura • System V Application Binary Interface (ELF) Jiri Slabý (Fakulta informatiky, MU) PB173/03 30. 9. 2014 4/20 Obsah objektových souborů a Obvykle • Informace o souboru • Cílová architektura, struktura, ... • Kód • Data • Ostatní informace potřebné k běhu/linkování • Relokace, informace o symbolech atd. • Ale také např. • Ladicí informace • Informace o překladači • Tyto informace v oddílech (sekcích) Jiri Slabý (Fakulta informatiky, MU) PB173/03 30. 9. 2014 5/20 Formáty objektových souborů « Několik forem/standardů • a.out (UNIX/starý Linux) • ELF (Linux) • COM (DOS, čistě kód+data, nic víc) • COFF (UNIX, ELF ho převálcoval) • MZ (DOS .exe) • PE (Windows .exe, vychází z COFF) Demo: DosBox a reboot přes COM (ea f o f f 00 f 0) Jiri Slabý (Fakulta informatiky, MU) PB173/03 30. 9. 2014 6/20 Úkol Práce s PE O Stáhněte si nějakou Windows aplikaci • Cokoliv, co je .exe (PE), např. putty O Vypište si informace společné formátům (objdump -f) 0 Vypište si informace závislé na formátu (objdump -p) • Zjistěte DLL, na kterých váš program závisí O Porovnejte sekce s nějakým ELFem (objdump -h) • Jakákoliv binárka z /usr/bin Jiri Slabý (Fakulta informatiky, MU) PB173/03 30. 9. 2014 7/20 Sekce 2 ELF Jiri Slabý (Fakulta informatiky, MU) PB173/03 30. 9. 2014 8/20 ELF Executable and Linkable Formát • Hlavní souborový formát na Linuxu a Přenositelný, relokovatelný, rozšiřitelný • Struktura • ELF hlavička • Hlavičky programové • Při spouštění • Hlavičky sekcí • Při linkování, ladění apod. • Sekce • Odkazovány z obou typů hlaviček a readelf je speciální objdump pro ELF Jiri Slabý (Fakulta informatiky, MU) PB173/03 30. 9. 2014 9/20 ELF hlavička • readelf -h • Magické číslo (0x7f 'E"L"F') • Cílová architektura a stroj • Počty hlaviček Úkol O Vypište ELF hlavičku O Zjistěte počet hlaviček • Programových • Sekcí Jiri Slabý (Fakulta informatiky, MU) PB173/03 30. 9. 2014 10 / 20 Sekce • readelf -S (obsah sekce: readelf -x) • Vytvářené překladačem/linkerem • Čtené překladačem/linkerem/interpretrem a Předdefinované sekce: • .text: kód • .data: nekonstantní data (proměnné) • .rodata: konstantní data (řetězce apod.) a .bss: data, která se inicializují na 0 • . interp: interpretr • . symtab: tabulka symbolů pro ladění (strip) • . dynsym: tabulka symbolů pro dynamický linker • .gnu_debugiink: odkaz na soubor s ladicími informacemi Demo: ukázka sekcí Jiri Slabý (Fakulta informatiky, MU) PB173/03 30.9.2014 11 /20 Úkol Práce se sekcemi O Vytvořte si soubor s puts ("hello") a puts ("world") O Vytvořte si vlastní sekci s daty int_attribute_((section(".data.my_section"))) x = 3; O Vytvořte si vlastní sekci s funkcí (.text.my_section) O Přeložte do .o a poté i slinkujte O Vypište si seznam sekcí v obou souborech (readelf -s) O Vypište si obsah sekcí (readelf -x) • .rodata (zkuste ireadelf -p) 9 V .o: .data.my_section • V .o: .text.my_section (zkuste i objdump -d) Pozn.: tyto soubory nezahazujte. Jiri Slabý (Fakulta informatiky, MU) PB173/03 30. 9. 2014 12/20 Sekce 3 libbfd Jiri Slabý (Fakulta informatiky, MU) PB173/03 30. 9. 2014 13/20 libbfd a Knihovna pro práci s různými binárními formáty (bfd.h) • a.out, ELF, PE, binární, ... • Seznam: const char **bfd_target_list() • A různými architekturami • Seznam: const char **bfd_arch_list() « Dokumentace • https://sourceware.org/binutils/docs/bfd/ o Některá užitečná makra bez dokumentace (jen v bf d. h) • Knihovny při překladu: gcc ... -lbfd -liberty -ldl -lz • První je třeba volat void bfd_init() Jiri Slabý (Fakulta informatiky, MU) PB173/03 30. 9. 2014 14/20 libbfd: chyby Jak zjistit, co se stalo? « Poslední chyba: bfd_error_type bfd_get_error() « Převod na text: const char *bfd_errmsg(bfd_error_type error_tag) Typicky: if (Ibfdjunction (...) ) errx(1, "bfdjunction: %s", bfd_errmsg(bfd_get_error())); Jiri Slabý (Fakulta informatiky, MU) PB173/03 30. 9. 2014 15/20 Úkol Vypište všechny formáty podporované vaší libbf d O Nezapomeňte bf d_init O Zavolejte bf d_target_list O Vypište návratové hodnoty (v cyklu) O Zavolejte bf d_arch_list O Vypište návratové hodnoty (v cyklu) O Přeložte a spusťte Jiri Slabý (Fakulta informatiky, MU) PB173/03 30. 9. 2014 16/20 libbfd: soubory • Otevření • bfd *bfd_openr(const char *file, const char *target) • bfd *bfd_openw(const char *file, const char *target) • Jako target používejte NULL « Ověření • Nutné před prací se souborem • bfd_boolean bfd_check_format(bfd *abfd, bfd_format format) • Jako format používejte bfd_object a Zavření a bfd_boolean bfd_close(bfd *abfd) Příklad (bez ověření chyb): abfd = bfd_openr(file, NULL); bfd_check_format(abfd, bfd_object); bfd_close(abfd); Jiri Slabý (Fakulta informatiky, MU) PB173/03 30. 9. 2014 17/20 Úkol Doplňte otevírání souboru zadaného jako parametr programu O Zavolejte bf d_openr O Zavolejte bfd_check_f ormat O Zavolejte bf d_ciose O Ověřujte návratové hodnoty podle manuálu o Vypisujte chyby při neúspěchu O Přeložte a spusťte Jiri Slabý (Fakulta informatiky, MU) PB173/03 30. 9. 2014 18/20 libbfd: sekce a Iterace: bf d_map_over_sections • Velikost: bf d_get_section_size • Obsah:bfd_get_section_contents a Vytvoření: bfd_make_section_with_f lags • Nastavení velikosti: bf d_set_section_size • Nastavení obsahu: bf d_set_section_contents Jiri Slabý (Fakulta informatiky, MU) PB173/03 30. 9. 2014 19/20 Úkol Hexdump sekcí O Iterujte přes sekce (bf d_map_over_sections) O Vypište údaje o každé sekci • Název • Velikosti • Flagy • Hexdump prvních 16 bytů obsahu O Přeložte O Spusťte • Pro ELF a Pro PE Jiri Slabý (Fakulta informatiky, MU) PB173/03 30. 9. 2014 20/20