2012-11-13 4 views
8

Die Ausgabe des folgenden Codes ist "Überlauf", aber ich habe die Funktion func nicht explizit aufgerufen. Wie funktioniert es?Erklären Sie diesen Code, der eine Funktion ausführt, ohne sie explizit aufzurufen?

#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 

int copy(char *input) 
{ 
    char var[20]; 
    strcpy(var, input); 
    return 0; 
} 

int func(void) 
{ 
    printf("Overflow\n"); 
    return 0; 
} 

int main(int argc, char *argv[]) 
{ 
    char str[] = "AAAABBBBCCCCDDDDEEEEFFFFGGGG"; 
    int *p = (int *)&str[24]; 
    *p = (int)func; 

    copy(str); 
    return 0; 
} 
+3

Sie meinen Pufferüberlauf ...? – JosephH

+3

Das ist genau, wie ein Hacker ein ungesichertes Programm bekommen kann, um Code auszuführen, den es nicht gemeint hat. Zum Verständnis sind Compiler, Laufzeitumgebung und CPU-Architektur erforderlich. – Jon

+1

Hinweis: Wenn die Adresse von func ein Null-Byte enthält, wird dies nicht so funktionieren, wie Sie es erwarten. – aaronps

Antwort

11

Die copy Funktion überläuft die var Puffer in der copy Funktion und überschreibt die main Rückkehradresse mit der Adresse der func Funktion.

Wenn copy Funktion zurückkehrt, statt nach dem copy Funktionsaufruf main zurückzugeben, gibt es func Funktion.

+0

Es wird zu der Adresse auf der Integer-Wert von "GGGG" zurück? – pedr0

+1

@ pedr0 'GGGG' wird in dieser Zuweisung durch die Adresse der Funktion' func' ersetzt: '* p = (int) func;'. Der 'strcpy' kopiert diese Adresse in die Absenderadresse. – ouah

+0

Warum Array 'str' braucht 4' int' Größe mehr als 'var', anstatt 2 oder 6? – Wilbeibi

Verwandte Themen