Segmentation fault en un código ensamblador

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

Moderador: Moderadores

Segmentation fault en un código ensamblador

Notapor NewLog » Mar Ago 10, 2010 9:52 pm

A los maestros del shellcoding que viven en Wadalbertia!

Aquí os dejo un código - muy muy comentado - que no se porqué me falla. Lo he estado revisando, a dedo, y no encuentro el error. Se que ni mucho menos este código es óptimo, sólo lo he escribo para mostrar el concepto del jmp/call.

Código: Seleccionar todo
BITS 32                 ;Indicamos a nasm que genere un codigo para una arquitectura de 32 bits
section .text
global _start

_start:
jmp short texto         ;Aqui­empieza el jmp/call trick. Salta a texto. Ahorramos un byte con el 'short'.
code:
pop ebx                 ;Ponemos en ebx la direccion donde se encuentra '/bin/sh'. Sera el primer argumento de la syscall.
xor eax, eax            ;Ponemos a 0 el registro eax
cdq                     ;Ponemos a 0 el registro edx gracias a que eax es 0. Nos ahorramos un byte.
mov byte [ebx+7], al    ;Ponemos un null-byte al final de la cadena /bin/sh.
mov [ebx+8], ebx        ;A continuacion de la cadena, almacenamos la direccion de la misma cadena
mov byte [ebx+12], al   ;A continuacion de los 4 bytes de la direccion, almacenamos un byte nulo
lea ecx, [ebx+8]        ;En ecx almacenamos la direccion donde se almacena la direccion a /bin/sh
mov al, 11              ;En eax ponemos el valor de la execve syscall. Trabajando con al nos ahorramos un byte.
int 0x80                ;Ejecutamos la syscall.
texto:
call code               ;Llamamos a code. En la pila se almacena la direccion donde se encuentra '/bin/sh'.
db '/bin/sh'


Me gustaría, si podéis, que me comentarais como puede debugar el código para no estaros dando la brasa cada dos por tres. He intentado debugarlo con gdb, pero no se como ponerle un breakpoint en la primera instrucción.

Gracias por ser siempre mi apoyo gente!
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: Segmentation fault en un código ensamblador

Notapor vlan7 » Mié Ago 11, 2010 7:45 am

Buenas,

Tu shellcode esta bien hecha. Peeeero seguramente estes ejecutandola sin desactivar la proteccion NX. :embudito:

La opcion mas limpia es desactivar NX solo para el ejecutable. Lo puedes hacer con:

Código: Seleccionar todo
execstack -s ejecutable


No se en que distro estas. En Debian/Ubuntu debes instalar el paquete prelink para disponer del comando execstack

Desactiva NX, ejecuta y cuentanos ;)

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: Segmentation fault en un código ensamblador

Notapor vlan7 » Mié Ago 11, 2010 8:53 am

Efectivamente, mira:

Código: Seleccionar todo
[email protected]:~$ nasm -f elf32 sc.asm
[email protected]:~$ objdump -d sc.o

sc.o:     file format elf32-i386


Disassembly of section .text:

00000000 <_start>:
   0:   eb 14                   jmp    16 <texto>

00000002 <code>:
   2:   5b                      pop    %ebx
   3:   31 c0                   xor    %eax,%eax
   5:   99                      cltd   
   6:   88 43 07                mov    %al,0x7(%ebx)
   9:   89 5b 08                mov    %ebx,0x8(%ebx)
   c:   88 43 0c                mov    %al,0xc(%ebx)
   f:   8d 4b 08                lea    0x8(%ebx),%ecx
  12:   b0 0b                   mov    $0xb,%al
  14:   cd 80                   int    $0x80

00000016 <texto>:
  16:   e8 e7 ff ff ff          call   2 <code>
  1b:   2f                      das   
  1c:   62 69 6e                bound  %ebp,0x6e(%ecx)
  1f:   2f                      das   
  20:   73 68                   jae    8a <texto+0x74>
