Treść książki

Przejdź do opcji czytnikaPrzejdź do nawigacjiPrzejdź do informacjiPrzejdź do stopki
(ET_DYN)jestzarezerwowanadlabibliotek,alerównieżdlaprogramówwykonywalnych.Wartość„4”oznaczaspecjalnyplikcore,
zawierającyinformacjeostanieprogramuwmomenciejegoawarii.
Przyinterpretacjidanychztegopolawartozwrócićuwagęnato,żewartość„3”(ET_DYN)możebyćstosowanadooznaczenia
zarównoplikówwykonywalnych,jakibibliotek,przyczymjegowykorzystanieprzyplikachwykonywalnychzaczęłobyćbardziej
popularnestosunkowoniedawno.ProgramyoznaczonewtensposóbmusząmiećkodPIC(
PositionIndependentCode
,któremubędzie
poświęconyjedenpunkt).WykorzystanieET_DYNdoopisuprogramówwykonywalnychjestpopularnem.in.nanowszychsystemach
OpenBSD,znanyjestteżprzypadekgenerowaniatakoznaczonychplikówwykonywalnychprzezkompilatorjęzykaRust.
Adres0x12przechowujedwabajtyidentyfikującearchitekturędocelową.Możeprzyjmowaćwielewartości,wśródktórych
najpopularniejszeto:wartość„2”dlaarchitekturySPARC,wartość„3”dlaarchitekturyx86(32-bitowa),„8”dlaarchitekturyMIPS
(stosowanam.in.wrouterach),„40”dlaarchitekturyARM(urządzeniawbudowane,tabletylubsmartfony)oraz„62”dlaarchitektury
x86-64(64-bitowa).
Szybkąidentyfikacjęarchitekturydocelowejmożnauzyskaćzapomocąnarzędziafile(1):
$file/bin/ls
/bin/ls:ELF64-bitLSBexecutable,x86-64,version1(SYSV),dynamicallylinked,
interpreter/lib64/ld-linux-x86-64.so.2,forGNU/Linux2.6.32,
BuildID[sha1]=0a07d110567fac845adae753f7f8561a4121279d,stripped
Wskładwyświetlonychprzezfile(1)informacjiwchodziwiększośćdanych,którepozwalająnadobórodpowiednichnarzędzidodalszej
analizy:
ELF64-bitLSBexecutableinformacjeooznaczeniuET_EXECdoopisuplikuwykonywalnegoorazinformacjeodługościsłowa(64
bity)ikolejnościbajtów(LSB
leastsignificantbit
,czylikodowanie
little-endian
).
x86_64architekturax86-64.
dynamicallylinkedwplikuistniejesekcjaPT_DYNAMIC,opisanawpunkcie2.2.5,„Sekcja.dynamic”,którapozwalanazdefiniowanie
bibliotekzależnychwykorzystywanychprzezprogram.Alternatywnymodczytemjeststaticallylinked,któryinformujeobrakutej
sekcji.
interpreter[…]ścieżkadoprogramuładującego(wtymprzypadkuld.so),któregozadaniemjestpoprawnezaładowanieplikuELF
dopamięci,wrazzjegowszystkimizależnościami.Programładującyld.sozostanieopisanywpóźniejszympodrozdziale.
BuildID[sha1]=[…]unikatowyidentyfikatorplikuwykonywalnego,nadawanypodczasprocesukonsolidacjipliku.Jesttoinformacja
wykorzystywanagłówniedocelówdeweloperskich,umożliwiającazlokalizowanieodpowiednichsymbolidodatkowych,
wykorzystywanychpodczasdebugowaniaprogramulubjegoprofilowania.
strippedzplikuusuniętesymboledodatkowe.Najczęściejstosowanametodazarządzaniadodatkowymisymbolamiokreślającymi
nazwyfunkcjiizmiennychużytychwprogramiepoleganaodłączeniutychsymboliodplikuELF,przeniesieniuichdozewnętrznego
plikuinadaniuobuplikomtegosamegoidentyfikatoraBuildID,takabymożnabyłowprzyszłościszybkojezesobąskojarzyć(np.za
pomocąserweraindeksującego).Alternatywnąwartościąjestnotstripped,którainformuje,żedodatkowesymbolepowinnyznajdować
siębezpośredniowtymplikuELF(najczęściejnajegokońcu).
Innepolawnagłówku
fileheader
zawierająinformacjeoadresachirozmiarachpodstawowychstrukturformatuELF
.Ichistnieniejest
konieczne,ponieważstanowiąpunktwyjściowydlainterpretacjiipóźniejszegowykonaniaprogramu.Będzieonichmowawdalszych
punktach,przyopisietychstruktur.
2.2.2.Segmenty
Kodwykonywalny,lubdanewykorzystywaneprzezprogram,przechowywanewobszarachnoszącychnazwę
segmentów
.Granicetych
obszarówzdefiniowanewnagłówku
programheader
,któryfizycznieznajdujesięnajczęściejzarazpowspomnianymwpoprzednim
punkcienagłówku
fileheader
.Dokładnyadresnagłówka
programheader
jestzapisanywnagłówku
fileheader
,wpoluoadresie0x1C
wprzypadkupliku32-bitowegolubwpoluoadresie0x20dlapliku64-bitowego.
KażdysegmentopisywanyjestprzezstrukturęElf32_PhdrlubElf64_Phdr.onerozmieszczonewplikuwsposóbciągłytak,żeopis
kolejnegosegmenturozpoczynasiębezpośredniopozakończeniustrukturyopisującejpoprzednisegment.Liczbasegmentów
zadeklarowanajestwpolue_phnumwnagłówku
fileheader
(32-bitowy:adres0x2C,64-bitowy:adres0x38).Naprzykład,jeżelipole
e_phnumzawierawartość9,należyspodziewaćsiędziewięciustrukturElfX_Phdrwystępującychbezpośredniojednapodrugiej.
Nazrzucieekranunarysunku2.2znajdujesiędziewięćsegmentów,ulokowanychwplikuwsposóbsekwencyjny,jedenpodrugim.
Każdysegmentmarozmiarodpowiednio32lub56bajtów(wzależnościodarchitektury32-lub64-bitowej).Pokazanyturozmiarserii
nagłówków
programheader
to9*56=504bajty.
Rysunek2.2.SegmentywplikuELF
Treśćkażdegosegmentuzawierainformacjetakiejak:typsegmentu(polep_type,offset0x00),jegoadrespoczątkowy(pole
p_offset,czylipozycjadanychwpliku,offset0x04lub0x08),adreswpamięci(polep_vaddr,czylidocelowapozycjadanychwpamięci
pozaładowaniupliku,offset0x08lub0x10),jegorozmiaryiprawadostępudopamięciopisywanejprzeztensegment(polep_flags,offset
0x18dlasegmentu32-bitowegoorazwyjątkowooffset0x04dla64-bitowego).
Istniejewieletypówsegmentów,przeznaczonychdoróżnychcelów.Najważniejszeznichto: