This page looks best with JavaScript enabled

Exploiting 101: Que son los Badchars? Generando Badchars desde Python y Mona

 ·   ·   3 min read

Hoy estaremos con los badchars, teniendo una breve introducción de que son y como generarlos, desde Python y con Inmmunity Debugger utlizando el script !mona, si deseas instalar la herramienta y lo que necesitaremos posteriormente puedes ver la entrada anterior Montando un entorno para iniciar en el Exploiting

¿Que son los Badchars?

Los badchars son caracteres inválidos o “malos” los cuales el programa a explotar no los acepta, por lo consiguiente el atacante cuando genere su shellcode la misma no sirve, ya que estos caracteres no fueron identificados y hace que el programa se rompa. Tranquilo al final de la entrada tenemos un breve ejemplo.

Puedes tener el listado de los badchars a mano en un fichero de texto y listo nos olvidamos de los mismos, tambien podemos generarlos y tener a nuestro disposición con un par de comandos desde el mismo Inmunity Debugger con !mona o desde Python ambos lo veremos a continuación.

Listado de Badchars

Un punto a considerar es que el 0 - Null no es utilizado ya que este llegar a ser un badchar de cajon "\x00" en todas las pruebas que estuve realizando en ninguna fue un valor admitido.

badchars = ("\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\x09\\x0a\\x0b\\x0c\\x0d\\x0e\\x0f\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f"  
"\\x20\\x21\\x22\\x23\\x24\\x25\\x26\\x27\\x28\\x29\\x2a\\x2b\\x2c\\x2d\\x2e\\x2f\\x30\\x31\\x32\\x33\\x34\\x35\\x36\\x37\\x38\\x39\\x3a\\x3b\\x3c\\x3d\\x3e\\x3f\\x40"  
"\\x41\\x42\\x43\\x44\\x45\\x46\\x47\\x48\\x49\\x4a\\x4b\\x4c\\x4d\\x4e\\x4f\\x50\\x51\\x52\\x53\\x54\\x55\\x56\\x57\\x58\\x59\\x5a\\x5b\\x5c\\x5d\\x5e\\x5f"  
"\\x60\\x61\\x62\\x63\\x64\\x65\\x66\\x67\\x68\\x69\\x6a\\x6b\\x6c\\x6d\\x6e\\x6f\\x70\\x71\\x72\\x73\\x74\\x75\\x76\\x77\\x78\\x79\\x7a\\x7b\\x7c\\x7d\\x7e\\x7f"  
"\\x80\\x81\\x82\\x83\\x84\\x85\\x86\\x87\\x88\\x89\\x8a\\x8b\\x8c\\x8d\\x8e\\x8f\\x90\\x91\\x92\\x93\\x94\\x95\\x96\\x97\\x98\\x99\\x9a\\x9b\\x9c\\x9d\\x9e\\x9f"  
"\\xa0\\xa1\\xa2\\xa3\\xa4\\xa5\\xa6\\xa7\\xa8\\xa9\\xaa\\xab\\xac\\xad\\xae\\xaf\\xb0\\xb1\\xb2\\xb3\\xb4\\xb5\\xb6\\xb7\\xb8\\xb9\\xba\\xbb\\xbc\\xbd\\xbe\\xbf"  
"\\xc0\\xc1\\xc2\\xc3\\xc4\\xc5\\xc6\\xc7\\xc8\\xc9\\xca\\xcb\\xcc\\xcd\\xce\\xcf\\xd0\\xd1\\xd2\\xd3\\xd4\\xd5\\xd6\\xd7\\xd8\\xd9\\xda\\xdb\\xdc\\xdd\\xde\\xdf"  
"\\xe0\\xe1\\xe2\\xe3\\xe4\\xe5\\xe6\\xe7\\xe8\\xe9\\xea\\xeb\\xec\\xed\\xee\\xef\\xf0\\xf1\\xf2\\xf3\\xf4\\xf5\\xf6\\xf7\\xf8\\xf9\\xfa\\xfb\\xfc\\xfd\\xfe\\xff")  

Generando Badchars desde Inmunity con Mona

Tenemos como primera opción utilizar Mona desde Inmunity para que nos genere todos los badchars que necesitamos para el proceso en el cual posteriormente podemos realizar la detección de los mismos este proceso se explicara en la siguiente entrada totalmente aparte para luego realizar el proceso completo en una sola entrada.

Para tener los badchars nos dirigimos a la parte inferior de Inmunity y ejecutamos:

!mona bytearray

Badchars desde Mona (Inmmunity Debugger)

El resultado del comando tras ser ejecutado es el siguiente, si no configuramos previamente donde queremos que se almacene el log lo tendremos en el mismo directorio donde se encuentra Inmunity Instalado.