[email protected]:~$ objdump -d ./sc.o |grep '[0-9a-f]:' |grep -v 'file' |cut -f2 -d: |cut -f1-6 -d' ' |tr -s ' ' |tr '\t' ' ' |sed 's/ $//g' |sed 's/ /\\x/g' |paste -d '' -s |sed 's/^/"/' |sed 's/$/"/g'
"\xeb\x14\x5b\x31\xc0\x99\x88\x43\x07\x89\x5b\x08\x88\x43\x0c\x8d\x4b\x08\xb0\x0b\xcd\x80\xe8\xe7\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68"
[email protected]:~$ gedit sc7.c
[email protected]:~$ cat sc7.c
char sc[] = {
"\xeb\x14\x5b\x31\xc0\x99\x88\x43\x07\x89\x5b\x08\x88\x43\x0c\x8d\x4b\x08\xb0\x0b\xcd\x80\xe8\xe7\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68"
};

typedef void (*f)();

int main()
{
    f func;
    func = (f)sc;
    func();
    return 0;
}
[email protected]:~$ gcc -o sc7 sc7.c
[email protected]:~$ ./sc7
Fallo de segmentación
[email protected]:~$ execstack -s sc7
[email protected]:~$ ./sc7
$


Ahi tenemos la shell, que bonita :)

Ah, con:

Código: Seleccionar todo
[email protected]:~$ objdump -d ./sc.o |grep '[0-9a-f]:' |grep -v 'file' |cut -f2 -d: |cut -f1-6 -d' ' |tr -s ' ' |tr '\t' ' ' |sed 's/ $//g' |sed 's/ /\\x/g' |paste -d '' -s |sed 's/^/"/' |sed 's/$/"/g'


Obtenemos los opcodes sin copiarlos a mano (un coñazo). Para mi es un buen 'hack' (aunque no se me dan demasiado bien los filtros, seguramente es optimizable ;))

Por cierto, seguramente ya lo sabras, pero la razon por la que se tenga que pasar a codigo C una shellcode es porque la seccion code es solo lectura.

Sobre debuggear con gdb no te puedo ayudar demasiado, nunca me gusto gdb... Si alguien conoce alguna alternativa en unix que avise...

Y sobre NX... lo que hace esencialmente es denegarnos ejecutar codigo en ciertas zonas de memoria. La pila (stack), heap y la seccion data tambien, con el flag NX activado estan marcadas como no ejecutables. Las unicas zonas ejecutables pasan a ser las secciones code y text. Ambas de solo lectura. Busca en google si quieres profundizar, pero quedate con la siguiente idea practica:

-para probar una shellcode: deshabilitamos NX.
-para probar un exploit BOF real: deshabilitamos ASLR.

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: Segmentation fault en un código ensamblador

Notapor NewLog » Mié Ago 11, 2010 12:12 pm

Estaba casi seguro que era por alguno de estos temas. Pero veo que aunque he desactivado ASLR ha sido totalmente inútil, y ya entiendo el porqué. Me pensaba que mi linux no implementaba ningún otro sistema protección, lo he revisado en /proc/sys/kernel/ y sólo había el archivo randomize_va_space seteado a 2.

Cuando vuelva a casa te comento si me ha funcionado o no. Que ahora tengo que ser escueto :embudito:

Hasta ahora!
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: Segmentation fault en un código ensamblador

Notapor NewLog » Mié Ago 11, 2010 8:51 pm

Buenas vlan7, voy a ir por pasos.

He probado lo que has comentado y efectivamente era eso, pero hay unas cuantas cosas que no entiendo.

1) Tal y como has comentado, para que me funcione el shellcode este debe estar insertado en una cadena y ejecutado con un puntero a una función. Porqué no funciona 'compilando' nasm y linkándolo con ld? Si lo hago así me sigue dando el segmentation fault, sino sí que funciona. Ves a la parte de EDIT para saber más.

