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.

Íåîáõîäèìûå òóëçû:<br />

Nasm (nasm.sourceforge.net)<br />

Hexdump (www.canb.auug.org.au/~millerp/hexdump.html)<br />

Êîëëåêöèè øåëë-êîäîâ è äîêóìåíòàöèè ïî òåìå:<br />

Metasploit.com<br />

packetstormsecurity.com/shellcode<br />

www.shellcode.org<br />

ÏÐÎÁËÅÌÛ ÍÅ ÊÎÍ×ÀÞÒÑß<br />

Äàæå ïîñëå âíåñåííûõ èçìåíåíèé øåëë-êîä âñå ðàâíî ñîäåðæèò<br />

íóëåâûå áàéòû. Îòëàä÷èê ïîêàçûâàåò, ÷òî èñòî÷íèê âñåõ áåä —<br />

èíñòðóêöèÿ jmp:<br />

E91500 jmp 0x29<br />

0000 add [bx+si],al<br />

Òóò åñòü îäíà õèòðîñòü: âìåñòî îáû÷íîé êîìàíäû jmp íóæíî èñïîëüçîâàòü<br />

èíñòðóêöèþ áëèçêîãî ïåðåõîäà — jmp short. Â íåáîëüøèõ<br />

ïðîãðàììàõ, èìåþùèõ ïðîñòóþ ñòðóêòóðó, ýòè èíñòðóêöèè<br />

àáñîëþòíî ðàâíîïðàâíû, îäíàêî ìàøèííûé êîä âî âòîðîì<br />

ñëó÷àå íå ñîäåðæèò íóëåâûõ áàéòîâ. À èìåííî ýòî íàì è íàäî.<br />

Êàçàëîñü áû, âñå ãîòîâî. Øåëë-êîä äîëæåí áûòü èäåàëüíûì, íî<br />

íåò! Â íåì ïî-ïðåæíåìó îñòàåòñÿ îäèí-åäèíñòâåííûé è ïîäëûé<br />

íóëü-áàéò. Îí íàõîäèòñÿ â ñàìîì êîíöå íàøåãî øåëë-êîäà è ïîÿâëÿåòñÿ<br />

òàì èç-çà òîãî, ÷òî ñòðîêà, ñîäåðæàùàÿ ïóòü ê èíòåðïðåòàòîðó<br />

('/bin/sh', 0), çàêàí÷èâàåòñÿ íóëåì. Êàê ãîâîðèëîñü ðàíåå,<br />

ýòîò íîëü íåîáõîäèì äëÿ ïðàâèëüíîé ðàáîòû ïðèëîæåíèÿ<br />

(ôóíêöèè execve()). Ïðîñòî âçÿòü è óäàëèòü åãî íåëüçÿ, êàê áû òåáå<br />

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

íà ýòàïå êîìïîíîâêè âìåñòî íóëÿ ìîæíî óêàçàòü ïðîèçâîëüíûé<br />

ñèìâîë è ïðåâðàòèòü åãî â íîëü ëèøü â ïðîöåññå âûïîëíåíèÿ<br />

ïðîãðàììû. Ýòî äåëàåòñÿ ïðèìåðíî òàê:<br />

Jmp short<br />

code:<br />

stuff<br />

Ïîñëå âñåõ äîðàáîòîê íóëåâûå áàéòû èñ÷åçëè<br />

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

êîäå ïîÿâëÿþòñÿ íóëè, íî íàì, êàê íîâè÷êàì, íåîáõîäèìà<br />

ïîìîùü äèçàññåìáëåðà. Âîñïîëüçóåìñÿ ndisasm:<br />

$ nasm shell.asm<br />

$ ndisasm shell.asm<br />

Ïîñëå âûïîëíåíèÿ ýòîé êîìàíäû íà ýêðàí áóäåò âûâåäåí äèçàññåìáëèðîâàííûé<br />

êîä ïðîãðàììû. Ïåðâûé ñòîëáåö — àäðåñ<br />

èíñòðóêöèè, îí äëÿ íàñ íå îñîáåííî âàæåí. Âî âòîðîì ñòîëáöå<br />

ðàñïîëîæåíû ìàøèííûå èíñòðóêöèè, òî÷íî òàêèå æå, êàê è ïðè<br />

ïðîñìîòðå áèíàðíèêà hexdump'îì. Â òðåòüåì ñòîëáöå äëÿ êàæäîé<br />

ìàøèííîé èíñòðóêöèè äàí ýêâèâàëåíò íà àññåìáëåðå. Òîëüêî<br />

ñ ïîìîùüþ àññåìáëåðíîãî êîäà ìû ìîæåì ñóäèòü î òîì, îòêóäà<br />

âçÿëè íóëåâûå áàéòû â øåëë-êîäå.<br />

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

NULL-áàéòîâ ñâÿçàíû ñ èíñòðóêöèÿìè, êîòîðûå óïðàâëÿþò ñîäåðæèìûì<br />

ðåãèñòðà è ñòåêà. Ýòîãî ñëåäîâàëî îæèäàòü, ïîñêîëüêó ìû ðàáîòàåì<br />

â 32-áèòíîì ðåæèìå è, ñîîòâåòñòâåííî, äëÿ êàæäîãî ÷èñëà<br />

âûäåëÿåòñÿ 4 áàéòà ïàìÿòè. Ìû æå îïåðèðóåì ÷èñëàìè, äëÿ êîòîðûõ<br />

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

