Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)
Autor
|
Tema: TheBlackSheep - Stack Overflow (Leído 2,375 veces)
|
Crack_X
Anti-War
Ex-Staff
Desconectado
Mensajes: 2.320
Peace & Love
|
Saludos , esto va especialmente para Rojodos pero si alguien mas puede ayudar pues bienvenido. En www.bright-shadows.net hay un reto donde aparentemente hay que hacer un stack over flow para poder hacer que ejecute otra aplicacion. Solo te dan la aplicacion para que la pruebes en la pc sin el codigo pero aparantemente solo lee lo que pones en el comand line y le hace un echo y no aparenta ser vulnerable a un bof (buffer overflow) porque por mas larga que fue la cadena que le di no hizo ni cosquillas. Debugeando con gdb encontre que en una llamada a una funcion dentro del programa hace un: call %eax , haci que pienso que de alguna manera hay que hacer un exploit con shellcode que haga que %eax llame a nuestro shellcode para que ejecute otro programa. Alguna ayuda o idea? 
|
|
|
|
|
En línea
|
|
|
|
|
heap
|
nah pon un link directo, no esperes que me ponga a buscar por esa web y me registre...................almenos sube el binario aca........
|
|
|
|
|
En línea
|
|
|
|
Crack_X
Anti-War
Ex-Staff
Desconectado
Mensajes: 2.320
Peace & Love
|
Gracias por responder heap , descubri o pienso que descubri , que no es un stack overflow es un "string format vulnerability" , puedo ver algunos offsets y puedo hacer un segmentation fault , pero no se me ocurre como hacer que corra una shellcode.
|
|
|
|
|
En línea
|
|
|
|
|
heap
|
Yeap yo tambien pense eso por lo del call %eax, ahi mismo se me ocurrio atacar el GOT  , sino sabes que es el global access table, googlealo.
|
|
|
|
|
En línea
|
|
|
|
|
heap
|
Mira knoppix@ttyp0[tbs]$ gdb ex2 GNU gdb 6.0 Copyright 2003 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i386-linux"... (gdb) run %n%n%n Starting program: /ramdisk/home/knoppix/Desktop/home/yasser/tbs/ex2 %n%n%n
Program received signal SIGSEGV, Segmentation fault. 0x4006f353 in vfprintf () from /lib/libc.so.6 (gdb)
VFPRINTF
|
|
|
|
|
En línea
|
|
|
|
Crack_X
Anti-War
Ex-Staff
Desconectado
Mensajes: 2.320
Peace & Love
|
Ahora veo mejor por donde va el asunto , corrijeme si me equivoco: -se le añade la shellcode -se cambia el GOT del printf para que llame a la shellcode? Entonces me puse a buscar el offset del printf con objectdump: [crack_x@localhost tbs]$ objdump -R ex2
ex2: file format elf32-i386
DYNAMIC RELOCATION RECORDS OFFSET TYPE VALUE 08049610 R_386_GLOB_DAT __gmon_start__ 08049608 R_386_JUMP_SLOT __libc_start_main 0804960c R_386_JUMP_SLOT printf
El offset del printf es 0x804960c ? Pero al buscarlo con gdb no aparece por parte la llamada a printf aunque se que esta ahi. Segui leyendo un articulo que encontre en phrack que topa el tema de GOT http://www.phrack.org/show.php?p=56&a=5Pero ahora estoy perdido porque aun no se bien como entrar la shellcode en el buffer y luego saber en que offset esta, cambiar el GOT del printf por la de la shellcode. Aunque dure 3 años pasando este reto me a gustado un paquete porque e aprendido mucho , gracias heap  PD: Acabo de ver que publicaste antes que terminara de escribir, habia hecho lo mismo pero con run "%s%s%s%s" y me daba lo siguiente: Program received signal SIGSEGV, Segmentation fault. 0x4009c06b in strlen () from /lib/i686/libc.so.6
Entonces cual GOT es que tengo que cambiar el printf() o vfprintf() ?
|
|
|
|
|
En línea
|
|
|
|
|
heap
|
Listo ya pude.....ya solo me falta ver si logro correr el shellcode, ya logre ver como explotarlo, solo intentare GOT........y sino ni idea porque este binario no lo compilaron con gcc, es muy raro no tiene destructores.....o me equivoco knoppix@ttyp0[tbs]$ objdump -R ex2 ex2: formato del fichero elf32-i386 DYNAMIC RELOCATION RECORDS OFFSET TYPE VALUE 08049610 R_386_GLOB_DAT __gmon_start__ 08049608 R_386_JUMP_SLOT __libc_start_main 0804960c R_386_JUMP_SLOT printf 
|
|
|
|
|
En línea
|
|
|
|
|
heap
|
En verdad que esta muy bueno el reto, si algun moderador ve esto, que borre este post y le ponga chincheta 
|
|
|
|
|
En línea
|
|
|
|
Crack_X
Anti-War
Ex-Staff
Desconectado
Mensajes: 2.320
Peace & Love
|
Volviendo al vprintf...... vprintf 0x4006be36 mov %edx,(%eax) Si cambiamos el valor de eax podemos hacer que el call llame a donde le digamos o no? Debugueando un poco: eax 0x400377f7 1073969143 $ex2 "AAAABBBB %x %x %x %x" AAAABBBB bffff764 bffff738 400377f7 2
Tengo ententido que "bffff764" es donde se almacena el "AAAABBBBB" y vemos que mas adelante en el stack esta el valor de %eax "400377f7" , entonces si le damos la shellcode , cambiamos el valor de %eax para que salte al buffer quizas funcione? Piensas que voy bien o me fui lejos? 
|
|
|
|
|
En línea
|
|
|
|
|
heap
|
Perdona que no pueda mirar lo que haz dicho con detenimiento, estoy muy ocupado, pero lo que tienes que hacer, es escribir la direccion (%n) de la funcion siguiente a donde esta el error de formato, creo que tendria que debbugear mas, porque ese strlen (); esta muy raro, ahora ya no estoy seguro si vfprintf(); es donde esta el error, dado que strlen(); recive un puntero, y devuelve el numero de caracteres sin /00, pero en ningun momento necesita un especificador de formato, contrario a vfprintf que si. A decir verdad tambien me extra~o no ver ningun destructor, ya que pense habia sido compilado con gcc pero .dtors no estaba en ningun lado. En todo caso hace falta mas debbuging, y disassembly, intenta localizar porque strlen falla, y intenta ver donde esta el error de formato y con la GOT localizar la siguiente funcion a ejecutar, eso por ahora, luego la explotacion es un juego de ni~os. Yo tengo que estudiar mucho esta semana pero cuando tenga un rato libre me pongo a jugarle a este reto...
|
|
|
|
|
En línea
|
|
|
|
HaCkZaTaN
Desconectado
Mensajes: 109
|
Ahora le sigo, tengo q comer ........ Salu2!! root@NST:/home/h4ck# gdb ./ex2 GNU gdb 6.3 Copyright 2004 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i486-slackware-linux"...Using host libthread_db library "/lib/libthread_db.so.1".
(gdb) r %s%s%s%s Starting program: /home/h4ck/ex2 %s%s%s%s
Program received signal SIGSEGV, Segmentation fault. 0x400874ab in strlen () from /lib/libc.so.6 (gdb) r %n%n%n The program being debugged has been started already. Start it from the beginning? (y or n) y Starting program: /home/h4ck/ex2 %n%n%n
Program received signal SIGSEGV, Segmentation fault. 0x4005cb1a in vfprintf () from /lib/libc.so.6
(gdb) where #0 0x400874ab in strlen () from /lib/libc.so.6 #1 0x4005cb1a in vfprintf () from /lib/libc.so.6 #2 0x400630f2 in printf () from /lib/libc.so.6 #3 0x080483bf in main ()
(gdb) r %hn%hn%hn The program being debugged has been started already. Start it from the beginning? (y or n) y Starting program: /home/h4ck/ex2 %hn%hn%hn
Program received signal SIGSEGV, Segmentation fault. 0x4005cb03 in vfprintf () from /lib/libc.so.6 (gdb)
------------------------------------------------------------
root@NST:/home/h4ck# objdump -t ex2 | egrep "start|end" 080482e4 l F .text 00000000 call_gmon_start 08049514 g *ABS* 00000000 __fini_array_end 080482c0 g F .text 00000000 _start 08049514 g *ABS* 00000000 __fini_array_start 08049614 g *ABS* 00000000 __bss_start 00000000 F *UND* 000000f8 __libc_start_main@@GLIBC_2.0 08049514 g *ABS* 00000000 __init_array_end 08049514 w .data 00000000 data_start 08049618 g *ABS* 00000000 _end 08049514 g *ABS* 00000000 __init_array_start 08049514 g .data 00000000 __data_start 00000000 w *UND* 00000000 __gmon_start__ root@NST:/home/h4ck#
root@NST:/home/h4ck# objdump -s -j .dtors ex2
ex2: file format elf32-i386
Contents of section .dtors: 80495f0 ffffffff 00000000 ........ root@NST:/home/h4ck# objdump -s -j .ctors ex2
ex2: file format elf32-i386
Contents of section .ctors: 80495e8 ffffffff 00000000 ........ root@NST:/home/h4ck#
root@NST:/home/h4ck# objdump -D ex2 | grep dtors 08048310 <__do_global_dtors_aux>: 804831d: 75 2d jne 804834c <__do_global_dtors_aux+0x3c> 8048328: 74 1b je 8048345 <__do_global_dtors_aux+0x35> 8048343: 75 eb jne 8048330 <__do_global_dtors_aux+0x20> 80484e1: e8 2a fe ff ff call 8048310 <__do_global_dtors_aux> Disassembly of section .dtors: root@NST:/home/h4ck# objdump -D ex2 | grep ctors 8048280: e8 1b 02 00 00 call 80484a0 <__do_global_ctors_aux> 080484a0 <__do_global_ctors_aux>: 80484b4: 74 16 je 80484cc <__do_global_ctors_aux+0x2c> 80484ca: 75 f4 jne 80484c0 <__do_global_ctors_aux+0x20> Disassembly of section .ctors: root@NST:/home/h4ck#
root@NST:/home/h4ck# objdump -h ex2|grep dtor 18 .dtors 00000008 080495f0 080495f0 000005f0 2**2 root@NST:/home/h4ck# objdump -h ex2|grep ctor 17 .ctors 00000008 080495e8 080495e8 000005e8 2**2
root@NST:/home/h4ck# objdump -d ex2 | grep printf 080482a8 <printf@plt>: 80483a1: e8 02 ff ff ff call 80482a8 <printf@plt> 80483ba: e8 e9 fe ff ff call 80482a8 <printf@plt> 80483c6: e8 dd fe ff ff call 80482a8 <printf@plt> root@NST:/home/h4ck#
Se me olvidaba tienen que anadir 4 bytes siempre a la dtors si la vas a sobreescribir
|
|
|
|
« Última modificación: 9 Febrero 2005, 12:44 por HaCkZaTaN »
|
En línea
|
|
|
|
|
heap
|
Ea muy bien  , igual yo la cague horrible, porque nunca habia hecho con un binario, ya pude explotarlo pero solo porque dex me dio una mano y me explico varias shits, como porque strlen() hace segfault y porque vfprint() esta ahi. El format BUG esta en un printf(argv[1]); //aca ! printf("\n"); Bueno yo no le habia puesto mucha atencion a lof formats, dado que ya desaparecieron de los code open source, ya otra cosa es auditar binarios....pero va ............... hay que hacer como taller o algo, por ahora si alguien quiere poder exploitear esto, yo decia que con GOT, pero asi esta muy feo, ya que este si tiene .dtors asi que aca esta el paper para que puedan explotarlo, es para mi el mejor, by scut: http://www.shellcode.com.ar/docz/bof/formatstring-1.2.pdf
|
|
|
|
|
En línea
|
|
|
|
Crack_X
Anti-War
Ex-Staff
Desconectado
Mensajes: 2.320
Peace & Love
|
Una duda sobre string format bugs, al poner
root@local: ./vuln %x%x%x
va enseñando las direcciones del stack anteriormente? osea... Si el stack esta haci:
1a = hola 1b = mundo 1c= extra
El primer %x enseña el 1c , el siguiente 1b y etc.?
Saludos,
|
|
|
|
|
En línea
|
|
|
|
|
|