Frage

Ich versuche, Rückkehr zu libc Trick mit dem folgenden einfachen Code:

#define SYSTEM_CALL_ADDR 0xb7ec5e50  /*my system call addr*/
#define EXIT_CALL_ADDR  0xb7ebbb80   /*my exit call addr*/
char shell[] = "/bin/sh";

int main(){
 int* p; 
 p = (int*)&p + 2;
 *p = SYSTEM_CALL_ADDR;

 p = (int*)&p + 3;
 *p = EXIT_CALL_ADDR;

 p = (int*)&p + 4;
 *p = shell;

 return 1;
}

Interessanterweise, wenn ich dieses Programm ausführen, endet es mit „Segmentation Fehlern“, aber wenn ich es mit gdb debuggen und führen Sie es Schritt für Schritt, es ist völlig in Ordnung, ein Shell-Laichen und dann Programm zu verlassen. Jeder dieser Situation begegnen? oder könnte jemand bitte leite mich, wie dies zu korrigieren? Danke erstmal. Ich bin auf ArchLinux Kernel. 2.6.33, gcc 4.5.0

War es hilfreich?

Lösung

GDB deaktiviert einige der Pufferüberlauf ausnutzen Minderungstechniken wie ProPolice und Adreßraum Layout Randomisierung (ASLR).

Andere Tipps

gdb setzt der ADDR_NO_RANDOMIZE < a href = "http://linux.die.net/man/2/personality" rel = "nofollow"> Persönlichkeit (2) erleichtern debuggen.

Der Absturz tritt auf, weil Ihre Erklärung der Variable ‚p‘ zuordnet nur genug Platz auf dem Stapel für einen einzeln (int *) Zeiger, aber dann stopfen Sie Werte in (& p + 2) usw., so dass Sie das Überschreiben am Ende, die -knows-was. Anders verhält es sich mit oder ohne GDB, weil die wer weiß, welcher Teil gerade nicht in einer Umgebung kritisch sein könnte, aber in den anderen kritisch ist.

Sie können auf „fix“ Ihr Programm in der Lage sein, indem sichergestellt wird, dass der Raum, den Sie über den Papierkorb sind, ist nichts kritisch.

int main(){
 int* p;
 char junk[100];    /* ADD THIS */

Nun ist der freie Raum der Lagerung für ‚p‘ zugewiesen wird (wahrscheinlich) der Junk-char-Array, das Sie mit dem Überschreiben wegkommen können. (Zumindest, dass "fixe" das Programm auf meinem speziellen Linux-System, wenn ich mit "gcc -O0 -g" kompiliere).

Alles, was gesagt - die Methode Sie es verwenden ist nicht in irgendeiner Weise tragbar oder sicher. Der Compiler macht kein Versprechen, dass sein Gehen, die Speicherzuweisungen in der bestimmten Reihenfolge anzuordnen, dass wir ihnen erklären. Auch mit verschiedenen Optimierungsschalter Kompilieren können das Verhalten ändern. So, während dies könnte eine interessante Übung sein, sollten Sie sicherlich nicht erwarten, dass diese Art von Verfahren zu arbeiten konsequent.

Manuelle Manipulation die C auf diese Weise stapeln ist eine schlechte Idee!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top