2) He conseguido ejecutar el mismo shellcode pero en vez de utilizar la técnica del jmp/call he hecho un push de la cadena y sin segmentation fault. Si necesitas el código para dar una respuesta te lo engancho ;) Quiero decir que lo he ejecutado sin hacer antes lo del execstack!

3) Por otro lado, he intentado poner por defecto a 0 el exec-shield tal y como he leído aquí, en el momento de que la máquina se inicie. Pero no se cómo poner las opciones exec-shield=0 o noexec=off.

En fin, me harías un favor si pudieras contestar a las preguntas -como si de un interrogatorio se tratara- :badgrin:

Por cierto, la verdad es que flipo con tus comandos xD Yo tenía pensado currarme un programa en c que lo hiciera jajaja. Y tu me lo haces en una línea! Qué perro!!! Pero bueno, lo intentaré hacer para poner cada linea del shellcode en hexadecimal y al lado su código ensamblador comentado. (A menos que lo sepas hacer en dos líneas :D)


Gracias!

EDIT: Me había olvidado de decir que cuando hago el execstack del ejecutable generado con nasm y ld me da el siguiente error:
Código: Seleccionar todo
execstack: execve-JmpCall: Reshuffling of objects to make room for
program header entry only supported for shared libraries
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: Segmentation fault en un código ensamblador

Notapor vlan7 » Mié Ago 11, 2010 11:08 pm

NewLog escribió:1) Tal y como has comentado, para que me funcione el shellcode este debe estar insertado en una cadena y ejecutado con un puntero a una función. Porqué no funciona 'compilando' nasm y linkándolo con ld? Si lo hago así me sigue dando el segmentation fault, sino sí que funciona. Ves a la parte de EDIT para saber más.


Bueno, estamos trabajando con OS en modo protegido, la seccion code del ejecutable es de solo lectura como te dije. Es por eso que necesitamos que la shellcode se copie a si misma _entera_ a la pila antes de intentar ejecutarla. Eso lo conseguimos metiendo todos los opcodes de golpe con el tipico programa en C que creo que aparecio por primera vez en la phrack aquella del articulo de Aleph's One

NewLog escribió:2) He conseguido ejecutar el mismo shellcode pero en vez de utilizar la técnica del jmp/call he hecho un push de la cadena y sin segmentation fault. Si necesitas el código para dar una respuesta te lo engancho ;) Quiero decir que lo he ejecutado sin hacer antes lo del execstack!


Pues no se como es el codigo, quizas debuggeando vieramos el porqué. A ver si alguien mas puesto nos echa algo de luz a estos dos aprendices... 8)

NewLog escribió:3) Por otro lado, he intentado poner por defecto a 0 el exec-shield tal y como he leído aquí, en el momento de que la máquina se inicie. Pero no se cómo poner las opciones exec-shield=0 o noexec=off.


Si usas GRUB, debes añadir la opcion exec-shield=0 al final de la linea que carga el kernel tal que asi:

kernel /vmlinuz-2.6.x ro root=LABEL=/ exec-shield=0

NewLog escribió:En fin, me harías un favor si pudieras contestar a las preguntas -como si de un interrogatorio se tratara- :badgrin:


Solo deberia hacerlo en presencia de mi abogado, el ilustrisimo Dr. Wadalberto. Pero tengo miedo de que me suba la medicacion el maldito :D

NewLog escribió:Yo tenía pensado currarme un programa en c que lo hiciera jajaja.


Un folk lo hizo con un programa en C++ aqui: http://www.vividmachines.com/shellcode/odfhex.cpp Cuestion de gustos...

Un saludo.
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: Segmentation fault en un código ensamblador

Notapor NewLog » Jue Ago 12, 2010 7:30 pm

Buenas vlan7!

He estado un poco más con el tema. El caso es que el ejecutable compilado con nasm y lincado con ld da el segfault porqué execstack no funciona con lo ejecuto con éste! No lo entiendo, es algo de las librería compartidas... En cambio, con el ejecutable generado a partir del código C, execstack sí que funciona... Da el siguiente error:
Código: Seleccionar todo
Reshuffling of objects to make room for program header entry only supported for shared libraries

