Ir al contenido principal

Iniciación a la técnica de ROP

Radare2- Set de comandos básicos


Buenas a todos y Feliz navidad lo primero.

Entre mantecado y mantecado, y motivado por el curso de Ricardo Narvaja (CrackLatinos), me he decidido a publicar una entrada que es mas para mí que para el resto. Pero supongo que puede ser útil para otras personas, de ahí que lo ponga lo mas bonito posible en la web.

Vamos a ver un "cheatsheet" con comandos útiles de Radare2 y su funcionalidad, todo esto puede extraerse del --help de las herramientas, pero para los que como yo le gusta ir al grano y ahorrar el mayor tiempo posible, tienen esta entrada.

RABIN2:


  • rabin2 -I file_.exe --> Nos proporciona información básica del binario, como arquitectura, y las protecciones del binario como (nx,dep,aslr...)
  • rabin2 -i file_.exe --> Nos muestra los imports del binario.
  • rabin2 -e file_.exe --> Dirección del Entry point. (Dirección virtual y raw offset en el executable)
  • rabin2 -zz file_.exe --> Muestra las strings
  • rabin2 -g file_.exe --> Este comando nos muestra una gran cantidad de información como secciones,segmentos,entrypoint,constructores, main, import,simbolos, strings, estructura del header, Realocaciones, etc
  • rabin2 -S file_.exe --> Muestra las secciones del ejecutable, incluidos los permisos que tiene.
RAHASH2:
  • rahash2 -a all file_.exe --> Muestra la función resumen con todos los algoritmos disponibles en la herramienta
  • rahash2 -B -b 512 -a md5 file_.exe --> Por cada bloque de 512 bytes del ejecutable nos saca el md5.
  • rahash2 -B -b 512 -a entropy file_.exe --> calcula la entropía para cada bloque de 512 bytes.
  • rahash2 -a md5 -s string --> saca el md5 de una cadena
RAX2:
  • rax2 10  ó rax2 0xa --> Convertir de decimal a hexadecimal y viceversa
  • rax2 -s 41424344 --> Pasa de hexadecimal a ASCII
  • rax2 -S ADB --> pasamos de carácter ASCII a hexadecimal.
  • rax2 4+8 --> Permite el uso de operaciones aritméticas siempre que no haya espacios entre ellas.
  • rax2 -k 0x3+0x2 --> Hace la operacion aritmética y mantiene la misma base(hexadecimal).
