Estou resolvendo um desafio de exploração binária no picoCTF e me deparei com este pedaço de código:
((void (*)())buf)();
onde buf
é uma matriz de caracteres.
Eu resolvi o desafio, mas não consigo entender o que exatamente está fazendo. Eu olhei para esta discussão, mas não consegui entender.
O que ((void (*)())buf)();
significa isso ?
c
function
pointers
function-pointers
sh.3.ll
fonte
fonte
((void (*)())buf)();
significa isso ? Isso significa que o autor não entendetypedef
.typedef void (*voidFuncPtrType)();
tornaria esse código claro.Respostas:
void (*)()
é um tipo, sendo o tipo "ponteiro para a função que recebe argumentos indeterminados e não retorna valor".(void (*)())
é uma conversão de tipo para o tipo acima.(void (*)())buf
lançabuf
para o tipo acima.((void (*)())buf)()
chama a função (sem passar argumentos).Resumindo: Diz ao compilador para tratar
buf
como um ponteiro para uma função e chamar essa função.fonte
cdecl
utilitário (ou site ) útil para traduzir as expressões C mais complexas para o inglês.buf
ou localcopy
estiver em um endereço executável e o próprio código for independente da posição, isso funcionará. É claro que não é tão portátil quanto possível, mas isso deve funcionar em muitos ambientes bare-metal, bem como em sistemas operacionais x86 mais antigos que não definem o bit de não execução (NX) na pilha e na pilha.O ponteiro
buf
é convertido no ponteiro para a função nula, obtendo um número não especificado de parâmetros e depois desreferenciado (ou seja, a função chamada).fonte
É um typecast, seguido por uma chamada de função. Em primeiro lugar,
buf
é convertido para o ponteiro para uma função que retornavoid
. O último par de parênteses significa que a função é chamada.fonte
Ele converte a matriz de caracteres em um ponteiro para uma função sem argumentos e retornando
void
e depois a chama. A desreferenciação do ponteiro não é necessária devido ao funcionamento dos ponteiros de função.Uma explicação:
Essa "matriz de caracteres" é na verdade uma matriz de código de máquina. Quando você converte a matriz para a
void (*)()
e chama, ela executa o código da máquina dentro da matriz. Se você fornecesse o conteúdo do array, eu poderia desmontá-lo e dizer o que ele está fazendo.fonte