Que ya he puesto antes.

Por otro lado, no he conseguido hacer que funcione lo del execstack=0 en el menú de Grub. Esta noche te escribo justo dónde añado esa línea y qué hay en el "menú de opciones" de grub, ya que la línea que modifico no es exactamente como la que tu has puesto -o sea, no empieza por kernel.

Por último, te engancho el código que utilizo en el shellcode donde hago el push de /bin/sh en vez de utilizar el jmp/call. No entiendo porqué funciona sin el execstack, cuando los pushes se hacen en la pila y se ejecuta la cadena que se pushea! Mi no entender!!!

Código: Seleccionar todo
BITS 32
section .text
global _start
_start:
xor eax, eax
cdq
push eax
push long 0x68732f6e
push long 0x69622f2f
mov ebx, esp
mov al, 0x0b
int 0x80


A ver si tu ves la luz... O esperamos a TuXeD o algún otro wadalbertita!

Gracias por la ayuda vlan7!
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: Segmentation fault en un código ensamblador

Notapor vlan7 » Vie Ago 13, 2010 12:02 pm

Buenas,

Sobre lo de NASM + ld, en el codigo ejecutable resultante yo no consigo que enlace las librerias necesarias como libc. Por ejemplo, si hago un "ldd ejecutable" en el codigo C compilado con gcc si que aparece libc...

Sobre lo de desactivar NX globalmente, ¿que distro tienes? ahora estoy de vacaciones y en eso podria echarte un cable. En lo que no se me ocurre bien el porqué es en lo de que no se tenga que desactivar NX al hacer push de la cadena. A ver si alguien nos ilumina en esa parte :)

Un saludo.
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: Segmentation fault en un código ensamblador

Notapor NewLog » Vie Ago 13, 2010 12:53 pm

Buenas vlan,

Hay una cosa que no entiendo, porqué quieres que el ejecutable generado con nasm+ld enlace otras librerías? (Cuando no las necesita, al estar programado en bajo nivel). Tengo una idea del porqué, a ver si acierto. Es porqué execstack comprueba que las funciones que se ejecutan en la pila pertenezcan a ciertas librerías? Entonces, como el programa generado por nasm+ld no utiliza ninguna librería, execstack no funciona y da ese error...

Si esa fuera la razón... Qué costaba hacer una versión de execstack para ejecutables en general y no para las librerías? Como no entiendo exactamente como funciona execstack tengo algunas lagunas sobre el tema.

Por otro lado, imagino que si puedo desacticar NX por defecto al iniciar, podré ejecutar sin problemas los ejecutables generados con nasm+ld, cierto?

Bueno, a ver si lo puedo desactivar por defecto. Tengo una lucid lynx. Y de nuevo siento no poder-te poner exactamente lo que pone en el "menú" de Grub. Después te lo comento! Pero básicamente hay dos líneas importantes, una que tiene de por medio el initd y otra que imagino que carga el kernel. En esta línea que creo que carga el kernel, he escrito el exec-shield=0 tanto al final de las opciones que tiene como en el principio.

Gracias y a ver si lo podemos sacar!
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: Segmentation fault en un código ensamblador

Notapor vlan7 » Vie Ago 13, 2010 6:25 pm

Hola NewLog.

Resulta que el unico S.O. al que tengo acceso en agosto es una ubuntu lucid (pero x64), asi que puedo compilar codigo C con shellcodes para 32 bits con las librerias multilib, pero no se me ocurre como hacerlo con ld (aunque tiene opciones de emulacion a mi no me funcionan bien), asi que no puedo probarlo en el host. Pero mira:

http://www.tenouk.com/Module000linuxgas2.html

-z noexecstack Mark executable as not requiring executable stack


