áúðчðть - Xakep Online
áúðчðть - Xakep Online
áúðчðть - Xakep Online
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
VIRTUAL ADRESS ALLOCATION<br />
êàðòà ïàìÿòè<br />
çàãðóæåííîãî<br />
îáðàçà<br />
èñïîëíÿåìîãî<br />
ôàéëà<br />
0õ0<br />
[XÀÊÅÐ 11 [83] 05 > UNIXOID 108]<br />
Ñåãìåíòû è ñåêöèè - ÷òî ýòî<br />
òàêîå Ñåãìåíò — ýòî íåïðåðûâíàÿ<br />
îáëàñòü àäðåñíîãî<br />
ïðîñòðàíñòâà ñî ñâîèìè àòðèáóòàìè<br />
äîñòóïà.  ÷àñòíîñòè,<br />
ñåãìåíò êîäà èìååò<br />
àòðèáóò èñïîëíåíèÿ, à ñåãìåíò<br />
äàííûõ — àòðèáóòû<br />
÷òåíèÿ è çàïèñè. Íå ñòîèò<br />
ïóòàòü ELF-ñåãìåíòû ñ ñåãìåíòàìè<br />
x86 ïðîöåññîðà! Â<br />
çàùèùåííîì ðåæèìå 386+<br />
íèêàêèõ «ñåãìåíòîâ» â èçíà-<br />
÷àëüíîì ñìûñëå ýòîãî ñëîâà<br />
óæå íåò, à åñòü òîëüêî ñåëåêòîðû,<br />
è âñå ñåãìåíòû ELFôàéëà<br />
çàãðóæàþòñÿ â åäèíûé<br />
4-õ Ãáàéòîâûé x86-ñåã-<br />
3 GB<br />
ìåíò! Â çàâèñèìîñòè îò òèïà<br />
ñåãìåíòà âåëè÷èíà âûðàâíèâàíèÿ<br />
â ïàìÿòè ìîæåò âàðüèðîâàòüñÿ<br />
îò 4h äî 1000h áàéò<br />
(ðàçìåð ñòðàíèöû íà x86).<br />
 ñàìîì ELF-ôàéëå îíè õðàíÿòñÿ<br />
