Шеллкод в программе C

В демистификации Execve Shellcode объясняется способ написания execve шеллкода:

#include<stdio.h>
#include<string.h>

unsigned char code[] = 
"\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80";

main()
{

    printf("Shellcode Length: %d\n", strlen(code));

    int (*ret)() = (int(*)())code;

    ret();
}

Что означает строка int (*ret)() = (int(*)())code; делать?

Ответ 1

  int (*ret)() = (int(*)())code;
  ~~~~~~~~~~~~   ~~~~~~~~~~~~~~
        1              2

  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
               3
  • Он определяет ret как указатель на функцию, которая не имеет параметра () и возвращает int. Итак, те () указывают определение параметров функции.

  • Это для литья code указателю на функцию, которая не имеет параметра () и возвращает int.

  • Вставляет code как функцию и присваивает ее ret. После этого вы можете вызвать ret();.

 

unsigned char code[] =  "\x31\xc0\x50\x68\x6e\x2f\...

Это последовательность машинных команд, представленных шестнадцатеричными значениями. Он будет введен в код как функция.

Ответ 2

int-строка объявляет функцию ret(), указывая на массив code []; другими словами, функция отображается в двоичные инструкции кода [].

Конструкция\x является безопасным способом вставки шестнадцатеричных символов в строку. Например, вы можете заменить "\ x31" на "1", поскольку код символа "1" равен 49 или шестнадцатеричный 31.

Ответ 3

Можно ли переписать эту часть указателя функции в более простой форме?

Я не знаю, думаете ли вы, что это проще, но может быть:

#include <stdio.h>
#include <string.h>

unsigned char code[] = 
"\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80";

typedef int(*shellcode_t)();

int main(int argc, char ** argv) {
    printf("Shellcode Length: %ld\n", strlen(code));

    shellcode_t ret = (shellcode_t)code;

    ret();
}

Ответ 4

    (*(void(*)())shellcode)()

==

    p = (void(*)()) shellcode;
    (*p)();