카나리아 값을 사용해보십시오. 그것은 다음과 같습니다 있도록
struct foo {
unsigned long bar;
void * baz;
};
를 수정 : -이 그것은 기본적으로 어떻게되는지 당신이 어떤 struct
이 있다고 가정하면 struct
를 초기화하면
struct foo {
unsigned long canary1;
unsigned long bar;
void * baz;
unsigned long canary2;
};
이 canary1
및 canary2
에 어떤 임의의 값을 넣어. struct
에서 일부 작업을 수행 할 때마다 값이 동일하게 유지되는지 확인하십시오. 이렇게하면 버퍼 오버 플로우 나 스택 스매싱이 발생하면이를 감지 할 수 있습니다. 자동 변수를 사용하여 동일한 내부 함수를 수행 할 수 있습니다.
int foo(int bar) {
unsigned long canary1 = 0xDEADBABE;
char baz[20];
unsigned long canary2 = 0xBAD0C0DE;
...
}
등등. return
전에 값이 동일하게 유지되는지 확인하는 것을 잊지 마십시오. 또한 코드가 일관되게 같은 위치로 점프 할 수 있다면 코드 (또는 중단 점)를 넣고 스택 추적을 얻으십시오.
GCC는 이러한 카나리아 값을 추가하는 방법을 알고 있지만 컴파일러가이를 수행 할 수 있는지 여부는 알지 못합니다. 그러나 당신은 여전히 그것을 수동으로 할 수 있습니다.
PC에 관해서는 정확합니다. 제 질문을 수정하겠습니다. – stdcall