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


59

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

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

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

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

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


14
무슨 ((void (*)())buf)();뜻입니까? 저자가 이해하지 못한다는 의미 typedef입니다. typedef void (*voidFuncPtrType)();이 코드를 명확하게 만들 것입니다.
Andrew Henle

33
CTF 챌린지를 설계 할 때 @AndrewHenle은 명확성이 실제로 최고의 목표는 아니며 일부 난독 화를 챌린지의 일부로 예상 할 수도 있습니다. 아마도 저자는 이것이 가장 읽기 쉬운 방법이 아니라는 것을 알고있었습니다.
ManfP

2
프로그램에 UB가 있음을 의미합니다.
R .. GitHub 중지 지원 얼음

4
그것은 C의 "나선형"형식 선언 규칙이 너무 복잡하다는 것을 의미합니다. C에서 직접 파생되지 않은 거의 모든 정적 유형의 언어가 왼쪽에서 오른쪽 규칙을 대신 사용하는 이유가 있습니다.
메이슨 휠러

2
@MasonWheeler "나선형"은 도시 신화입니다. 선언은 해당 표현만큼이나 "나선형"입니다. 연산자는 단순히 우선 순위와 왼쪽에서 오른쪽 순서로 적용됩니다 (물론 여기서 새로운 것을 말하지 않아도됩니다). .
베드로-모니카 복원 복원

답변:


129

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

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

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

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

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


15
cdecl유틸리티 (또는 웹 사이트 )가 더 복잡한 C 표현식을 영어로 번역하는 데 도움이된다는 것을 알았 습니다.
bta

3
구문이 선언이 아니므로 @bta cdecl은 여기서 유용하지 않습니다. 이전에 선언 된 기호에 대한 캐스트를 통한 함수 호출입니다.
bolov

3
@bolov - 전체 문에, 아니,하지만 하지 Explain 스 가장 복잡한 부분 이의를. 거기에서 나머지를 디코딩하는 것은 매우 간단합니다.
bta

5
@AvD buf또는 copy위치가 실행 가능한 주소에 있고 코드 자체가 위치 독립적 인 경우 작동합니다. 물론 이식 할 수는 없지만 많은 베어 메탈 환경과 스택 및 힙에 NX (No-Execute) 비트를 설정하지 않는 구형 x86 OS에서 작동합니다.
wrtlprnft

4
@ AvD : 반드시 충돌하지는 않습니다. 데이터 영역이 실행으로부터 보호되지 않는 한 (아키텍처 및 런타임 환경에 따라 다름)이 트릭을 사용하여 함수를 런타임에 배열로 컴파일하고 즉시 호출 할 수 있습니다. 35 년 전 DEC Vax에서이 트릭을 사용하여 튜링 머신 진화에 실패한 실험을 위해 튜링 머신을 컴파일했습니다.
TonyK

11

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


9

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


7

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

설명:

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.