zurück zu lib_c buffer-overflow-übung Thema
Ich soll kommen mit einem Programm, nutzt die "return to libc-Puffer-überlauf". Dies ist, wenn Sie ausgeführt, es sauber beendet und bringt eine SHELL-Eingabeaufforderung. Das Programm wird ausgeführt in einem bash-terminal. Unten ist mein C-code:
#include <stdio.h>
int main(int argc, char*argv[]){
char buffer[7];
char buf[42];
int i = 0;
while(i < 28)
{
buf[i] = 'a';
i = i + 1;
}
*(int *)&buf[28] = 0x4c4ab0;
*(int *)&buf[32] = 0x4ba520;
*(int *)&buf[36] = 0xbfffff13;
strcpy(buffer, buf);
return 0;
}
Mit gdb, ich habe in der Lage, um zu bestimmen, die folgenden:
- - Adresse für "system": 0x4c4ab0
- - Adresse für "exit": 0x4ba520
- Den string "/bin/sh" befindet sich im Speicher an: 0xbfffff13
Weiß ich auch, mit gdb, dass das einfügen von 32 "A"'s in meinen buffer-variable überschreiben der Rücksprungadresse. So da der system call is 4 bytes, beginne ich durch die Füllung in my memory "Leck" am 28 bytes. Am 28 byte, beginne ich mein system aufrufen, dann beenden call, und schließlich noch meine "/bin/sh" Speicherort.
Wenn ich das Programm ausführen, jedoch bekomme ich die folgende:
sh: B���: command not found
Segmentation fault (core dumped)
Ich bin wirklich nicht sicher, was ich falsch mache...
[EDIT]: ich war in der Lage, die Zeichenkette "/bin/sh" durch exportieren von Umgebungsvariablen:
export MYSHELL="/bin/sh"
- Ist dein string
"/bin/sh"
beendet mit einem\0
? - Zu sehen, wie ich verwendet, "export", um es in den Speicher - es ist durchaus möglich, es ist beendet mit dem \0-Zeichen.
- die Adresse von
/bin/sh
Veränderungen vor und nachgdb
. Finden, ein vorkommen von/bin/sh
direkt in der libc verwendet. - Die Adresse bekam ich für /bin/sh durch mit meinem Programm durch die gdb, also die Adresse, die ich sah, sollte das gleiche wie wenn ich das Programm von selbst. Es gibt keine Adresse Randomisierung auf dieser Maschine, entweder.
- auch ohne stack-randomization, die Form der stack ist nicht das gleiche unter oder nicht unter
gdb
. Die stack-Adresse IhresMYSHELL
variable ist wahrscheinlich anders zu sein, nicht untergdb
als die, die Sie haben untergdb
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Suchen können Sie in der libc für eine Feste Adresse eines string /bin/sh. Führen Sie das Programm in gdb dann:
Glück.
Das problem in Ihrem Programm ist der Zeiger, der angenommen, auf die
/bin/sh
string ist eigentlich nicht auf den/bin/sh
.Bekommen Sie diese Adresse mit
gdb
. Aber auch ohne stack-randomization, stack-Adresse Ihres shell-variable ist anders, wenn das Programm ausgeführt wird, untergdb
als ohnegdb
.gdb
setzt einige debug-Informationen in dem stack, und diese Schicht wird Ihre shell-Variablen.Überzeugen Sie sich selbst hier ist eine quick-and-dirty-Programm zu finden
/bin/sh
string in den stack:Zuerst überprüfen Sie, dass stack-randomization ist deaktiviert:
Ok, kein stack-randomization.
Let ' s kompilieren Sie das Programm und führen Sie es außerhalb
gdb
:Lassen Sie uns nun führen Sie es unter
gdb
:Wie sehen Sie die Adresse der
/bin/sh
string ist anders, wenn das Programm ausgeführt wird, innerhalb oder außerhalbgdb
.Nun, was Sie tun können, ist zu verwenden eine Variante dieses Programms zu finden, die wahre Adresse des Strings oder ein eleganter Ansatz, die Adresse einer
/bin/sh
string direkt aus der libc (wie Sie sich vorstellen können gibt es ein paar vorkommen).