[HACK] Duda con Buffer Overflow

José Carlos Luna Durán luna at aditel.org
Tue Oct 5 11:20:48 CEST 2004


En Fri Oct 01, 2004 at 07:58:33AM +0000, "[ __BoKeN__ ]" <boken__ at hotmail.com> escribio:
> Hola a todos.
> 
> En el siguiente codigo:
> 
> int main() {
> 	char buf[80];
> 	int cookie;
> 
> 	printf("buf: %08x cookie: %08x\n", &buf, &cookie);
> 	gets(buf);
> 
> 	if (cookie == 0x41424344)
> 		printf("you win!\n");
> }
> 
> ¿Como puedo hacer para que la condicional se cumpla?
> 
> Si la declaracion de las variables locales fuera esta:
> 	int cookie;
> 	char buf[80];
> seria mas facil porque solo habria que rellenar la variable buf y 
> seguidamente estaria la variable cookie. Pero en el orden del ejemplo de 
> arriba, la pila almacena cookie en una direccion de memoria mas baja que 
> buf y por ello al desbordar buf no reescribo cookie.
> 
> Una solucion que he pensado es reesecribir RET con &buf y en buf escribir 
> codigo en ASM para que ponga en las direcciones de memoria de cookie los 
> valores deseados y despues que vuelva al verdadero RET. PROBLEMA: No se 
> como recuperar el antiguo RET para que siga la ejecucion normal del 
> programa.
> 
> Alguien sabria darme una manera mas efectiva, elegante, operativa... Vamos 
> que funcione ;)

¿De donde ha salido ese ejemplo?  ¿Cual es el objetivo?
No tiene mucho sentido, no al menos en Linux/x86. Porque para hacer 
lo que dices, casi que mejor hacer que el RET apunte a un shellcode 
que directamente haga el printf "you win"!! xD

De todas formas como la segunda pregunta me parece interesante aquí
tienes una forma de ver en que dirección de memoria acabará cada
trozo de código:

$ cat test1.c
int main() {
    char buf[80];
    int cookie;

    printf("buf: %08x cookie: %08x\n", &buf, &cookie);
    gets(buf);

    if (cookie == 0x41424344)
        printf("you win!\n");
}
$ gcc -ggdb -o test1 test1.c (Compilar con información de depuración)
/tmp/cc0vHOtR.o(.text+0x31): En la función `main':
/home/luna/test1.c:6: warning: the `gets' function is dangerous and
should not be used.

$ objdump -S ./test1 | less
[...]
080483c4 <main>:
int main() {
 80483c4:       55                      push   %ebp
 80483c5:       89 e5                   mov    %esp,%ebp
 80483c7:       83 ec 78                sub    $0x78,%esp
 80483ca:       83 e4 f0                and    $0xfffffff0,%esp
 80483cd:       b8 00 00 00 00          mov    $0x0,%eax
 80483d2:       29 c4                   sub    %eax,%esp
    char buf[80];
    int cookie;
        
    printf("buf: %08x cookie: %08x\n", &buf, &cookie);
 80483d4:       8d 45 a4                lea    0xffffffa4(%ebp),%eax
 80483d7:       89 44 24 08             mov    %eax,0x8(%esp)
 80483db:       8d 45 a8                lea    0xffffffa8(%ebp),%eax
 80483de:       89 44 24 04             mov    %eax,0x4(%esp)
 80483e2:       c7 04 24 24 85 04 08    movl   $0x8048524,(%esp)
 80483e9:       e8 f6 fe ff ff          call   80482e4 <_init+0x48>
    gets(buf);
 80483ee:       8d 45 a8                lea    0xffffffa8(%ebp),%eax
 80483f1:       89 04 24                mov    %eax,(%esp)
 80483f4:       e8 cb fe ff ff          call   80482c4 <_init+0x28>
        
    if (cookie == 0x41424344)
 80483f9:       81 7d a4 44 43 42 41    cmpl
$0x41424344,0xffffffa4(%ebp)
 8048400:       75 0c                   jne    804840e <main+0x4a>
        printf("you win!\n");
[...]

Como ves aqui tienes un volcado entrelazado del código fuente y
como ha sido compilado, además el numero de la izquierda es
la dirección de memoria donde estara albergada cada una
de las instrucciones asm cuando el programa sea cargado.

Saludos,

-- 
Jose Carlos Luna Duran (dreyer) @  UJI
luna at aditel.org / Jose.Carlos.Luna at cern.ch



More information about the hacking mailing list