áúðчðть - 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.
ÞÍÈÒÛ ÊÐÅÀÒÈÔÔ ÊÎÄÈÍÃ UNIXOID ÑÖÅÍÀ [ÂÇËÎÌ] ÈÌÏËÀÍÒ PC_ZONE FERRUM<br />
ÍÜÞÑÛ<br />
Êó÷à ñ ãîðêîé<br />
Îñíîâû heap-ïåðåïîëíåíèé<br />
ïîä Windows<br />
Heap<br />
ÅÑËÈ ÏÎÐÛÒÜÑß Â ÑÅÒÈ, ÌÎÆÍÎ ÍÀÉÒÈ ÎÃÐÎÌÍÎÅ ÊÎËÈ×ÅÑÒÂÎ ÌÀÒÅÐÈÀËÎÂ, ÎÏÈÑÛÂÀÞÙÈÕ ÐÀÇ-<br />
ËÈ×ÍÛÅ ÌÅÒÎÄÛ ÂÑÅÂÎÇÌÎÆÍÛÕ ÏÅÐÅÏÎËÍÅÍÈÉ. ÏÅÐÅÏÎËÍÅÍÈß Â ÑÒÅÊÅ, BUFFER OVERFLOW, FOR-<br />
MAT STRING — ÂÑÅ ÝÒÎ Â ÄÅÒÀËßÕ ÎÏÈÑÀÍÎ ÍÀ ÌÍÎÃÈÕ ÑÀÉÒÀÕ. ÎÄÍÀÊÎ, ÅÑËÈ ÏÐÈÑÌÎÒÐÅÒÜÑß, ÏÎ×-<br />
ÒÈ ÂÑÅ ÏÐÈÌÅÐÛ È ÎÏÈÑÀÍÈß ÏÎÏÓËßÐÍÛÕ ÌÅÒÎÄÈÊ ÏÐÈÂÅÄÅÍÛ ÈÌÅÍÍÎ ÄËß UNIX-ÑÈÑÒÅÌ. ËÅÇÒÜ<br />
 ÊÓ×Ó ÑÏÅÖÈÔÈ×ÅÑÊÈÕ ÄËß WINDOWS ÌÎÌÅÍÒΠÍÈÊÒÎ ÍÅ ÆÅËÀÅÒ. ÏÎ ÝÒÎÉ ÏÐÈ×ÈÍÅ ÌÛ ÐÅØÈËÈ<br />
ÏÐÈÃÎÒÎÂÈÒÜ ÄËß ÒÅÁß ÈÍÒÅÐÅÑÍÛÉ ÌÀÒÅÐÈÀË Î ÏÎÏÓËßÐÍÎÌ ÑÐÅÄÈ ÕÀÊÅÐÎÂ È ÂÈÐÌÅÉÊÅÐÎÂ<br />
ÏÐÈÅÌÅ, Ñ ÏÎÌÎÙÜÞ ÊÎÒÎÐÎÃÎ ÐÀÑÏÐÎÑÒÐÀÍßÅÒÑß ÄÎÁÐÀß ÏÎËÎÂÈÍÀ ÑÅÒÅÂÛÕ ×ÅÐÂÅÉ, — Î HEAP<br />
OVERFLOW | Õàøòàìîâ Àäèëü (adi1@ok.kz)<br />
ðèñóíîê 2: çàãîëîâîê<br />
ñâîáîäíîãî áëîêà<br />
ðèñóíîê 1: çàãîëîâîê áëîêà<br />
[÷òî òàêîå heap] Ïðåæäå âñåãî äàâàé ðàçáåðåìñÿ, ÷òî òàêîå heap. Ëþáîé<br />
øêîëüíèê òåáå ñêàæåò, ÷òî ñ àíãëèéñêîãî ýòî ñëîâî ïåðåâîäèòñÿ êàê «êó÷à».<br />
 íàøåì æå êîìïüþòåðíîì êîíòåêñòå ñëîâî «heap» îáîçíà÷àåò ñïåöèàëüíóþ<br />
