У меня есть эта часть кода для тестирования shellcode, но я не понимаю это так, кто-либо может объяснить это мне?
Забудьте о блоке shellcode, что я хочу понять, код C,
char shellcode[] = "...";
int main(int argc, char **argv)
{
int (*func)();
func = (int (*)()) shellcode;
(int)(*func)();
}
Я имею в виду все, каково пустое ()
, объясните это, как будто Вы объясняете это новичку.
int (*func)();
Это объявление указателя функции. Указатель функции - это, по сути, переменная, которая хранит адрес функции. В данном случае тип функции, на которую указывает func
, - это функция, которая не принимает аргументов и возвращает int
. Вы можете присвоить адрес функции этой переменной следующим образом:
func = foo;
Где foo
- функция с прототипом int foo();
.
После того как функция была присвоена этой переменной, вы можете вызвать функцию, на которую указывает func
, следующим образом:
(*func)();
Существует альтернативный синтаксис (который эквивалентен), который, как мне кажется, более понятен:
func();
Так, если foo
была присвоена func
, то оба приведенных выше примера будут вызывать функцию foo
.
Вы также можете приводить значения к указателям функций. В примере кода
(int (*)())
- это приведение к указателю функции, которая не принимает аргументов и возвращает int
. Это сделано для того, чтобы компилятор не жаловался на присвоение того, что по сути является char*
указателю функции func
.
В коде, который вы привели выше, есть еще один момент. После вызова func
результат (по какой-то причине) приводится к int
. Насколько я могу судить, это приведение совершенно не нужно. Поэтому последнюю строку
(int)(*func)();
можно заменить на
(*func)();
int (* func) ();
- определение указателя на функцию с возвращаемым типом int
, func = (int (*) ()) шелл-код;
назначает указателю функции адрес шеллкоду []
(байт-код ассемблера, инструкции, выполняемые вашим процессором), (int) (* func) ();
вызывает функцию с помощью его адрес (инструкции ассемблера) без переданных аргументов, потому что указан ()
. Например, инструкция ассемблера \ x90
имеет имя NOP
( N или Op eration) и ничего не делает, другие инструкции ассемблера делают разные вещи. в зависимости от системы, в которой вы их выполняете.