2016-12-01 2 views
-1

Ich versuche, eine Pufferüberlauf-Schwachstelle auszunutzen, um die Rücksprungadresse des Stapels zu überschreiben.Pufferüberläufe: Schreiben von 7 in Hexadezimal ohne 'null terminator' (0x00)

Aber der Code, den ich versuche zu "hacken" macht Kanarienvogel-System. Es initialisiert eine ganze Zahl immer mit dem gleichen hartcodierten Wert 7 und überprüft, ob diese Variable später immer noch dieselbe ist.

Ich kann einen Pufferüberlauf erstellen, und ich kann über diese Variable schreiben, aber ich habe Probleme beim Schreiben des richtigen Wertes. Der Pufferüberlauf wird durch die falsche Verwendung von strcpy verursacht. Der Eingang wird durch den Inhalt einer Datei gegeben, wie unten gezeigt:

0000000: 6132 3334 3536 3738 395f 6232 3334 3536 a23456789_b23456 
0000010: 3738 3907 00        789.. 

Die letzten 2 Hexadezimal-Werte (07 00) ist, wo ich Probleme, bin. 07 ist der Wert, den ich in die Variable schreiben möchte (sie wird in die richtige Speicherposition gebracht). Allerdings glaube ich, ich muss 00 an der nächsten Position schreiben, sonst nimmt die Variable einen größeren Wert als 7.

Das Problem mit 00, ist, dass es als null Terminator für Strcpy fungiert, was bedeutet, ich kann ' t liefern keine Informationen mehr und können daher die Absenderadresse nicht überschreiben.

Ist diese Situation zu überwinden, oder ist es einfach unmöglich, den richtigen Wert ohne die Verwendung von 0x00 zu liefern?

EDIT:

Der Code (meist bis zu dem Punkt abgekürzt):

void getwd(char *path) 
{ 
    strcpy(path, mapped_path); 
    return path; 
} 

void pwd(void) 
{ 

    int canary = 7; 
    char path[MAXPATHLEN + 1]; 

    if (getwd(path) == (char *) NULL) 
    { 
    printf("Couldn't get current directory!\n"); 
    } 
    else 
    { 
    printf("Current directory = %s\n", path); 
    printf("max strlen(path) is %d, strlen(path) = %d\n", MAXPATHLEN-1, strlen(path)); 
    printf("Canary should be 7. Canary = %d\n", canary); 
    if (canary != 7) 
     printf("ALERT: path[MAXPATHLEN + 1] has been overflowed!\n"); 
    } 
} 

der Pufferüberlauf wird in getwd geschieht, wo mapped_path größer als Weg ist. mapped_path an diesem Punkt kann die gewünschten Werte enthalten.

+1

Es * könnte * möglich sein, aber es ist schwer zu sagen, ohne irgendeinen Code zu sehen. –

+0

Ich habe den betreffenden Code hinzugefügt. Kannst du es dir nochmal anschauen? – Dalannar

+0

Nun ja, die Überprüfung von 'canary' ist rein informativ, so dass Sie die Absenderadresse immer noch überschreiben können. Sie werden nur den * ALERT * -Aufdruck erhalten, wenn Sie dies tun. – eddiem

Antwort

1

Sie müssten tatsächlichen Shellcode injizieren, der programmatisch die Ganzzahl 7 an dieser bestimmten Position einfügt.

Der erste Schritt besteht darin, die Rücksprungadresse zu finden und diese auf eine bestimmte Position im Puffer zu setzen.

Der zweite Schritt besteht darin, einen Null-freien Shellcode an der vordefinierten Position zu platzieren und den Shellcode die Variable erneut auf 7 setzen zu lassen.

Zero-free Shellcode ist nicht schwer zu schreiben, wegen der vielen Möglichkeiten, eine Variable auf Null zu setzen, ohne die tatsächliche Ziffer wie xor eax, eax (wenn Sie mit der Montage vertraut sind) zu verwenden.

Wenn Sie dies noch nie gemacht haben, würde es wahrscheinlich viel Zeit brauchen, um dieses Ziel zu erreichen.

+0

Ich habe über Dinge wie 'xor eax, eax' beschönigt und ich verstehe meistens, was Sie erklären. Aber nachdem ich all das im Puffer habe, wie führe ich es aus, ohne die% esp zu ändern und auf die Rückkehr der Funktion zu warten? – Dalannar

+0

Sie müssten die esp und die Rücksprungadresse ändern, damit der EIP (Anweisungszeiger) zu Ihrem Shellcode springt. – h4x0r

+0

Er wird ein Problem haben, wenn es ein nicht ausführbarer Stapel ist. Schwer zu tun ROP-Code, wenn das Programm vor der Rückkehr abbricht. –

Verwandte Themen