Тестирование shellcode

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

Забудьте о блоке shellcode, что я хочу понять, код C,

char shellcode[] = "...";

int main(int argc, char **argv)

{

int (*func)();

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

(int)(*func)();

}

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

13
задан Sam 19 August 2014 в 07:31
поделиться

2 ответа

int (*func)();

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

func = foo;

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

После того как функция была присвоена этой переменной, вы можете вызвать функцию, на которую указывает func, следующим образом:

(*func)();

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

func();

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

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

(int (*)())

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

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

(int)(*func)();

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

(*func)();
15
ответ дан 1 December 2019 в 23:31
поделиться

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

3
ответ дан 1 December 2019 в 23:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: