[c] 무엇을 하는가? ((void (*) ()) buf) (); 평균?

picoCTF에서 이진 악용 문제를 해결하고 다음 코드를 보았습니다.

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

buf문자 배열은 어디에 있습니까 ?

나는 도전을 해결했지만 정확히 무엇을하고 있는지 이해할 수없는 것 같습니다. 나는 보았다 스레드 그러나 나는 그것을 만들 수 없습니다.

무슨 ((void (*)())buf)();뜻입니까?



답변

void (*)() “유형을 결정하지 않고 값을 반환하지 않는 함수의 포인터”인 유형입니다.

(void (*)()) 위 유형에 대한 유형 캐스트입니다.

(void (*)())bufbuf위 유형으로 캐스트 합니다.

((void (*)())buf)() 함수를 호출합니다 (인수 없음).

간단히 말해서 : 컴파일러에게 buf함수에 대한 포인터로 취급 하고 해당 함수를 호출하도록 지시합니다.


답변

포인터 buf는 지정되지 않은 수의 매개 변수를 사용하여 void 함수로 포인터를 변환 한 다음 역 참조됩니다 (예 : 함수 호출).


답변

typecast이고 함수 호출입니다. 먼저을 buf반환하는 함수에 대한 포인터로 캐스트됩니다 void. 마지막 괄호 쌍은 함수가 호출되었음을 의미합니다.


답변

인수를 취하지 않고를 반환하는 함수에 대한 포인터에 문자 배열을 캐스트 void한 다음 호출합니다. 함수 포인터의 작동 방식으로 인해 포인터 역 참조가 필요하지 않습니다.

설명:

“문자 배열”은 실제로 기계 코드의 배열입니다. 배열을 a로 캐스팅 void (*)()하고 호출하면 배열 내부의 기계어 코드가 실행됩니다. 배열의 내용을 제공 한 경우이를 분해하여 수행중인 작업을 알려줄 수 있습니다.


답변