Я решаю проблему бинарной эксплуатации на picoCTF и наткнулся на этот фрагмент кода:
((void (*)())buf)();
где buf
массив символов.
Я решил проблему, но не могу понять, что именно он делает. Я посмотрел на эту ветку, но не смог разобрать.
Что ((void (*)())buf)();
значит?
c
function
pointers
function-pointers
sh.3.ll
источник
источник
((void (*)())buf)();
значит? Это означает, что автор не понимаетtypedef
.typedef void (*voidFuncPtrType)();
сделает этот код понятным.Ответы:
void (*)()
является типом, типом которого является «указатель на функцию, которая принимает неопределенные аргументы и не возвращает значения».(void (*)())
является приведением типа к вышеуказанному типу.(void (*)())buf
приведениеbuf
к вышеуказанному типу.((void (*)())buf)()
вызывает функцию (без аргументов).Вкратце: он говорит компилятору обращаться с ним
buf
как с указателем на функцию и вызывать эту функцию.источник
cdecl
утилиту (или веб-сайт ) полезной для перевода более сложных выражений Си на английский язык.buf
или гдеcopy
находится по адресу исполняемого файла и сам код не зависит от позиции, это будет работать. Он, конечно, настолько непереносим, насколько это возможно, но это должно работать во многих чистых средах, а также в старых операционных системах x86, которые не устанавливают бит no-execute (NX) в стеке и куче.Указатель
buf
преобразуется в указатель на функцию void, принимающую неопределенное количество параметров, а затем разыменовывается (то есть вызывается функция).источник
Это типизация, сопровождаемая вызовом функции. Во-первых,
buf
приведен указатель на функцию, которая возвращаетvoid
. Последняя пара скобок означает, что функция вызывается.источник
Он преобразует массив символов в указатель на функцию, не принимающую аргументов и возвращающую
void
, а затем вызывает ее. Разыменование указателя не требуется из-за того, как работают указатели функций.Объяснение:
Этот «массив символов» на самом деле является массивом машинного кода. Когда вы приводите массив к a
void (*)()
и вызываете его, он запускает машинный код внутри массива. Если бы вы предоставили содержимое массива, я мог бы разобрать его для вас и рассказать, что он делает.источник