El caso es que yo lo he probado desde una backtrack4-R1 que tenia en un DVD (lo mas parecido que tengo a ubuntu x86) corriendo bajo virtualbox y me sigue dando el segmentation fault. :?

Por cierto, en backtrack que esta basada en ubuntu, tu primer codigo funciona a la perfeccion sin desactivar ninguna proteccion.

No he encontrado manera humana de desactivar NX globalmente en ubuntu :( (si que se le puede pasar un parametro a gcc, que seria lo equivalente a usar execstack -s ejecutable)

Nos estamos liando tio... :|
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: Segmentation fault en un código ensamblador

Notapor NewLog » Dom Ago 15, 2010 3:05 pm

Buff, esto cada vez tiene menos sentido!

Voy a hacer un resumen de lo que he ido haciendo o descubriendo:

1) Lo que da el segmentation fault no es la llamada protección exec-shield ya que
1.1)
Cuando miro en el archivo /etc/sysctl.conf no existe la línea kernel-exec-shield = 1. Además, consecuentemente, si ejecuta sysctl -w kernel.exec-shield=0 me dice que no encuentra dicha clave.

1.2)
En la carpeta proc/sys/kernel encuentro el archivo randomize_va_space, sin embargo no existe el archivo exec-shield.

1.3) Tal y como explican aquí, cuando ejecuto readelf -l execJmpCall | grep -i stack sobre el ejecutable generado vía ld y nasm sin el modificador -z execstack:
Código: Seleccionar todo
[email protected]:~/Documentos/Shellcoding/Codigos/ExecveShellcode/JmpCallExecve$ readelf -l execve-JmpCall | grep -i stack
[email protected]:~/Documentos/Shellcoding/Codigos/ExecveShellcode/JmpCallExecve$

No obtengo nada lo que significa que el stack es ejecutable.
Cuando ejecuto el mismo comando generando el ejecutable con el flag -z execstack obtengo:
Código: Seleccionar todo
[email protected]:~/Documentos/Shellcoding/Codigos/ExecveShellcode/JmpCallExecve$ readelf -l execve-JmpCall | grep -i stack
  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RWE 0x4
[email protected]:~/Documentos/Shellcoding/Codigos/ExecveShellcode/JmpCallExecve$

Como se ve por el RWE, la E significa que la pila es ejecutable.
Quizá la pila esté marcada como ejecutable por lo que realizo en el punto número 2). Aunque no lo he comprobado.

2) En el menú de grub2 he añadido las instrucciones noexec=off y exec-shield=0 por separado y nunca juntas sin ningún tipo de éxito. Una vez ejecuto los programas me da segfault de nuevo.

3) Sobre el ejecutable compilado vía gcc sin ningún flag y a partir del shellcode JmpCall recibo un segfault si lo ejecuto sin previamente haber marcado el binario con execstack -s testJmpCall. Si ejecuto la instrucción execstack el ejecutable me da una bonita shell. Así que execstack realiza su función. Aunque previamente haya comprobado en el paso 1.3 que la pila es ejecutable.

4) Si ejecuto el comando execstack -s execveJmpCall sobre el binario generado vía nasm+ld me da el siguiente error SIN haber añadido la línea -z execstack en ld:
Código: Seleccionar todo
[email protected]:~/Documentos/Shellcoding/Codigos/ExecveShellcode/JmpCallExecve$ execstack -s execve-JmpCall
execstack: execve-JmpCall: Reshuffling of objects to make room for
program header entry only supported for shared libraries

En cambio, si genero el ejecutable vía nasm+ld CON el flag -z execstack el comando execstack -s execveJmpCall NO me da ningún error, pero obtengo un bonito segfault!! Que el comando execstack -s me de error o no me lo de veo que tiene algún tipo de relación con el punto 1.3).



Así que estoy jodidamente perdido! Esto no tiene sentido! A continuación te engancho el código escrito en ensamblador -ya está arriba-:
Código: Seleccionar todo
BITS 32                 ;Indicamos a nasm que genere un codigo para una arquitectura de 32 bits
section .text
global _start

