linux-l: Buffer-Overflow

Thomas Knop t.knop at isv-gmbh.de
Di Apr 25 11:01:20 CEST 2000


On, Son, 23 Apr 2000, Jens Dreger wrote:
> On Sun, Apr 23, 2000 at 05:40:39PM +0200, Michael Müller wrote:
> > Hallo zusammen!
> > 
> > Ich habe im aktuellen Linux-Magazin unter der Insecurity-Rubrik, in der
> > über Sicherheitslöcher berichtet wird, mehrmals gelesen, daß ein
> > Angreifer durch Erzeugen eines Buffer-Overflows root-Rechte erlangen
> > kann.
> > Mir ist überhaupt nicht klar, was da passiert. Leider ist auch nicht
... gekürzt ...

> Alles was Du jetzt noch machen musst, ist statt 1234567... einen
> ausfuehrbaren Code zu uebergeben und mit etwas Glueck wird der in
> einen Bereich geschrieben, der irgendwann zur Ausfuehrung gelangt,
Das hat wenig mit Glück zu tun ;-)
Der "Trick" ist meist einfach:
Es wird eine Funktion aufgerunfen (in dem zu hackenden Proggi). Die
Rücksprungaddresse landet auf dem Stack. In der Funktion wird eine lokale
Variable deklariert, diese wird ebenfalls auf dem Stack angelegt. Da der
Stackpointer von hinten nach vorne wandert kann man durch Schreiben von
mehr Bytes als in diese Variable (Buffer) passen, die Rücksprungaddress
überschreiben (manupulieren). Wenn die Funktion beendet wird, wird die
Ausführung dann dort fortgesetzt wo man es wollt. Da dieses Überschreiben
*meistens* dadurch erfolgt, daß in C (grrr) Strings mit strcpy anstelle mit
strncpy local kopiert (gebuffert) werden spricht man von Bufferoverflow. 
Hier ein Beispiel (wurde grade mal so von mir gehackt, keine Garantie ;-):
-----------------------------------------
#include <stdio.h>
int test1(){
  printf("root shell ausgefuehren!\n");
  exit(1);
}
int buffer_overflow(char *s){
  char buffer[20]; /* nur 20 bytes ! */
  strcpy(buffer,s);
}
int main(int argc,char *argv[]){

  char str[28]; /* 20 Bytes + 4 Bytes (char *s) + 4 Bytes Return-Addr */  
  strcpy(str,"012345678901234567890123"); /* irgendwelche 24 bytes *(
  *((int *)&str[24]) = (int)&test1;       /* die addresse des codes,
                                             der auisgeführt werden soll */
  str[28] = (char) 0;   /* string terminieren */
  buffer_overflow(str); /* los gehts */
}
-----------------------------------------------

kompilieren mit gcc -g -o test test.c
Als Hack wird diese zusätzliche Funktion (hier im Beispiel test1) 
ebenfalls über den String übergeben (Assembler läßt grüßen ;-). 

Gruß
  Thomas

--
Thomas Knop               Tel: +49-30-53433408
ISV GmbH Berlin           Fax: +49-30-53433435
Am Treptower Park 75        t.knop at isv-gmbh.de
12435 Berlin            http://www.isv-gmbh.de



Mehr Informationen über die Mailingliste linux-l