Treść książki

Przejdź do opcji czytnikaPrzejdź do nawigacjiPrzejdź do informacjiPrzejdź do stopki
SegmentPT_INTERP(3)określaobszarprzechowującypełnąścieżkędospecjalnegoprogramuładującego(nazywanego
też„dynamicznymkonsolidatorem”,ang.
dynamiclinker
,lubpoprostuld.so),któremuzostanieprzekazanakontrolaniedługo
poprocesiewstępnegoładowaniaplikuELFprzezjądrosystemu.Dane,naktórewskazujeadreszapisanywpolup_offset,zawierają
ścieżkęsystemuplików.
SegmentPT_LOAD(1)określaobszardanych,którezostanąumieszczonewpamięcipodwybranymadresem.Danezplikuspod
adresup_offsetzostanąskopiowanedopamięcipodadresp_vaddr,jeślibędzietomożliwe.Jesttotypsegmentuzwykleładującydane
zkodemwykonywalnymprogramudopamięci,wrazzdodatkowymidanymiwykorzystywanymiprzeztenkod.
SegmentPT_DYNAMIC(2)zawierainformacjedlaprogramuładującego(określanegoprzezdanesegmentuPT_INTERP),wymagane
dopoprawnegozaładowaniapliku.JegoistnieniedefiniujetypbudowyplikuELF;wprzypadkuistnieniategosegmentujesttoplik
„złączonydynamicznie”(ang.
dynamicallylinked
),wprzypadkubrakuplik„złączonystatycznie”(ang.
staticallylinked
).
Należyzwrócićuwagęnato,żekolejnośćsegmentówniezawszejestdowolna.DefinicjetypuPT_PHDRlubPT_INTERPmusząznajdować
sięprzeddefinicjąPT_LOAD.Wynikatozesposobuładowaniaplikuprzezsystem.Możetosugerowaćinterpretacjęsegmentówjakoswego
rodzajusekwencjęinstrukcjidowykonania,którenależyzrealizowaćwokreślonejkolejności,abypoprawniezaładowaćplik.
Spośródwymienionychpowyżejsegmentów,PT_LOADiPT_DYNAMICzawierająnajczęściejodczytywaneinformacje,dlategoponiżej
znajdujesięichszerszyopis.
2.2.3.SegmentPT_LOAD
Graniceobszarów,któremająbyćzaładowanedopamięci,określaneprzezdanezdefiniowanewsegmencietypuPT_LOAD.Program
ładującywykonapróbęalokacjipamięcipodadresemwyliczonymnapodstawiewartościzapisanejwpolup_vaddr.Wprzypadku
powodzeniadanezplikuELFspodadresup_offsetzostanąskopiowanedoświeżoprzydzielonegoregionupamięciizostanątam
doczasupóźniejszejinicjalizacjiprogramu.
Otoprzykładwyświetlaniainformacjiosegmentachprzyużyciunarzędziareadelf(1):
Częstoprogramywykonywalne,zbudowanewstandardowysposób,majądwasegmentytypuPT_LOAD:pierwszyznichokreślaobszar
zawierającydanezkodemwykonywalnym,drugiokreśladanewykorzystywaneprzeztenkod.Charakterdanychwsegmenciemożna
ustalićzapomocąanalizyprawdostępuzpolap_flags,któreokreśla,jakieprawadostępuzostanąnadaneświeżoprzydzielonemu
obszarowipamięci.Jeśliprawadostępuumożliwiająwykonywaniekodu(flagaE),jesttoznak,żesegmentmożezawieraćkodprogramu.
Zkolei,gdysegmentzawieraflagęumożliwiającązapisdopamięci(flagaW),możetobyćznak,żesegmentzawieradaneprogramu,
którebędąmodyfikowanepodczasjegodziałania.
WpokazanympowyżejprzykładzieprzedstawionyjestplikELF,wktórymzadeklarowanozaładowaniedwóchsegmentów.Pierwszy
znichtosegmentładującytreśćplikuzobszaru0x0do0x1C10C,dopamięcipodadres0x400000.Pozaładowaniupamięcizostanie
nadaneprawodowykonaniakodu.Faktycznierozmiarcałegoobszarupamięcibędziewynosił0x1D000,ponieważrozmiarjestzawsze
wyrównywanydorozmiarustronypamięcizdefiniowanejprzezsystemoperacyjny.Drugisegmentzawieradeklaracjęalokacjidanychpod
adres0x61CE00.Faktycznieprzydzielonymadresembędzieadres0x61C000,takżezpowoduwyrównaniaadresudorozmiarustrony.
Popoprawnejalokacjidoadresu0x61CE00zostanieskopiowanatreśćplikuzadresu0x1CE00.Wypełnienie(od0x61C000do0x61CDFF)
poprzedzającealokowanyrejonpamięcizostanienadpisanedanymizpliku,zaczynającodoffsetu0x1C000.Obszarpamięcizostanie
oznaczonyjakoobszar,doktóregomożliwyjestzapis,aleniejestmożliwewykonaniezniegokodu.
Istniejąprzypadki,wktórychpolep_vaddrniezawierapreferowanegoadresudocelowego.Wtakichsytuacjachsystemdobieratenadres
automatycznie.TacechaspotykanajestnajczęściejwplikachELFoznaczonychtypemET_DYN.Tentyporyginalniezarezerwowanybyłdla
bibliotek,anieaplikacji,jednakzyskipłynącezlosowościnadaniaadresudocelowegosegmentuspowodowałytakżewykorzystanietej
technikiprzyzwykłychprogramach,wykonywanychbezpośrednio.JednąztechnikwykorzystującychcechęjestASLR(
AddressSpace
LayoutRandomization
[4]).
Możliwyjestteżprzypadek,gdyzdefiniowanywpolup_vaddradresniebędziemógłbyćzaalokowany(sytuacjajestanalogicznadotej,
gdyp_vaddrbędziezawierałowartość0x0).Jesttosytuacjaproblematyczna,ponieważkompilatorpodczasgenerowaniakodudeklaruje
pewienadresbazowy,podktórykodtenpowinienzostaćzaładowany.Jeślitenwarunekniezostaniespełniony,kodnienadajesię
dowykonania,ponieważwszystkiejegoreferencjedoswoichfunkcjiczyzmiennychnieprawidłowe;programładującyzmuszonyjest
skorzystaćwtedyzinformacjizawartychwsekcjach.rela.dynoraz.rela.pltwceluzmianypołożenia(ang.
relocation
,czyli
relokacji
)kodu
wykonywalnegopodinnyadres.Tylkopomodyfikacjikoduzgodniezinformacjamizawartymiwtablicachrelokacyjnychmożliwejest
wykonaniekoduzaładowanegopodinnyadresbazowyniżzadeklarowanypodczasprocesukompilacji.Problemtenniedotyczykodu,który
niezawieradeklaracjiżadnegoadresubazowego,określanegomianemPIC(
PositionIndependentCode
).Jegoodpornośćnatenproblem
jestgłównympowodemczęstegostosowaniagowplikachbinarnych,wktórychjestwykorzystanymechanizmASLR.
2.2.4.SegmentPT_DYNAMIC
Jesttospecjalnysegment,wskładktóregowchodząsekcjeodpowiedzialnezaprzechowywanieinformacjiołączeniudynamicznym.
Wchwiliobecnejstandarddefiniujetylkojednątakąsekcję:.dynamic.Zawieraonaistotnieinformacjewykorzystywaneprzezprogram
ładującywceluzaładowaniaprogramulubbibliotekiorazwszystkichbibliotekzależnych.Wprzypadkuplikówwykonywalnychzłączonych
statycznie,kompilatornieumieszczawnichinformacjiodynamicznymłączeniuiwtakichplikachniemaanisekcji.dynamic,ani
segmentuPT_DYNAMIC.
2.2.5.Sekcja.dynamic
Każdyprogram,któryniejestzbudowanystatycznie,zawierasekcjęonazwie.dynamic.Wprzypadkujejistnieniaprogramładującymusi
przejśćdodatkowyprocesinicjalizacjipolegającynazaładowaniukażdejbibliotekizależnejorazrekurencyjniekażdejzależności
bibliotekzależnych.Jeśliładowaniejakiejśzależnościniepowiedziesię,procesładowaniacałegoprogramukończysiębłędem.Treśćsekcji
.dynamic,czylitabelęzinformacjamiołączeniudynamicznym,możnazobaczyćzapomocąprogramureadelf(1):