2017-06-03 1 views
0

Ich bin neu in der Systemsicherheit, und ich versuche, ein einfaches Return-to-Libc-Exploit zu implementieren. Mit GCC -fno-stack-protector gesetzt, jetzt weiß ich, wie man die Rückkehradresse durch die Verwendung eines Pufferüberlauffehlers zerschlägt. Nun möchte ich den Kontrollfluss des Zielprogramms an die system() Funktion von C richten, indem ich eine korrekte Rücksprungadresse einer Funktion mit der Adresse system() überschreibe (Ich kompiliere das Programm mit der Option -static so, dass alle Standardfunktionen von C in der ausführbarer Code). Zum Beispiel ist das Zielprogramm wie:Wo ist das Argument der stdlib.h-Funktion system() in der x86_64-Assembly labguage?

int main(int argc, char *argv[]) { 
    char buffer[8]; 
    gets(buffer); 
    return 0; 
} 

kann ich main() ‚s Absenderadresse mit der Adresse des system() überschreiben, die ich von GDB disassemble Funktion finden. Ich würde gerne "/ bin/sh" als Argument von system() angeben, aber ich weiß nicht, wo das Argument system() Funktion auf dem Adressraum ist. Könnte mir jemand helfen, herauszufinden, wo ich das Argument finden kann?

Antwort

5

Die auf x86-64 verwendete Aufrufkonvention übergibt Argumente in Registern. Das erste Argument wird in RDI übergeben. Dies ist ein wesentlicher Unterschied zu x86, bei dem Argumente normalerweise auf dem Stapel übergeben werden.

Um eine manipulierte Argument an eine Funktion übergeben, müssen Sie es in RDI vorhanden sein machen, entweder durch:

  1. machen main() gibt diesen Wert setzen. (Wahrscheinlich in dieser Situation unmöglich.)

  2. Verwenden Sie ein ROP-Gadget. Suchen Sie die Befehlsfolge pop %rdi; retq im Speicher, und kehren Sie dann zu der Adresse dieser Sequenz mit den Adressen "/bin/sh" und system() auf dem Stapel in dieser Reihenfolge zurück.

    Wenn Sie diese genaue Sequenz nicht finden können, können Sie möglicherweise eine andere Pop-and-Return-Sequenz verwenden, die RDI enthält, und zusätzliche Junk-Werte verschieben, um sie anzupassen. Zum Beispiel, wenn Sie eine pop %rdi; pop %rbp; retq finden, würden Sie einen zusätzlichen Wert nach dem fertigen RDI schieben.