\================================================================================  
  Output generated by mona.py v2.0, rev 583 - Immunity Debugger  
  Corelan Team - https://www.corelan.be  
\================================================================================  
  OS : 7, release 6.1.7601  
  Process being debugged : SLmail (pid 340)  
  Current mona arguments: bytearray  
\================================================================================  
  2019-03-04 09:04:37  
\================================================================================  
"\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\x09\\x0a\\x0b\\x0c\\x0d\\x0e\\x0f\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f"  
"\\x20\\x21\\x22\\x23\\x24\\x25\\x26\\x27\\x28\\x29\\x2a\\x2b\\x2c\\x2d\\x2e\\x2f\\x30\\x31\\x32\\x33\\x34\\x35\\x36\\x37\\x38\\x39\\x3a\\x3b\\x3c\\x3d\\x3e\\x3f"  
"\\x40\\x41\\x42\\x43\\x44\\x45\\x46\\x47\\x48\\x49\\x4a\\x4b\\x4c\\x4d\\x4e\\x4f\\x50\\x51\\x52\\x53\\x54\\x55\\x56\\x57\\x58\\x59\\x5a\\x5b\\x5c\\x5d\\x5e\\x5f"  
"\\x60\\x61\\x62\\x63\\x64\\x65\\x66\\x67\\x68\\x69\\x6a\\x6b\\x6c\\x6d\\x6e\\x6f\\x70\\x71\\x72\\x73\\x74\\x75\\x76\\x77\\x78\\x79\\x7a\\x7b\\x7c\\x7d\\x7e\\x7f"  
"\\x80\\x81\\x82\\x83\\x84\\x85\\x86\\x87\\x88\\x89\\x8a\\x8b\\x8c\\x8d\\x8e\\x8f\\x90\\x91\\x92\\x93\\x94\\x95\\x96\\x97\\x98\\x99\\x9a\\x9b\\x9c\\x9d\\x9e\\x9f"  
"\\xa0\\xa1\\xa2\\xa3\\xa4\\xa5\\xa6\\xa7\\xa8\\xa9\\xaa\\xab\\xac\\xad\\xae\\xaf\\xb0\\xb1\\xb2\\xb3\\xb4\\xb5\\xb6\\xb7\\xb8\\xb9\\xba\\xbb\\xbc\\xbd\\xbe\\xbf"  
"\\xc0\\xc1\\xc2\\xc3\\xc4\\xc5\\xc6\\xc7\\xc8\\xc9\\xca\\xcb\\xcc\\xcd\\xce\\xcf\\xd0\\xd1\\xd2\\xd3\\xd4\\xd5\\xd6\\xd7\\xd8\\xd9\\xda\\xdb\\xdc\\xdd\\xde\\xdf"  
"\\xe0\\xe1\\xe2\\xe3\\xe4\\xe5\\xe6\\xe7\\xe8\\xe9\\xea\\xeb\\xec\\xed\\xee\\xef\\xf0\\xf1\\xf2\\xf3\\xf4\\xf5\\xf6\\xf7\\xf8\\xf9\\xfa\\xfb\\xfc\\xfd\\xfe\\xff"  

Generando Badchars desde Python

Desde python tambien llegamos a generar los badchars permitiendonos tenerlo a mano y desde la terminal de manera rápida.

import sys  
for x in range(0,256):  
        sys.stdout.write ("\\\\x" + '{:02x}'.format(x))

El resultado al ejecutar desde python es el siguiente:

Obteniendo Badchars desde Python

Breve Ejemplo.

Mandamos un array con todos los badchars y en inmmunity en el Stack tenemos la siguiente secuencia.

 Como un breve ejemplo enviamos lo siguiente:

\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\x09\\x0a\\x0b\\x0c\\x0d\\

Identificamos que se tiene 01 02 03 04 05 06 07 08 09 29

El que deberia de seguir en dicha secuencia es 0a pero como no lo tenemos presente este llega  a ser nuestro primer badchar (valor no aceptado) retiramos  del array y se vuelve a enviar.

Este proceso llega a ser un poco moroso para la creación de exploits si fallas en identificar es muy probable que no llegues a obtener el resultado esperado, al decir moroso me refiero cuando uno esta empezado a dar sus primeros pinos hay maneras rápidas de identificar por ejemplo con ayuda de !mona o scripts externos, pero las entradas el objetivo inicial es aprender a mano y luego explicar la automatización.

En proximas entradas iremos ya con la parte práctica, alguna duda en los comentarios.

Es difícil mostrarte confiable cuando la gente tiene que esperarte. - Wes Fessler

Regards,
Snifer

Share on
Support the author with

Avatar
WRITTEN BY