1

gera's Insecure Programming by example에있는 일부 프로그램을 악용 사례 개발을 가르치기위한 플래그 시나리오를 캡처하는 데 사용할 수있는 클라이언트/서버 응용 프로그램으로 전환하려고합니다. 내가 가지고있는 문제는 Visual Studio (2005 Professional Edition을 사용하고있는 방법)가 스택에 변수를 할당 할 위치를 결정하는 방법을 잘 모르겠다는 것입니다.Visual Studio는 스택 변수를 할당해야하는 순서를 어떻게 결정합니까?

나는 컴파일하고 예 1을 실행하는 경우 :

int main() { 
    int cookie; 
    char buf[80]; 

    printf("buf: %08x cookie: %08x\n", &buf, &cookie); 
    gets(buf); 

    if (cookie == 0x41424344) 
     printf("you win!\n"); 
} 

나는 다음과 같은 결과를 얻을 : cookie 이상의 여든 바이트 아래 주소에서

buf: 0012ff14 cookie: 0012ff64 

buf 시작하고, 복사 된 모든 4 바이트 첫 번째 80 자 이후에 buf에서 cookie에 표시됩니다.

내가 가지고있는 문제는이 코드를 다른 기능에 배치 할 때 발생합니다. 다음 코드를 컴파일하고 실행할 때 다른 결과가 나타납니다. 보다 큰 주소에 buf이 나타납니다.

void ClientSocketHandler(SOCKET cs){ 
int cookie; 
char buf[80]; 
char stringToSend[160]; 
int numBytesRecved; 
int totalNumBytes; 

sprintf(stringToSend,"buf: %08x cookie: %08x\n",&buf,&cookie); 
send(cs,stringToSend,strlen(stringToSend),NULL); 

결과는 다음

buf: 0012fd00 cookie: 0012fcfc 

지금 buf 덮어 쓰기를 통해 임의의 데이터에 대한 쿠키를 설정하는 방법이 없다. buf 앞에 cookie을 할당하도록 Visual Studio에 지시 할 방법이 있습니까? 변수가 어떻게 할당되는지 사전에 알 수있는 방법이 있습니까?

감사합니다,

제이슨

아, 괜찮습니다. 예, 구조체가해야 할 것 같습니다. 도와 주셔서 감사합니다.

답변

2

컴파일러 최적화를 해제하십시오.

최적화가 이미 해제되어있는 경우 컴파일러가 특정 순서대로 로컬을 배치하도록하는 가장 좋은 방법은 로컬 변수를 구조에 배치하고 해당 구조를 로컬 스택에 할당하는 것입니다. 해당 구조의 필드는 독립적 인 로컬 변수보다 컴파일러에서 (서로에 대해) 상대적으로 이동할 가능성이 적습니다.

관련 문제