Что делает ((void (*) ()) buf) (); жадный? - PullRequest
59 голосов
/ 14 января 2020

Я решаю проблему бинарной эксплуатации на picoCTF и наткнулся на этот фрагмент кода:

((void (*)())buf)();

, где buf - массив символов.

Я решил задачу, но могу Кажется, не понимаю, что именно он делает. Я посмотрел на эту ветку, но не смог разобрать.

Что значит ((void (*)())buf)();?

Ответы [ 4 ]

129 голосов
/ 14 января 2020

void (*)() - это тип, типом которого является «указатель на функцию, которая принимает неопределенные аргументы и не возвращает значения».

(void (*)()) - приведение типа к вышеуказанному типу.

(void (*)())buf приводит buf к указанному выше типу.

((void (*)())buf)() вызывает функцию (без передачи аргументов).

Короче говоря: он указывает компилятору обрабатывать buf в качестве указателя на функцию и для вызова этой функции.

11 голосов
/ 14 января 2020

указатель buf преобразуется в указатель на функцию void, принимающую неопределенное количество параметров, а затем разыменовывается (вызывается функция ie).

9 голосов
/ 14 января 2020

Это тип-трансляция с последующим вызовом функции. Во-первых, buf приводится к указателю на функцию, которая возвращает void. Последняя пара скобок означает, что функция вызывается.

7 голосов
/ 15 января 2020

Он преобразует массив символов в указатель на функцию, не принимающую аргументов и возвращающую void, а затем вызывает ее. Разыменование указателя не требуется из-за того, как работают указатели функций.

Объяснение:

Этот «массив символов» на самом деле является массивом машинного кода. Когда вы приводите массив к void (*)() и вызываете его, он запускает машинный код внутри массива. Если бы вы предоставили содержимое массива, я мог бы разобрать его для вас и сказать, что он делает.

...