picoCTF에서 이진 악용 문제를 해결하고 다음 코드를 보았습니다.
((void (*)())buf)();
buf
문자 배열은 어디에 있습니까 ?
나는 도전을 해결했지만 정확히 무엇을하고 있는지 이해할 수없는 것 같습니다. 나는 보았다 이 스레드 그러나 나는 그것을 만들 수 없습니다.
무슨 ((void (*)())buf)();
뜻입니까?
picoCTF에서 이진 악용 문제를 해결하고 다음 코드를 보았습니다.
((void (*)())buf)();
buf
문자 배열은 어디에 있습니까 ?
나는 도전을 해결했지만 정확히 무엇을하고 있는지 이해할 수없는 것 같습니다. 나는 보았다 이 스레드 그러나 나는 그것을 만들 수 없습니다.
무슨 ((void (*)())buf)();
뜻입니까?
답변:
void (*)()
"유형을 결정하지 않고 값을 반환하지 않는 함수의 포인터"인 유형입니다.
(void (*)())
위 유형에 대한 유형 캐스트입니다.
(void (*)())buf
buf
위 유형으로 캐스트 합니다.
((void (*)())buf)()
함수를 호출합니다 (인수 없음).
간단히 말해서 : 컴파일러에게 buf
함수에 대한 포인터로 취급 하고 해당 함수를 호출하도록 지시합니다.
buf
또는 copy
위치가 실행 가능한 주소에 있고 코드 자체가 위치 독립적 인 경우 작동합니다. 물론 이식 할 수는 없지만 많은 베어 메탈 환경과 스택 및 힙에 NX (No-Execute) 비트를 설정하지 않는 구형 x86 OS에서 작동합니다.
((void (*)())buf)();
뜻입니까? 저자가 이해하지 못한다는 의미typedef
입니다.typedef void (*voidFuncPtrType)();
이 코드를 명확하게 만들 것입니다.