RASM2:
  • rasm2 -d 4141 --> Desensambla en 32 bit  dando lugar a inc ecx
                                                                                                inc ecx
    • rasm2 -a x86 -b 32 "mov eax, 33" -> Ensambla en 32 bits la instrucción "mov eax,33"
    • rasm2 -a x86 -b 64 "mov rax,33" --> Ensambla en 64 bits la isntruccion "mov rax,33"
    • rasm2 -L --> Listado de plugin disponibles para el ensamblado/desensamblado.
    *(-a) es el nombre del plugin a usar x86 y (-b) indica si es de 32 o 64 bits.

    RADIFF2: Herramienta para hacer "diffing" entre binarios, y encontrar las modificaciones hechas entre versiones.
    • radiff2 exe_.exe exe_modified.exe ---> Nos da en la dirección física (raw offset del fichero) donde esta la diferencia entre ambos binarios.
    *Extra:
    Localización en la memoria virtual de un valor en el fichero ejecutable,  para ello podemos aplicar la siguiente fórmula:

    (target virtual address) = (target raw offset) - (raw offset of section) + (virtual address of section) + (image base) 

    Target virtual address--> Dirección virtual que queremos conocer.

    Target raw offset --> Direccion en nuestro fichero ejecutable.

    raw offset of section -->  Inicio de la seccion donde esta el dato modificado que queremos mirar.

    virtual addres of section + imagen base --> En este caso es sacar el valor de la imagen Base y la imagen virtual de la seccion.

    Para hacer esto con radare2 debemos de ejecutar los siguientes comandos:

    • r2 exe_.exe --> Abrimos el binario.
    • idp file_exe.pdb --> Cargamos los símbolos del binario si los tenemos.
    • aaa --> analizamos el programa 
    • afl --> listamos las funciones del binario, donde la información que nos muestra está organizada de la siguiente manera:
      • 1ra columna : dirección virtual 
      • 2da columna: Numero de  basic blocks (bloques) en la función
      • 3ra columna: tamaño de la función (en bytes)
      • 4ta columna: Nombre de la función.
    • /x ffd0 --> Buscamos esa cadena de bytes en el binario y nos indica la posicion donde tenemos esa sequencia de bytes, usado  con rasm2  podemos buscar instrucciones dentro del binario.
    • s 0x401342 --> nos vamos a la dirección de la memoria virtual que estamos indicando (0x401342 )

    • pdf-->  desensamblamos esa función completa y podemos ver si el valor de la dirección virtual y que instrucción en ensamblador representa.
    • Ps nombre_proyecto --> creamos un proyecto para no perder el avance de lo que vamos haciendo. Podemos guardar con distinto nombre, para así poder volver a distintos puntos del programa.
    • Po nombre_proyecto --> Para cargar un proyecto guardado de un binario que estamos analizando, es necesario, abrir el binario en otra terminal (r2 exe_.exe) y posteriormente cargar la sesión con el comando Po + el nombre del proyecto.
    • V!--> Accedemos al Modo PANELS:
      • Apretamos la letra "m" --> Nos vamos al menú y con las flechas/Enter nos podemos desplazar por el mismo hasta seleccionar la opción que queramos.
      • En View/Hexdump-->  Para ver en hexadecimal esa parte del código ensamblador que estamos viendo. (Con TAB nos podemos ir desplazando para ir poniendo el foco en la ventana que queramos, si pulsamos ENTER entramos en modo ZOOM y con Q volvemos otra vez al modo PANELS).
    • V--> Accedemos al modo visual y con p vamos cambiando la vista seleccionada, llegando por ejemplo al Hex-view.
      • Barra espaciadora-->Vemos en el modo árbol las funciones de nuestro programa. Dentro de esta vista si volvemos a pulsar la barra espaciadora salimos de la misma.
      • : --> Su queremos ejecutar algún comando nos aparece abajo una especie de shell para introducir el comando, q para quitarla.
    • afn nombre_nuevo nombre_antiguo --> Lo usamos para renombrar las funciones de nuestro binario
    • afvn nombre_nuevo nombre_antiguo --> Lo usamos para renombrar variables de la función que estamos analizando
    • afvf --> Mapa estático del stack nos muestra la siguiente información de cada variable
      • 1ra columna : Distancia respecto al horizonte en la función (EBP guardado) 
      • 2da columna: Nombre de la variable
      • 3ra columna: Tipo de la variable
    • afvt nombre_variable nuevo_tipo_variable --> Nos permite cambiar el tipo de la variable, para ello debemos indicarle el nombre de la variable a cambiar y el tipo que queremos asignarle.

    Comentarios

    Entradas populares de este blog

    Hack the Box Eat the cake!

    Buenas de nuevo, retomo esto en un "ratillo" que he sacado para ir dándole un poco de contenido al blog.

    Hoy nos ponemos con el resto Eat the cake! de HTB, ya que el otro día me calenté e hice un par de retos para ver lo oxidado que estaba... La verdad que bastante! 😑


    El fichero os lo podéis bajar directamente de la página, cuyo SHA256:bd2efc7a1b23885d88d401b2a1fa1d4b307f6efcd76ee0a7d9486f0a8b06e586

    Bueno vemos a ponernos manos a las obra, es un ejecutable por lo tanto nos iremos a nuestra máquina Windows que tenemos preparada para este tipo de retos, y abrimos el archivo con el software PEiD para ver si esta empaquetado/ofuscado, pero vamos que ya os digo que sí.



    Vemos que PEiD nos dice que esta empaquetada con UPX 0.89.6 -1.02 / 1.05 - 2.90 --> Markus & Laszlo.
    Intentamos desempaquetar la muestra, usando UPX directamente con "upx -d" y tras desempaquetarlo, comprobamos si se  ha hecho de manera correcta, procediendo a su ejecución y esperando a que sea co…

    Iniciación a la técnica de ROP

    Buenas a todos,

    En esta entrada vamos a resolver el binario propuesto por el maestro con la protección DEP: Que previene de ejecutar el código que introducimos en el stack si se encuentra activada esta protección del binario.
    Para ver si un binario tiene la protección DEP(Data execution prevention)activa, podemos mirarlo con la herramienta ProcessExplorer tal y como vamos a ver en el siguiente ejemplo activando la columna DEP del mismo para poder comprobar si el proceso tiene o no el DEP habilitado:
    Vemos que al ser un sistema operativo de x64, todos nuestros procesos tiene el DEP habilitado por defecto, y hemos de comprobar también si tiene alguna otra protección nuestro binario como el ASLR(Address Space Layout Randomization), encargado de aleatorizar las direcciones de la memoria virtual cuando nuestro binario es cargado en memoria virtual. Vamos a ver todos los módulos que componen el binario (Programa + librerias(dlls)) para ver si algún módulo no tiene ASLR.
    En este caso, el módul…

    WinDBG- Diseño de ShellCodes

    Buenas a  todos,

    En este pequeño tutorial, voy a intentar explicar y mostrar con ejemplos como crear shellcode tanto en binarios de x86, y posteriormente crearé una entrada para ejemplos en binarios en x64.

    Este tutorial esta basado en la parte 6 de los tutoriales  de Ricardo Narvaja de uso de herramientas de exploiting gratuitas y el tutorial de desarrollo de malware de ZeroPad, así que si os gusta las gracias a ellos.

    Partimos de una shellcode que vamos a detallar, para explicar como funciona, y los componentes de la misma. Para ello hemos creado un binario donde se ejecuta únicamente esta shellcode para que nos sea mas fácil a la hora de analizarla.

    winexec_calc_shellcode =b'\x33\xd2\x52\x68\x63\x61\x6c\x63\x89\xe6\x52\x56\x64\x8b\x72\x30\x8b\x76\x0c\x8b\x76\x0c\xad\x8b\x30\x8b\x7e\x18\x8b\x5f\x3c\x8b\x5c\x1f\x78\x8b\x74\x1f\x20\x01\xfe\x8b\x4c\x1f\x24\x01\xf9\x0f\xb7\x2c\x51\x42\xad\x81\x3c\x07\x57\x69\x6e\x45\x75\xf1\x8b\x74\x1f\x1c\x01\xfe\x03\x3c\xae\xff\xd7'


    La shellcod…