Je suis en train de résoudre un défi d'exploitation binaire sur picoCTF et suis tombé sur ce morceau de code:
((void (*)())buf)();
où buf
est un tableau de caractères.
J'ai résolu le défi, mais je n'arrive pas à comprendre ce qu'il fait exactement. J'ai regardé ce fil mais je n'ai pas pu le comprendre.
Que veut ((void (*)())buf)();
dire?
c
function
pointers
function-pointers
sh.3.ll
la source
la source
((void (*)())buf)();
dire? Cela signifie que l'auteur ne comprend pastypedef
.typedef void (*voidFuncPtrType)();
rendrait ce code clair.Réponses:
void (*)()
est un type, le type étant "pointeur vers une fonction qui accepte des arguments indéterminés et ne renvoie aucune valeur".(void (*)())
est une conversion de type vers le type ci-dessus.(void (*)())buf
lancebuf
le type ci-dessus.((void (*)())buf)()
appelle la fonction (sans passer d'arguments).En bref: il indique au compilateur de traiter
buf
comme un pointeur vers une fonction et d'appeler cette fonction.la source
cdecl
utilitaire (ou le site Web ) utile pour traduire les expressions C les plus complexes en anglais.buf
oucopy
se trouve à une adresse exécutable et que le code lui-même est indépendant de la position, cela fonctionnera. Il est bien sûr aussi non portable que possible, mais cela devrait fonctionner dans de nombreux environnements bare-metal ainsi que dans les anciens systèmes d'exploitation x86 qui ne définissent pas le bit de non-exécution (NX) sur la pile et le tas.le pointeur
buf
est converti en pointeur pour annuler la fonction en prenant un nombre non spécifié de paramètres, puis est déréférencé (c'est-à-dire la fonction appelée).la source
Il s'agit d'un transtypage, suivi d'un appel de fonction. Tout d'abord,
buf
est converti en pointeur vers une fonction qui retournevoid
. La dernière paire de parenthèses signifie que la fonction est alors appelée.la source
Il convertit le tableau de caractères en un pointeur vers une fonction ne prenant aucun argument et retournant
void
, puis l'appelle. Il n'est pas nécessaire de déréférencer le pointeur en raison du fonctionnement des pointeurs de fonction.Une explication:
Ce "tableau de caractères" est en fait un tableau de code machine. Lorsque vous convertissez le tableau en un
void (*)()
et l'appelez, il exécute le code machine à l'intérieur du tableau. Si vous fournissiez le contenu du tableau, je pourrais le démonter pour vous et vous dire ce qu'il fait.la source