Тестирование шеллкода

У меня есть эта часть кода для проверки шеллкода, но я не понимаю, так может кто-нибудь объяснить это мне?

Забудьте о shellcode сборки, я хочу понять, это код C,

char shellcode[] = "...";

int main(int argc, char **argv)

{

int (*func)();

func = (int (*)()) shellcode;

(int)(*func)();

}

Я имею в виду все, что пустое (), пожалуйста, объясните это, как будто вы объясняете это новичку.

Ответы

Ответ 1

int (*func)();

Это объявление указателя функции. Указатель функции по существу является переменной, которая содержит адрес функции. В этом случае тип функции, на которую указывает func, является тем, который не принимает аргументов и возвращает int. Вы можете назначить адрес функции этой переменной следующим образом:

func = foo;

Где foo - это функция с прототипом int foo();.

Как только функция была назначена этой переменной, вы можете вызвать функцию, которая func указывает на так:

(*func)();

Существует альтернативный синтаксис (который эквивалентен), который я считаю более понятным:

func();

Итак, если foo было присвоено func, то оба примера выше на самом деле вызывали бы функцию foo.

Вы также можете присвоить значения указателям на функции. В примере кода

(int (*)())

- это преобразование в указатель функции, который не принимает аргументов и возвращает int. Это значит, что компилятор не будет жаловаться на назначение указателя функции func по существу char*.

В коде, который вы указали выше, есть одна последняя вещь. После вызова func результат (по какой-либо причине) передается в int. Насколько я могу судить, этот актер совершенно не нужен. Таким образом, последняя строка

(int)(*func)();

можно заменить на

(*func)();

Ответ 2

int (*func)(); - это определение указателя на функцию с возвращаемым типом int, func = (int (*)()) shellcode; присваивает указателю функции адрес shellcode[] (байт-код ассемблера, инструкции, выполняемые вашим процессором), (int)(*func)(); вызывает функцию по ее адресу (инструкции ассемблера) без переданных аргументов, поскольку указан (). Например, инструкция ассемблера \x90 имеет имя NOP (N o Операция) и ничего не делает, другие инструкции ассемблера выполняют разные действия в зависимости от системы, выполняя их.