îáëàñòü çàðåçåðâèðîâàííîãî àäðåñíîãî ïðîñòðàíñòâà, âûäåëåíèå è îñâîáîæäåíèå<br />
ïàìÿòè â êîòîðîì ðåàëèçóåòñÿ ïðè ïîìîùè ñïåöèàëüíûõ ñèñòåìíûõ<br />
ôóíêöèé. Ïðè ðàáîòå ñ êó÷åé ïðîãðàììèñòàì äîñòóïíî ñîáñòâåííîå<br />
îãðîìíîå âèðòóàëüíîå àäðåñíîå ïðîñòðàíñòâî, ïî åìêîñòè çíà÷èòåëüíî ïðåâîñõîäÿùåå<br />
îáúåì ðåàëüíîé ôèçè÷åñêîé ïàìÿòè, óñòàíîâëåííîé â êîìïüþòåðå.<br />
Âñå îñíîâíûå ôóíêöèè ïî ðàáîòå ñ êó÷åé (âûäåëåíèå, îñâîáîæäåíèå è<br />
ñîçäàíèå áëîêîâ ïàìÿòè) ðàñïîëîæåíû â ñèñòåìíîé áèáëèîòåêå ntdll.dll. Èçíà÷àëüíî<br />
êàæäîìó ïðèëîæåíèþ â Windows âûäåëÿåòñÿ îäíà ìåãàáàéòíàÿ êó-<br />
÷à, à äàëåå óæå, ïî ìåðå íåîáõîäèìîñòè,<br />
îáúåì âûäåëÿåìîé ïàìÿòè<br />
àâòîìàòè÷åñêè óâåëè÷èâàåòñÿ. Â<br />
ñâîþ î÷åðåäü, ïðèëîæåíèå ìîæåò<br />
ñîçäàâàòü ñîáñòâåííîå àäðåñíîå<br />
ïðîñòðàíñòâî ñ ïîìîùüþ ñïåöèàëüíûõ<br />
ôóíêöèé. Ïàìÿòü â êó÷å âûäåëÿåòñÿ<br />
îáëàñòÿìè, ïðè÷åì â êàæäîé îáëàñòè<br />
ìîæíî ñîçäàòü áëîêè ïàìÿòè,<br />
êîòîðûå áóäóò ðàñïîëîæåíû â ñåãìåíòàõ.<br />
Äëÿ óïðàâëåíèÿ êàæäûì òàêèì<br />
áëîêîì ñîçäàåòñÿ ñâîé ñïåöèàëüíûé<br />
çàãîëîâîê, êîòîðûé èçîáðàæåí<br />
íà ðèñóíêå 1.<br />
Çäåñü Size îáîçíà÷àåò ðàçìåð áëîêà,<br />
Previous Size — ðàçìåð ïðåäûäóùåãî<br />
áëîêà, Segment Index — èíäåêñ<br />
ñåãìåíòà, â êîòîðîì ðàñïîëîæåí<br />
áëîê, Unused — êîëè÷åñòâî íåèñïîëüçóåìûõ<br />
áàéò â áëîêå, Tag Index<br />
— èíäåêñ ìåòêè, à Flags — ôëàã áëîêà.<br />
Ôëàãè ìîãóò áûòü ñëåäóþùèìè:<br />
0x01 — HEAP_ENTRY_BUSY<br />
0x02 — HEAP_ENTRY_EXTRA_PRESENT<br />
0x04 — HEAP_ENTRY_FILL_PATTERN<br />
0x08 — HEAP_ENTRY_VIRTUAL_ALLOC<br />
0x10 — HEAP_ENTRY_LAST_ENTRY<br />
0x20 — HEAP_ENTRY_SETTABLE_FLAG1<br />
0x40 — HEAP_ENTRY_SETTABLE_FLAG2<br />
0x80 — HEAP_ENTRY_SETTABLE_FLAG3<br />
Íà íàøåì äèñêå òû íàéäåøü<br />
ïîëíûå âåðñèè ïðîãðàìì,<br />
îïèñàííûõ â ýòîé<br />
ñòàòüå, ïîäîïûòíîå ïðèëîæåíèå<br />
Server.exe äëÿ ýêñïåðèìåíòîâ<br />
è ñïëîèò äëÿ<br />
ïðîãðàììû — â îçíàêîìèòåëüíûõ<br />
öåëÿõ.<br />
Ïðè îñâîáîæäåíèè áëîêà ïàìÿòè îí ïðèíèìàåò âèä, èçîáðàæåííûé íà ðèñóíêå 2.<br />
Çäåñü Flink — óêàçàòåëü íà ñëåäóþùèé îñâîáîæäåííûé áëîê, à Blink —<br />
óêàçàòåëü íà ïðåäûäóùèé îñâîáîæäåííûé áëîê.<br />
[äðóãàÿ ðàçìåòêà] Äëÿ óïðîùåíèÿ óïðàâëåíèÿ ñâîáîäíûìè áëîêàìè<br />
èñïîëüçóåòñÿ òàêæå ðàçìåòêà ïî êîëè÷åñòâó åäèíèö âûäåëåíèÿ. Åäèíèöû<br />
ìîæíî âûñ÷èòàòü òàêèì îáðàçîì. Îáúåì êàæäîãî âûäåëÿåìîãî áëîêà ïàìÿòè<br />
ðàâåí 8. Ê ïðèìåðó, åñëè ïðèëîæåíèå âûäåëÿåò áëîê ðàçìåðîì â 64<br />
áàéòà, òîãäà åäèíèö àäðåñàöèè ïîëó÷èòñÿ 64/8 = 8. Êàæäàÿ êó÷à ñòàðòóåò<br />
ñî ñòðóêòóðû èç 128 ìàññèâîâ LIST_ENTRY, êîòîðóþ ìîæíî ïîñìîòðåòü â