ìû èìååì ñëåäóþùóþ êîíñòðóêöèþ «mov eax, 70» (çàíåñòè â ðåãèñòð<br />

eax ÷èñëî 70).  äàìïå è øåëë-êîäå ýòà èíñòðóêöèÿ ïðåäñòàâëåíà<br />

êàê «B8 46 00 00 00». Ïðè÷åì B8 — ýòî ìàøèííûé ýêâèâàëåíò<br />

àññåìáëåðíîé êîìàíäû mov ax, à B8 00 00 00 — ÷èñëî 70 â øåñòíàäöàòåðè÷íîé<br />

ñèñòåìå ñ÷èñëåíèÿ, äîïîëíåííîå íóëÿìè äî ðàçìåðà<br />

4-õ áàéò. Àíàëîãè÷íî âîçíèêàåò åùå ìíîæåñòâî NULL-áàéòîâ.<br />

Ê ñ÷àñòüþ, ðåøèòü ýòó ïðîáëåìó áóäåò ïðîùå ïðîñòîãî. Äîñòàòî÷íî<br />

âñïîìíèòü, ÷òî 32-áèòíûå ðåãèñòðû (EAX, EBX è äðóãèå, íà-<br />

÷èíàþùèåñÿ ñ áóêâû e) ìîæíî ðàçëîæèòü íà ðåãèñòðû ìåíüøåé<br />

ðàçìåðíîñòè. Ïîñìîòðè íà èëëþñòðàöèþ è òåáå ñðàçó ñòàíåò ÿñíî,<br />

÷òî íèêòî íå ìåøàåò íàì ðàáîòàòü ñ äâóõáàéòíûì ðåãèñòðîì<br />

AX, à òàêæå ñ åãî ìëàäøåé è ñòàðøåé ÷àñòÿìè AL è AH. Ïîñëåäíèå<br />

èìåþò ðàçìåð âñåãî â îäèí áàéò — êàê ðàç òî, ÷òî íàì íàäî.<br />

Íóæíî ëèøü çàìåíèòü «mov eax, 70» íà «mov al, 70» è ò.ä. Âàæíî<br />

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

ìóñîðà. Áûñòðî è ýôôåêòèâíî îáíóëèòü çíà÷åíèå âñåãî ðåãèñòðà<br />

ìîæíî, âîñïîëüçîâàâøèñü ëîãè÷åñêîé ôóíêöèåé «èñêëþ÷àþùåå<br />

èëè». Òàê, «xor eax,eax» îáíóëèò çíà÷åíèå ðåãèñòðà EAX.<br />

pop esi<br />

; àäðåñ íà÷àëà ñòðîêè<br />

; òåïåðü â ðåãèñòðå ESI<br />

xor eax,eax<br />

; îáíóëÿåì ðåãèñòð EAX<br />

mov byte [esi + 17],al<br />

; îòñ÷èòûâàåì 18 ñèìâîëîâ (íóìåðàöèÿ ñ íóëÿ)<br />

; è çàíîñèì òóäà íîëü (ðåãèñòð EAX ïîëíîñòüþ<br />

; ðàâåí íóëþ)<br />

; Òåïåðü ñòðîêà ïðåâðàòèòüñÿ â «This is my string0»<br />

stuff:<br />

call code<br />

db 'This is my string#'<br />

Òåïåðü ïðèìåíèì ýòîò ïðèåì ïî îòíîøåíèþ ê ïðîãðàììå<br />

shell.asm:<br />

BITS 32<br />

;setreuid(0, 0)<br />

xor eax,eax<br />

mov al, 70<br />

xor ebx,ebx<br />

xor ecx,ecx<br />

int 0x80<br />

jmp short two<br />

one:<br />

pop<br />

ebx<br />

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

xor eax,eax<br />

mov byte [ebx+7], al<br />

push eax<br />

push ebx<br />

mov ecx, esp<br />

mov al,11<br />

xor edx,edx<br />

int 0x80<br />

two:<br />

call one<br />

db<br />

'/bin/sh#'<br />

Îòêîìïèëèðîâàâ ïðîãðàììó, óáåæäàåìñÿ, ÷òî íóëåâûõ áàéòîâ<br />

áîëüøå íåò. Ñòîèò îòìåíèòü, ÷òî ïðîáëåìà ìîæåò âîçíèêíóòü íå<br />

òîëüêî èç-çà íóëåé. Ñïåöèàëüíûå ñèìâîëû (ê ïðèìåðó, ñèìâîë<br />

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

íóëåâûõ áàéòîâ â øåëë-êîäå.<br />

Ê ÄÅÉÑÒÂÈÞ<br />

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

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

ïðîñòî ïðî÷èòàòü ýòîò ìàòåðèàë. Âàæíî êàê ìîæíî ãëóáæå ðàçîáðàòüñÿ<br />

ñ îïåðàöèîííîé ñèñòåìîé, ïîä êîòîðóþ ïèøåòñÿ øåëë-êîä,<br />

à òàêæå ïðîãðàììèðîâàíèåì íà àññåìáëåðå. Íàäåþñü, ïðèâåäåííûå<br />

ïðèìåðû óáåäèëè òåáÿ â òîì, ÷òî íè÷åãî ÷ðåçâû÷àéíî ñëîæíîãî<br />

çäåñü íåò. Âñå äîâîëüíî ïðîñòî è ëîãè÷íî. Ãëàâíîå — íå áîÿòñÿ<br />

îòêðûòü äîêóìåíòàöèþ è íåìíîãî ïîýêñïåðèìåíòèðîâàòü.<br />

BINARY YOUR’S z<br />

XÀÊÅÐ 01 /85/ 06 055

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

Saved successfully!

Ooh no, something went wrong!