Шеллкод в программе 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)();