Ich habe verschiedene Arten von Pufferüberlauf wurde die Überprüfung und lief in ein Problem kann ich mich nicht erinnern, warum es auftritt. Der Code ist wie folgt: das Programm, das ich versucht bin einen Pufferüberlauf führen an:Linux Pufferüberlauf Umgebungsvariablen
#include <stdio.h>
void func(char *buff){
char buffer[5];
strcpy(buffer, buff);
printf("%s\n", buffer);
}
int main(int argc, char *argv[]){
func(argv[1]);
printf("I'm done!\n");
return 0;
}
Das Kernkonzept des Programms ist sehr einfach, ich überläuft gerade den Puffer, um die Absenderadresse von func()
zu überschreiben. Das alles funktioniert gut, wenn ich ihm eine Adresse wie 0x0804850c
gebe, die die <_fini>
des Programms ist. Das Endergebnis, wenn ich den Überlauf mit dieser Adresse implementiere, ist das Programm beendet "würdevoll", ohne I'm done!
zu drucken. Das Problem, auf das ich jetzt stoße, ist, wenn ich versuche, die Rückkehradresse zu etwas zu sagen, das eine Umgebungsvariable sagt, die bei 0xbfffd89
gelegen ist.
Der Code Shell in diesem speziellen Umgebungsvariable befindet sich einfach das Programm, nachdem sie gesagt hello
beenden sollte. Das passiert jedoch nicht, das Programm segelt einfach Fehler und das war's. Es wurde bereits bestätigt, dass der Shell-Code in dem vorherigen Programm funktioniert, das ich zum Testen von Shell-Code geschrieben habe. Jeder hat irgendwelche Ideen, warum das nicht funktioniert. Thx
Führen Sie es unter Gdb aus, um zu sehen, was den Segfault auslöst. Meine Vermutung: Die Umgebungsvariable lebt in einem Speicherbereich, der zwar lesbar aber nicht ausführbar [email protected] EugeneMayevski'EldoSCorp: Ich nehme an, dass "Shell-Code" hier Jargon für Maschinencode ist, der eine Shell und einige externe Befehle ausführt, was Exploits normalerweise tun wollen. Obwohl es in diesem Fall klingt, als ob keine tatsächliche Shell ausgeführt wird. – Celada
@Celada Irgendwelche Vorschläge, wie ich mit GDB überprüfen kann, ob die Umgebungsvariablen READ-ONLY sind. Auch Sie haben den Shell-Code korrekt. – Blackninja543
@ EugeneMayevski'EldoSCorp Shell-Code allgemein definiert ist der Byte-Code einer Binärdatei. In diesem Fall habe ich den Shell-Code erzeugt, indem ich geschrieben habe, was ich in x86 ASM raus wollte. Wenn ich die Rücksprungadresse der Funktion umadressiere, leite ich sie zu einem Bereich des Gedächtnisses, das eine neue Reihe Anweisungen enthält. – Blackninja543