linux-l: Buffer-Overflow

Steffen Solyga solyga at absinth.net
Di Apr 25 19:55:46 CEST 2000


> -----------------------------------------
> #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 */
> }
> -----------------------------------------------

Dem Compiler auf der Spur... sehr aufschlußreich!
Ich habe in das Progrämmchen an einigen Stellen stack dumps eingefügt, um
zu sehen, was wann wo dort landet (siehe attachment). Dabei habe ich fest-
gestellt, daß die 4 Bytes, die Du als (char *s) kommentiert hast, jedoch
nicht die bezüglich buffer_overflow() lokale Variable s beherbergen -- diese
kommt erst nach der Rücksprungadresse. Anscheinend handelt es sich um einen
stackpointer, denn er enthält die erste nicht mehr zu main() gehörende
Stapeladresse. Wer braucht die?
In buffer_overflow() sieht der stack folgendermaßen aus:
        buffer (20 bytes)
     --	fraglicher Zeiger (4 bytes)
    |   Rücksprungadresse (4 bytes)
    |   s (4 bytes)
    |   str (28 bytes)
     -> weiterer fraglicher Zeiger (4 bytes)
        ...

Erinnert sich noch einer an das Monitor-Programm vom C64, das man so schön
als schnellen Assembler/Disassembler verwenden konnte? Bei dem waren die
Aufrufe der einzelnen Komponenten mit PUSH+RET realisiert...

-- 
-------------------------------------------
Steffen Solyga
mail: solyga at absinth.net
www : http://www-tet.ee.TU-Berlin.DE/solyga
-------------------------------------------



Mehr Informationen über die Mailingliste linux-l