[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