_start:
jmp short texto         ;Aqui­empieza el jmp/call trick. Salta a texto. Ahorramos un byte con el 'short'.
code:
pop ebx                 ;Ponemos en ebx la direccion donde se encuentra '/bin/sh'. Sera el primer argumento de la syscall.
xor eax, eax            ;Ponemos a 0 el registro eax
cdq                     ;Ponemos a 0 el registro edx gracias a que eax es 0. Nos ahorramos un byte.
mov byte [ebx+7], al    ;Ponemos un null-byte al final de la cadena /bin/sh.
mov [ebx+8], ebx        ;A continuacion de la cadena, almacenamos la direccion de la misma cadena
mov byte [ebx+12], al   ;A continuacion de los 4 bytes de la direccion, almacenamos un byte nulo
lea ecx, [ebx+8]        ;En ecx almacenamos la direccion donde se almacena la direccion a /bin/sh
mov al, 11              ;En eax ponemos el valor de la execve syscall. Trabajando con al nos ahorramos un byte.
int 0x80                ;Ejecutamos la syscall.
texto:
call code               ;Llamamos a code. En la pila se almacena la direccion donde se encuentra '/bin/sh'.
db '/bin/sh'


Y el código utilizado para el archivo .c es el siguiente:
Código: Seleccionar todo
#include <stdio.h>

char shellcode[] = "\xeb\x14\x5b\x31\xc0\x99\x88\x43\x07\x89\x5b\x08\x88\x43\x0c\x8d\x4b\x08\xb0\x0b\xcd\x80\xe8\xe7\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68";
     
int main(int argc, char **argv) {
        void (*func) (void);
        func = (void *) shellcode;
        func();
}


Ahora las preguntas a tu post anterior:

1) Se ve que a los dos aun habiendo utilizado el flag -z execstack en ld nos sigue dando segfault.
2) Cuando dices que mi primer código funciona en Backtack sin desactivar BackTrack, a qué código te refieres y a qué versión de Backtrack? Porqué me acabas de decir que el código JmpCall en ensamblador en tu Backtrack 4 -R1 te da segfault.
3) También he visto lo del flag al gcc.

En fin, el resumen viene a decir esto:
El sistema me dice que la pila es ejecutable. Parece ser que no tengo la protección exec-shield ya que sus archivos de configuración no existen. Pero, sin embargo, el ejecutable generado vía nasm+ld falla SIEMPRE, pero el ejecutable generado vía gcc falla cuando no se ejecuta el comando execstack y funciona de perlas cuando se ejecuta dicho comando.





¡¡¡¡¡ PLEASE HEEEEEEEELP !!!!

No se qué más hacer... Si podéis, aunque sólo sean ideas...
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: Segmentation fault en un código ensamblador

Notapor vlan7 » Lun Ago 16, 2010 4:22 am

Buenas,

Muy bien explicado tu ultimo post, enhorabuena.

Es tarde, pero a veces de noche se rinde mejor. Permiteme NewLog hacer una shellcode a mi manera, aunque sea para comprobar como funciona con solo nasm + ld, ya que a veces haciendo las cosas a nuestra manera se entiende uno mismo mejor.

Desde BT4-R1:

Código: Seleccionar todo
[email protected]:~# cat sc.asm
BITS 32

;int execve(const char *filename, char *const argv[], char *const envp[]);

xor eax, eax
cdq         ;edx=envp
push edx    ;terminamos cadena de filename y el array argv
push sh     ;push de cadena /bin/sh en la pila
mov ebx, [esp]  ;ebx=direccion de la cadena
mov ecx, esp    ;ecx=direccion del puntero a la cadena
mov al, 11      ;execve es la syscall 11
int 0x80
sh   db      "/bin/sh"
[email protected]:~# nasm -f elf sc.asm
[email protected]:~# ld sc.o
ld: warning: cannot find entry symbol _start; defaulting to 0000000008048060
[email protected]:~# ./a.out
sh-3.2# id
uid=0(root) gid=0(root) groups=0(root),4(adm),20(dialout),24(cdrom),46(plugdev),110(lpadmin),111(sambashare),112(admin)
sh-3.2#


