Rozwiązuję binarne wyzwanie dotyczące eksploatacji na picoCTF i natrafiłem na następujący fragment kodu:
((void (*)())buf)();
gdzie buf
jest tablica znaków.
Rozwiązałem wyzwanie, ale nie rozumiem, co dokładnie robi. Spojrzałem na ten wątek, ale nie mogłem go zrozumieć.
Co ((void (*)())buf)();
znaczy
c
function
pointers
function-pointers
sh.3.ll
źródło
źródło
((void (*)())buf)();
znaczy Oznacza to, że autor nie rozumietypedef
.typedef void (*voidFuncPtrType)();
wyjaśniłby ten kod.Odpowiedzi:
void (*)()
jest typem, typ jest „wskaźnikiem do funkcji, który pobiera nieokreślone argumenty i nie zwraca żadnej wartości”.(void (*)())
jest rzutowaniem typu na powyższy typ.(void (*)())buf
rzutujebuf
na powyższy typ.((void (*)())buf)()
wywołuje funkcję (nie przekazuje żadnych argumentów).W skrócie: nakazuje kompilatorowi, aby traktował go
buf
jako wskaźnik do funkcji i wywołał tę funkcję.źródło
cdecl
narzędzie (lub strona internetowa ) jest pomocne w tłumaczeniu bardziej złożonych wyrażeń C na angielski.buf
lub gdziecopy
znajduje się adres wykonywalny, a sam kod jest niezależny od pozycji, to zadziała. Jest oczywiście tak mało przenośny, jak to tylko możliwe, ale powinno to działać w wielu środowiskach bez systemu operacyjnego, a także w starszych systemach x86, które nie ustawiają bitu no-execute (NX) na stosie.wskaźnik
buf
jest konwertowany na wskaźnik w celu unieważnienia funkcji, przyjmując nieokreśloną liczbę parametrów, a następnie usuwając odwołanie (tj. wywoływana funkcja).źródło
To typecast, po którym następuje wywołanie funkcji. Po pierwsze,
buf
jest rzutowany na wskaźnik do funkcji, która zwracavoid
. Ostatnia para nawiasów oznacza, że funkcja jest wówczas wywoływana.źródło
Rzuca tablicę znaków na wskaźnik do funkcji nie przyjmującej argumentów i zwracającej ją
void
, a następnie wywołuje ją. Dereferencje wskaźnika nie są wymagane ze względu na działanie wskaźników funkcji.Wyjaśnienie:
Ta „tablica znaków” jest w rzeczywistości tablicą kodu maszynowego. Kiedy rzutujesz tablicę na a
void (*)()
i wywołujesz ją, uruchamia ona kod maszynowy wewnątrz tablicy. Jeśli podałeś zawartość tablicy, mógłbym ją dla ciebie zdemontować i powiedzieć, co ona robi.źródło