Разумевање формата датотеке ЕЛФ

Understanding Elf File Format



Од изворног кода до бинарног кода

Програмирање почиње са паметном идејом и писањем изворног кода у програмском језику по вашем избору, на пример Ц, и чувањем изворног кода у датотеци. Уз помоћ одговарајућег компајлера, на пример ГЦЦ -а, ваш изворни код се прво преводи у објектни код. На крају, повезивач преводи код објекта у бинарну датотеку која повезује код објекта са референцираним библиотекама. Ова датотека садржи појединачне инструкције као машински код које ЦПУ разуме, а извршавају се чим се компајлирани програм покрене.

Горе наведена бинарна датотека прати специфичну структуру, а једна од најчешћих се зове ЕЛФ која скраћује извршни и повезиви формат. Широко се користи за извршне датотеке, датотеке објеката које се могу преместити, дељене библиотеке и дупове података.







Пре двадесет година-1999.-пројекат 86опен изабрао је ЕЛФ као стандардни бинарни формат датотеке за Уник и Уник-сличне системе на к86 процесорима. Срећом, формат ЕЛФ је претходно документован и у бинарном интерфејсу апликације Систем В и у стандарду интерфејса алата [4]. Ова чињеница је изузетно поједноставила споразум о стандардизацији између различитих произвођача и програмера Уник заснованих оперативних система.



Разлог за ту одлуку био је дизајн ЕЛФ-а-флексибилност, проширивост и подршка за више платформи за различите ендиан формате и величине адреса. Дизајн ЕЛФ -а није ограничен на одређени процесор, скуп инструкција или хардверску архитектуру. За детаљно поређење извршних формата датотека, погледајте овде [3].



Од тада, ЕЛФ формат користи неколико различитих оперативних система. Између осталог, ово укључује Линук, Соларис/Иллумос, Фрее-, Нет- и ОпенБСД, КНКС, БеОС/Хаику и Фуцхсиа ОС [2]. Надаље, наћи ћете га на мобилним уређајима који користе Андроид, Маемо или Меего ОС/Саилфисх ОС, као и на играћим конзолама попут ПлаиСтатион Портабле, Дреамцаст и Вии.





Спецификација не појашњава екстензију назива датотеке за ЕЛФ датотеке. У употреби су различите комбинације слова, као што су .акф, .бин, .елф, .о, .прк, .пуфф, .ко, .со и .мод, или ниједна.

Структура ЕЛФ датотеке

На Линук терминалу, команда ман елф даје вам згодан резиме о структури ЕЛФ датотеке:



Листа 1: Страница корисника ЕЛФ структуре

$ једанаест

ЕЛФ (5) Приручник за програмере за Линук ЕЛФ (5)

НАМЕ
елф - формат датотека са извршним и повезујућим форматом (ЕЛФ)

СИНОПСИС
#инцлуде

ОПИС
Заглавна датотека дефинише формат извршне бинарне датотеке ЕЛФ
фајлови. Међу овим датотекама су нормалне извршне датотеке које се могу преместити
објектне датотеке, основне датотеке и дељене библиотеке.

Извршна датотека која користи формат датотеке ЕЛФ састоји се од заглавља ЕЛФ,
након чега следи табела заглавља програма или табела заглавља одељка, или обоје.
Заглавље ЕЛФ је увек на нули помака датотеке. Програм
табела заглавља и помак заглавља одељка у датотеци су
дефинисано у ЕЛФ заглављу. Две табеле описују остатак
посебности датотеке.

...

Као што видите из горњег описа, ЕЛФ датотека се састоји од два одељка - ЕЛФ заглавља и података о датотеци. Одељак са подацима о датотеци може се састојати од табеле заглавља програма која описује нулу или више сегмената, табеле заглавља одељка која описује нулу или више одељака, иза које следе подаци на које се упућују уноси из табеле заглавља програма и табеле заглавља одељка. Сваки сегмент садржи информације које су неопходне за извршавање датотеке у току извођења, док одељци садрже важне податке за повезивање и премештање. Слика 1 илуструје ово шематски.

Заглавље ЕЛФ

ЕЛФ заглавље је дугачко 32 бајта и идентификује формат датотеке. Почиње низом од четири јединствена бајта који су 0к7Ф, а затим 0к45, 0к4ц и 0к46 који се преводи у три слова Е, Л и Ф. Између осталих вредности, заглавље такође означава да ли је то ЕЛФ датотека за 32 или 64-битни формат, који користи малу или велику ендианнесс, приказује верзију ЕЛФ-а, као и за који оперативни систем је датотека компилирана ради интеракције са правим апликацијским бинарним интерфејсом (АБИ) и скупом инструкција процесора.

Шестоснимак додира бинарне датотеке изгледа овако:

.Листинг 2: Хекдумп бинарне датотеке

$ хд/уср/бин/тоуцх | глава -5
00000000 7ф 45 4ц 46 02 01 01 00 00 00 00 00 00 00 00 | .ЕЛФ ........... |
00000010 02 00 3е 00 01 00 00 00 е3 25 40 00 00 00 00 00 | ..> ......% @ ..... |
00000020 40 00 00 00 00 00 00 00 28 е4 00 00 00 00 00 00 | @ ....... (....... |
00000030 00 00 00 00 40 00 38 00 09 00 40 00 1б 00 1а 00 | [заштићена е -пошта] @..... |
00000040 06 00 00 00 00 00 00 00 40 00 00 00 00 00 00 | [заштићена е -пошта] |

Дебиан ГНУ/Линук нуди наредбу реаделф која се налази у пакету ГНУ „бинутилс“. У пратњи прекидача -х (кратка верзија за –филе -хеадер) лепо приказује заглавље ЕЛФ датотеке. Листа 3 илуструје ово за команду тоуцх.

.Листинг 3: Приказ заглавља ЕЛФ датотеке

$ реаделф -х/уср/бин/тоуцх
ЕЛФ заглавље:
Магија: 7ф 45 4ц 46 02 01 01 00 00 00 00 00 00 00 00 00
Класа: ЕЛФ64
Подаци: 2 се надопуњују, мали ендиан
Верзија: 1 (актуелна)
ОС / АБИ: УНИКС - Систем В
АБИ верзија: 0
Тип: ЕКСЕЦ (извршна датотека)
Машина: Напредни микро уређаји Кс86-64
Верзија: 0к1
Адреса улазног места: 0к4025е3
Почетак заглавља програма: 64 (бајтова у датотеку)
Почетак заглавља одељка: 58408 (бајтова у датотеку)
Заставе: 0к0
Величина овог заглавља: ​​64 (бајтова)
Величина заглавља програма: 56 (бајтова)
Број заглавља програма: 9
Величина заглавља одељка: 64 (бајтова)
Број заглавља одељака: 27
Индекс табеле стрингова заглавља одељка: 26

Заглавље програма

Заглавље програма приказује сегменте који се користе током извођења и говори систему како да креира слику процеса. Заглавље из листе 2 показује да се ЕЛФ датотека састоји од 9 заглавља програма који имају величину по 56 бајтова, а прво заглавље почиње од бајта 64.

Опет, команда реаделф помаже да се извуку информације из ЕЛФ датотеке. Прекидач -л (скраћено од –програмска заглавља или –сегменти) открива више детаља као што је приказано у листи 4.

.Листинг 4: Приказ информација о заглављима програма

$ реаделф -л/уср/бин/тоуцх

Елф тип датотеке је ЕКСЕЦ (извршна датотека)
Улазна тачка 0к4025е3
Постоји 9 заглавља програма, почевши од помака 64

Заглавља програма:
Тип Оффсет ВиртАддр ПхисАддр
ФилеСиз МемСиз заставице Поравнајте
ПХДР 0к0000000000000040 0к0000000000400040 0к0000000000400040
0к00000000000001ф8 0к00000000000001ф8 Р Е 8
ИНТЕРП 0к0000000000000238 0к0000000000400238 0к0000000000400238
0к000000000000001ц 0к000000000000001ц Р 1
[Тражење програмског тумача: /либ64/лд-линук-к86-64.со.2]
ЛОАД 0к0000000000000000 0к0000000000400000 0к0000000000400000
0к000000000000д494 0к00000000000000499 Р Е 200000
ЛОАД 0к000000000000де10 0к000000000060де10 0к000000000060де10
0к0000000000000524 0к0000000000000748 РВ 200000
ДИНАМИЦ 0к000000000000де28 0к000000000060де28 0к000000000060де28
0к00000000000001д0 0к00000000000001д0 РВ 8
НАПОМЕНА 0к0000000000000254 0к0000000000400254 0к0000000000400254
0к0000000000000044 0к0000000000000044 Р 4
ГНУ_ЕХ_ФРАМЕ 0к000000000000бц40 0к000000000040бц40 0к00000000004040бц40
0к00000000000003а4 0к00000000000003а4 Р 4
ГНУ_СТАЦК 0к0000000000000000 0к000000000000000000 0к0000000000000000
0к000000000000000000 0к000000000000000000 РВ 10
ГНУ_РЕЛРО 0к000000000000де10 0к000000000060де10 0к000000000060де10
0к00000000000001ф0 0к00000000000001ф0 Р 1

Мапирање одељка до сегмента:
Одељци сегмената ...
00
01 .прекид
02 .интерп .ноте.АБИ-таг .ноте.гну.буилд-ид .гну.хасх .динсим .динстр .гну.версион .гну.версион_р .рела.дин .рела.плт .инит .плт .тект .фини. родата .ех_фраме_хдр .ех_фраме
03 .инит_арраи .фини_арраи .јцр .динамиц .гот .гот.плт .дата .бсс
04 .динамичка
05 .ноте.АБИ-таг .ноте.гну.буилд-ид
06 .ех_фраме_хдр
07
08 .инит_арраи .фини_арраи .јцр .динамиц .гот

Заглавље одељка

Трећи део структуре ЕЛФ -а је заглавље одељка. Намера је да наведе појединачне делове бинарног фајла. Прекидач -С (скраћено од –сецтион -хеадерс или –сецтионс) наводи различита заглавља. Што се тиче команде на додир, постоји 27 заглавља одељака, а у листи 5 приказана су само прва четири и само последње. Сваки ред покрива величину одељка, врсту одељка, као и његову адресу и помак меморије.

.Листинг 5: Реаделф открива детаље одељка

$ реаделф -С/уср/бин/тоуцх
Постоји 27 заглавља одељака, почевши од помака 0ке428:

Заглавља одељака:
[Бр] Име Врста Адреса Помак
Величина ЕнтСизе заставице Подаци о вези Поравнајте
[0] НУЛЛ 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[1] .интерп ПРОГБИТС 0000000000400238 00000238
000000000000001ц 0000000000000000 А 0 0 1
[2] .ноте.АБИ-таг НАПОМЕНА 0000000000400254 00000254
0000000000000020 0000000000000000 А 0 0 4
[3] .ноте.гну.буилд-и НАПОМЕНА 0000000000400274 00000274
...
...
[26] .схстртаб СТРТАБ 000000000000000000 0000е334
00000000000000еф 0000000000000000 0 0 1
Кључ до застава:
В (уписивање), А (алоцирање), Кс (извршавање), М (спајање), С (низови), л (велико)
И (инфо), Л (редослед веза), Г (група), Т (ТЛС), Е (искључује), к (непознато)
О (потребна додатна обрада ОС) о (специфична за ОС), п (специфична за процесор)

Алати за анализу ЕЛФ датотеке

Као што сте можда приметили из горњих примера, ГНУ/Линук је обогаћен бројним корисним алатима који вам помажу у анализи ЕЛФ датотеке. Први кандидат којег ћемо погледати је услужни програм за датотеке.

филе приказује основне информације о ЕЛФ датотекама, укључујући архитектуру скупа инструкција за коју је намењен код у датотеци за премештање, извршну датотеку или дељени објекат. У списку 6 вам говори да је/бин/тоуцх 64-битна извршна датотека која прати Линук Стандард Басе (ЛСБ), динамички повезана и израђена за верзију језгра ГНУ/Линук 2.6.32.

.Листинг 6: Основне информације помоћу датотеке

$ филе /бин /тоуцх
/бин/тоуцх: ЕЛФ 64-битна ЛСБ извршна датотека, к86-64, верзија 1 (СИСВ), динамички повезана, тумач/либ64/л,
за ГНУ/Линук 2.6.32, БуилдИД [сха1] = ец08д609е9е8е73д4бе6134541а472ад0еа34502, уклоњен
$

Други кандидат се поново чита. Приказује детаљне информације о ЕЛФ датотеци. Листа прекидача је упоредиво дуга и обухвата све аспекте ЕЛФ формата. Коришћењем прекидача -н (скраћено од –нотес) Листа 7 приказује само одељке белешки који постоје у додиру датотеке -ознаку верзије АБИ -а и низ битова ИД -а израде.

.Листинг 7: Приказ изабраних одељака ЕЛФ датотеке

$ реаделф -н/уср/бин/тоуцх

Приказују се белешке пронађене на помаку датотеке 0к00000254 дужине 0к00000020:
Величина података власника Опис
ГНУ 0к00000010 НТ_ГНУ_АБИ_ТАГ (ознака верзије АБИ)
ОС: Линук, АБИ: 2.6.32

Приказују се белешке пронађене на помаку датотеке 0к00000274 дужине 0к00000024:
Величина података власника Опис
ГНУ 0к00000014 НТ_ГНУ_БУИЛД_ИД (јединствени низ битова за ИД градње)
ИД верзије: ец08д609е9е8е73д4бе6134541а472ад0еа34502

Имајте на уму да под Соларисом и ФрееБСД -ом помоћни програм елфдумп [7] одговара реаделф. Од 2019. није било новог издања или ажурирања од 2003.

Трећи је пакет под називом елфутилс [6] који је чисто доступан за Линук. Пружа алтернативне алате ГНУ Бинутилс -у, а такође дозвољава и проверу ваљаности ЕЛФ датотека. Имајте на уму да сви називи помоћних програма наведених у пакету почињу са еу за „елф утилс“.

На крају, али не најмање важно, поменућемо објдумп. Овај алат је сличан реаделфу, али се фокусира на датотеке објеката. Он пружа сличан опсег информација о ЕЛФ датотекама и другим форматима објеката.

.Листинг 8: Подаци о датотеци извучени од стране објдумп

$ објдумп -ф /бин /тоуцх

/бин/тоуцх: формат датотеке елф64-к86-64
архитектура: и386: к86-64, заставице 0к00000112:
ЕКСЕЦ_П, ХАС_СИМС, Д_ПАГЕД
почетна адреса 0к00000000004025е3

$

Постоји и софтверски пакет под називом „елфкицкерс“ [9] који садржи алате за читање садржаја ЕЛФ датотеке, као и за руковање њоме. Нажалост, број издања је прилично мали, и зато га само спомињемо, а не приказујемо даље примере.

Као програмер, уместо тога можете погледати „пак-утилс“ [10,11]. Овај скуп услужних програма пружа низ алата који помажу у потврђивању ЕЛФ датотека. На пример, думпелф анализира ЕЛФ датотеку и враћа датотеку заглавља Ц која садржи детаље - погледајте слику 2.

Закључак

Захваљујући комбинацији паметног дизајна и одличне документације, ЕЛФ формат функционише веома добро и користи се и након 20 година. Горе приказани услужни програми омогућавају вам увид у ЕЛФ датотеку и омогућавају вам да схватите шта програм ради. Ово су први кораци за анализу софтвера - срећно хаковање!

Линкови и референце
Захвалнице

Писац жели да се захвали Акселу Бекерту на подршци у припреми овог чланка.