Bien, ahi tenemos la shell. Por lo menos hemos visto que es posible hacerlo solo con ASM. Pienso que el caso es avanzar aunque sea paso a paso, que el camino mas largo empieza por un paso jeje

Sobre tus preguntas, pues quizas me explique mal, me referia a que tu shellcode JMP/CALL (la primera) me funciono desde backtrack sin "saltarse" la proteccion NX, lo que me hace pensar que BT no la implementa, y que cuando probe de hacerlo con nasm+ld (sin codigo C) es cuando me daba el segmentation fault.

Haxta pronto.
Última edición por vlan7 el Lun Ago 16, 2010 5:11 pm, editado 1 vez en total
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: Segmentation fault en un código ensamblador

Notapor vlan7 » Lun Ago 16, 2010 12:06 pm

Bueno, he debuggeado (depurado :p ) el codigo de tu shellcode JMP/CALL (la primera). Hay que pasar a nasm el parametro -g para que genere simbolos de depuracion.

Código: Seleccionar todo
[email protected]:~# nasm -f elf -g sc.asm
[email protected]:~# ld sc.o
[email protected]:~# ./a.out
Segmentation fault
[email protected]:~# gdb -q ./a.out
(gdb) run
Starting program: /root/a.out

Program received signal SIGSEGV, Segmentation fault.
code () at sc.asm:11
11      mov byte [ebx+7], al    ;Ponemos un null-byte al final de la cadena /bin/sh.
(gdb)


Bien, esa es la instruccion donde salta el segmentation fault. Toca el preguntarse por que...

A ver, no es que este mal la shellcode, todo lo contrario, esta bien hecha. Olvidemonos por un momento de la proteccion NX, volvamos a los inicios. Pensemos. ¿que es lo que ocurre? Pues que esa instruccion _solo_ funciona si la shellcode esta guardada _entera_ en la pila. De lo contrario genera un SegFault. ¿Como conseguimos que la shellcode este guardada en la pila?

-En pruebas, construyendo un programa en C con todos los bytes en una cadena, puntero a la funcion y toda la pesca como todos sabemos.
-En exploits reales, inyectando la shellcode dentro de un programa vulnerable.

¡¡¡Solo tenemos permisos de escritura ahi!!!

Ahora es cuando entra en juego el flag (es un bit) NX... Con la shellcode entera en la pila tenemos permisos de escritura siempre que el flag NX no este activado, o sea un kernel que no implemente la proteccion NX. En pruebas lo desactivamos de la forma que hemos visto en los posts anteriores.

Para terminar, una shellcode muy parecida a la mitica JMP/CALL "que no hiciera escrituras" (que mal suena eso) y que por lo tanto funcionara solo con NASM + ld podria ser algo asi:

Código: Seleccionar todo
BITS 32
; int execve(const char *filename, char *const argv[], char *const envp[]);

xor eax, eax
cdq          ;envp es 0
mov al, 11   ;execve es la syscall 11
push edx     ;terminamos cadena y array argv
jmp short down   ;jmp short = no bytes nulos
back:
mov ebx, [esp]  ;direccion de la cadena
mov ecx, esp    ;direccion del puntero a la cadena
int 0x80
down:
call back    ;ponemos la cadena /bin/sh en la pila
db  "/bin/sh"


Probemos.

Código: Seleccionar todo
[email protected]:~# nasm -f elf sc.asm
[email protected]:~# ld sc.o
ld: warning: cannot find entry symbol _start; defaulting to 0000000008048060
[email protected]:~# ./a.out
sh-3.2# id
uid=0(root) gid=0(root) groups=0(root),4(adm),20(dialout),24(cdrom),46(plugdev),110(lpadmin),111(sambashare),112(admin)
sh-3.2#