â íåâûðîâíåííîì âèäå,<br />
ïëîòíî ïðèæàòûå äðóã<br />
ê äðóãó. Òàê ÷òî ñî ñâîáîäíûì<br />
ïðîñòðàíñòâîì äëÿ âíåäðåíèÿ<br />
— ñïëîøíûå íàïðÿãè. 4 GB<br />
Áëèæàéøèé àíàëîã ELF-ñåãìåíòîâ<br />
— PE-ñåêöèè, íî â<br />
PE-ôàéëàõ ñåêöèÿ — ýòî íàèìåíüøàÿ ñòðóêòóðíàÿ<br />
åäèíèöà, à âîò â ELF-ôàéëàõ ñåãìåíò<br />
ìîæåò áûòü ðàçáèò íà îäèí èëè íåñêîëüêî<br />
ôðàãìåíòîâ — ñåêöèé.  ÷àñòíîñòè, òèïè÷íûé<br />
êîäîâûé ñåãìåíò ñîñòîèò èç ñåêöèé .init (ïðîöåäóðû<br />
èíèöèàëèçàöèè), .plt (ñåêöèÿ ñâÿçîê),<br />
.text (îñíîâîé êîä ïðîãðàììû) è .finit (ïðîöåäóðû<br />
ôèíàëèçàöèè). Ñåêöèè íóæíû ëèíêåðó<br />
äëÿ êîìáèíèðîâàíèÿ, ÷òîáû îí ìîã îòîáðàòü<br />
ñåêöèè ñ ïîõîæèìè àòðèáóòàìè è îïòèìàëüíûì<br />
îáðàçîì ðàñòàñîâàòü èõ ïî ñåãìåíòàì<br />
ïðè ñáîðêå ôàéëà, òî åñòü «ñêîìáèíèðîâàòü».<br />
Íåñìîòðÿ íà òî, ÷òî ñèñòåìíûé çàãðóç÷èê èãíîðèðóåò<br />
òàáëèöó ñåêöèé, ëèíêåð âñå-òàêè ïîìåùàåò<br />
åå êîïèþ â èñïîëíÿåìûé ôàéë. Ìåñòî<br />
òðàòèòñÿ ñîâñåì íåìíîãî, çàòî îòëàä÷èêàì è<br />
äèçàññåìáëåðàì òàê ïðèÿòíåå. Ïî íå ñîâñåì<br />
ïîíÿòíûì ïðè÷èíàì gdb è ìíîãèå äðóãèå ïðîãðàììû<br />
îòêàçûâàþòñÿ çàãðóæàòü ôàéë ñ ïîâðåæäåííîé<br />
èëè îòñóòñòâóþùåé òàáëèöåé ñåêöèé,<br />
÷åì ÷àñòî ïîëüçóþòñÿ äëÿ çàùèòû ïðîãðàìì<br />
îò ïîñòîðîííåãî âìåøàòåëüñòâà.<br />
Ñòðóêòóðó è íàçíà÷åíèå ïîëåé ñëóæåáíûõ çàãîëîâêîâ<br />
çäåñü ðàçáèðàòü íå áóäåì. Ýòèì çàéìåòñÿ<br />
hex-ðåäàêòîð, è íàì ýòè ïîäðîáíîñòè íå ïîíàäîáÿòñÿ.<br />
Èíòåðåñóþùèåñÿ ìîãóò îáðàòèòüñÿ ê ôàéëó<br />
/usr/include/elf.h — òàì âñå ïîäðîáíî ðàñïèñàíî.<br />
THREAD STACK<br />
EXECUTABLE<br />
SHARED LIB STACK<br />
KERNEL CODE AND DATA<br />
×ÒÎ ÍÀÌ ÏÎÍÀÄÎÁÈÒÑß<br />
Äëÿ ïðàâêè èñïîëíÿåìûõ ôàéëîâ Ëèíóõ íåîáÿçàòåëåí. Äîñòàòî÷íî<br />
èìåòü HIEW, çàïóùåííûé èç-ïîä Windows, èëè äàæå MS-<br />
DOS îäíàêî â ýòîì ñëó÷àå ïðèäåòñÿ ñèëüíî ïîïûõòåòü è ê òîìó<br />
æå - êàê ïîòîì ýòî îòëàæèâàòü Òàê ÷òî Ëèíóõ âñå-òàêè æåëàòåëåí,<br />
õîòÿ áû â âèäå ýìóëÿòîðà - VMWare, BOCHS èëè QEMU.<br />
Ìû îñòàíîâèìñÿ íà hex-ðåäàêòîðå HTE, ãîòîâóþ ñáîðêó êîòîðîãî<br />
0õ08048000<br />
0õ40000000<br />
0õñ0000000<br />
0õffffffff<br />
Ëó÷øå ñîñðåäîòî÷èìñÿ íà çàãðóçêå ôàéëà â ïàìÿòü.<br />
Ïî óìîë÷àíèþ ELF-çàãîëîâîê íàõîäèòñÿ<br />
ïî àäðåñó 8048000h. Ýòî è åñòü áàçîâûé àäðåñ<br />
çàãðóçêè. Íà ñòàäèè ëèíêîâêè îí ìîæåò áûòü<br />
ñâîáîäíî èçìåíåí íà äðóãîé, íî áîëüøèíñòâî<br />
ïðîãðàììèñòîâ îñòàâëÿþò åãî «êàê åñòü». Âñå<br />
ñåãìåíòû ïðîåöèðóþòñÿ â ïàìÿòü â ñîîòâåòñòâèè<br />
ñ âèðòóàëüíûìè àäðåñàìè, ïðîïèñàííûìè<br />
â òàáëèöå ñåãìåíòîâ, ïðè÷åì âèðòóàëüíàÿ ïðîåêöèÿ<br />
îáðàçà âñåãäà íåïðåðûâíà, è ìåæäó ñåãìåíòàìè<br />
íå äîëæíî áûòü íåçàïîëíåííûõ «äûð».<br />
Íà÷èíàÿ ñ àäðåñà 40000000h, ðàñïîëàãàþòñÿ ñîâìåñòíî<br />
èñïîëüçóåìûå áèáëèîòåêè ld-linix.so,<br />
libm.so, libc.so è äðóãèå, êîòîðûå ñâÿçûâàþò îïåðàöèîííóþ<br />
ñèñòåìó ñ ïðèêëàäíîé ïðîãðàììîé.<br />
Áëèæàéøèé àíàëîã èç ìèðà Windows — KER-<br />
NEL32.DLL, ðåàëèçóþùàÿ win32 API, íî ïðè æåëàíèè<br />
ïðîãðàììà ìîæåò âûçûâàòü ôóíêöèè îïåðàöèîííîé<br />
ñèñòåìû è íàïðÿìóþ.  NT çà ýòî îòâå÷àåò<br />
ïðåðûâàíèå INT 2Eh, â Linux, êàê ïðàâèëî, INT<br />
80h (ïîäðîáíåå î ðàçëè÷èè â ðåàëèçàöèè ñèñòåìíûõ<br />
âûçîâîâ ìîæíî ïðî÷èòàòü â äîêóìåíòå UNIX<br />
Assembly Codes Development for Vulnerabilities<br />
Illustration Purposes èëè êíèãå Çóáêîâà «Àññåìáëåð<br />
— ÿçûê íåîãðàíè÷åííûõ âîçìîæíîñòåé»).<br />
Äëÿ âûçîâà ôóíêöèé òèïà îòêðûòèÿ ôàéëà ìîæíî<br />
îáðàòèòüñÿ ëèáî ê áèáëèîòåêå libc, ëèáî íåïîñ-<br />
Text<br />
ðåäñòâåííî ê ñàìîé îïåðàöèîííîé<br />
ñèñòåìå. Ïåðâûé âàðèàíò —<br />
Data ñàìûé ãðîìîçäêèé, ñàìûé ïåðåíîñèìûé<br />
è íàèìåíåå ïðèìåòíûé.<br />
... Ïîñëåäíèé — ïðîñò â ðåàëèçàöèè,<br />
íî ïðè ïåðâîì æå âçãëÿäå<br />
íà äèçàññåìáëåðíûé ëèñòèíã òóò<br />
æå áðîñàåòñÿ â ãëàçà (ïðàâèëüíûå<br />
ïðîãðàììû INT 80h íå âûçûâàþò!),<br />
ê òîìó æå îí èñïûòûâàåò<br />
ïðîáëåìû ñîâìåñòèìîñòè ñ ðàçëè÷íûìè<br />
âåðñèÿìè Linux. Âîò<br />
ld-linux.so<br />
îíà — ðàñïëàòà çà ïðîñòîòó!<br />
libm.so<br />
Ïîñëåäíèé ãèãàáàéò àäðåñíîãî<br />
libc.so<br />
ïðîñòðàíñòâà (îò àäðåñà<br />
....<br />
C0000000h è âûøå) çàíèìàþò<br />
êîä è äàííûå îïåðàöèîííîé ñèñòåìû,<br />
ê êîòîðûì ìû áóäåì îáðàùàòüñÿ<br />
òîëüêî ïîñðåäñòâîì ïðåðûâàíèÿ<br />
INT 80h èëè ÷åðåç ðàçäåëÿåìûå<br />
áèáëèîòåêè.<br />
Ñòåê íàõîäèòñÿ â íèæíèõ àäðåñàõ.<br />
Îí íà÷èíàåòñÿ ñ áàçîâîãî<br />
àäðåñà çàãðóçêè è «ðàñòåò<br />
ââåðõ» ïî íàïðàâëåíèþ ê íóëåâûì<br />
àäðåñàì. Â áîëüøèíñòâå<br />
ëèíóêñîâ ñòåê èñïîëíÿåì (òî<br />
åñòü ñþäà ìîæíî ñêîïèðîâàòü<br />
ìàøèííûé êîä è ïåðåäàòü íà<br />
íåãî óïðàâëåíèå), îäíàêî íåêîòîðûå<br />
ïàðàíîèäàëüíûå àäìèíèñòðàòîðû<br />
óñòàíàâëèâàþò çàïëàòêè, îòíèìàþùèå<br />
ó ñòåêà àòðèáóò èñïîëíÿåìîñòè, íî áîëüøîé<br />
ðàñïðîñòðàíåííîñòè îíè íå ïîëó÷èëè, è<br />
èìè ìîæíî ïðåíåáðå÷ü.<br />
[èìïëàíòàöèÿ ÷óæåðîäíîãî êîäà â ELFôàéë]<br />
Äëÿ ýêñïåðèìåíòîâ ïî èìïëàíòàöèè íàì<br />
ïîòðåáóåòñÿ æèâîé èñïîëíÿåìûé ôàéë, êîòîðûé<br />
ïðè ïîìîùè êîìïèëÿòîðà è òåêñòîâîãî ðåäàêòîðà<br />
ìû ñìîæåì èçãîòîâèòü è ñàìîñòîÿòåëüíî.<br />
Íàæìåì â Midnight Commander'å, íàáåðåì<br />
ïðîãðàììó ñëåäóþùåãî ñîäåðæàíèÿ (ñì.<br />
ëèñòèíã), çàòåì /"èìÿ-ôàéëà.c" è îòêîìïèëèðóåì<br />
åå ñâîèì ëþáèìûì gcc ñ íàñòðîéêàìè<br />
ïî óìîë÷àíèþ (gcc èìÿ-ôàéëà.c -o èìÿ-ôàéëà).<br />
[äåìîíñòðàöèîííàÿ ïðîãðàììà,<br />
â êîòîðóþ ìû áóäåì âíåäðÿòü ïîñòîðîííèé êîä]<br />
#include <br />
main()<br />
{<br />
printf("LORDI - the best group in the world!\n"\<br />
"(www.lordi.org)\nmonsters, bondage and<br />
sado-maso\n");<br />
}<br />
ìîæíî áåñïëàòíî ñêà÷àòü ñ hte.sf.net. Îí «ïåðåâàðèâàåò»<br />
ELF-ôîðìàò, â íåì åñòü ìîùíûé àññåìáëåð è ïðî-<br />
÷èå âêóñíîñòè. Êàê âàðèàíò, ìîæíî âîñïîëüçîâàòüñÿ<br />
ðåäàêòîðîì BIEW (biew.sf.net), íî îí íàìíîãî ñëàáåå.<br />
Æåëàòåëüíî èìåòü ÈÄÓ. Ëèíóõîâûé ïîðò ñîäåðæèò<br />
óäîáíûé èíòåðàêòèâíûé îòëàä÷èê â ñòèëå Turbo-