Ahi esta la shell :)

~

Ahora toca el otro tema. Deshabilitar globalmente NX en Ubuntu.

Pero antes de empezar, definamos en una frase NX. NX es una proteccion contra la explotacion de vulnerabilidades, tipicamente buffer overflows, heap overflows y demas hierbas, cuya defensa se basa en impedir que se ejecute codigo en regiones no ejecutables de la memoria. A saber: la pila, el heap y la seccion data. mmm vaya, han sido dos frases...

Veamos si tenemos NX habilitado de forma global en Ubuntu o no. Podemos comprobarlo mirando en el archivo /proc/cpuinfo. Segun documentacion oficial en la primera linea de flags aparecera nx si la BIOS no esta deshabilitando NX (siempre que la CPU lo soporte). Casi todas las CPUs x64 soportan NX. Y las de 32 bits, si usan PAE seguramente soporten NX.

Código: Seleccionar todo
[email protected]:~$ grep ^flags /proc/cpuinfo |head -n1 |grep nx
flags      : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm 3dnowext 3dnow constant_tsc up rep_good nonstop_tsc extd_apicid pni monitor cx16 popcnt lahf_lm svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt
[email protected]:~$


Por ahi aparece el flag NX, lo que indica que en mi Ubuntu Lucid estoy usando NX.

Tambien comentar que a partir de Ubuntu 10.04 podemos ver si la BIOS esta deshabilitando NX o no mediante el siguiente comando:

Código: Seleccionar todo
[email protected]:~$ /usr/bin/check-bios-nx --verbose
This CPU has nx in the flags, so the BIOS is not disabling it.
[email protected]:~$


¿Entonces como deshabilitar NX globalmente en Ubuntu?

1. Desde la BIOS (la opcion depende del modelo claro).
ó
2. Recompilando el kernel.

Profundicemos en el punto 2. Segun documentacion oficial, Ubuntu viene compilado por defecto con la opcion -fstack-protector desde su version 6.10. Se deshabilita con -fno-stack-protector o -nostdlib en CPPFLAGS. Relacionado con todo esto se pueden ver inmensas discusiones a partir de este wiki.

Espero haber aclarado un poco todo este jaleo a partir de lo poco que yo se. Y si no, que siga el intercambio de ideas ;)

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: Segmentation fault en un código ensamblador

Notapor NewLog » Jue Ago 19, 2010 12:15 pm

Ei vlan!

No pienses que estoy pasando del tema! Que ya me he leido tus posts unas tres veces, pero no tengo tiempo para escribir ni para pasarme un tiempo probando cosas.

Esta tarde te intento contestar!
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: Segmentation fault en un código ensamblador

Notapor vlan7 » Jue Ago 26, 2010 7:46 pm

Sin prisa master, ¡a disfrutar de las vacaciones!

Mira/d lo que descubri:

EDB (Evan's Debugger) is a Qt4 based binary mode debugger with the goal of having usability on par with OllyDbg. It uses a plugin architecture, so adding new features can be done with ease. The current release is for Linux, but future releases will target more platforms.


http://freshmeat.net/projects/edebugger/
http://www.codef00.com/projects.php#debugger

Habra que echarle un ojo. Que al autor le guste el Olly es una buena señal ya. Ya los pantallazos tienen buena pinta.

Por cierto en la Blackhat LasVegas 2010 hay al menos dos autores que hablan sobre BoFs. Uno que trata muy bien el tema de las protecciones y otro, bueno... mas bien historico. A mi me gusta esto: http://blackhat.com/html/bh-us-10/bh-us-10-archives.html#Le Me parece bastante claro y bien explicado.

Y a traves de esos dos pdfs descubri el framework ropeme (ROP Exploit Made Easy). Por cierto, este video me gusto cuando lo vi. No he conseguido hacerlo funcionar en una lucid x64 con nx.

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

Siguiente

Volver a Programación

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron