ॐ॒॑॓॔='ەۖۗۘۙۚۛۜ۞ۣ۟۠ۡۢۤ♞98ecf2b˿̴̵̶̷̸̡̢̧̨̛̖̗̘̙̜̝̞̟̠̣̤̥̦̩̪̫̬̭̮̯̰̱̲̳̹̺̻̼͇͈͉͍͎̀́̂̃̄̅̆̇̈̉̊̋̌̍̎̏̐̑̒̓̔̽̾̿̀́͂̓̈́͆͊͋͌̕̚ͅ͏͓͔͕͖͙͚͐͑͒͗͛ͣͤͥͦͧͨͩͪͫͬͭͮ͘͜͟͢͝͞͠͡';alert( ॐ॒॑॓॔)
Mostrando las entradas con la etiqueta reversing. Mostrar todas las entradas
Mostrando las entradas con la etiqueta reversing. Mostrar todas las entradas
sábado, 7 de enero de 2017
Reversing 0x5+0x2-Paso de argumentos a función en x86_64.
Etiquetas:
assembly,
Debugging,
disassembly,
ensamblador,
low level programming,
radare,
reversing,
x86_64
viernes, 6 de enero de 2017
Reversing 0x05+0x01 - Paso de argumentos a función en x86.
En este vídeo se muestra cómo funciona la convención de llamada cdecl que los binarios para arquitectura x86 implementan para pasar argumentos a una función.
Etiquetas:
assembly,
cdecl,
ensamblador,
low level programming,
radare,
radare2,
reversing,
x86
miércoles, 4 de enero de 2017
Reversing 0x04 - Corrección de cadenas (String patching).
Etiquetas:
assembly,
ensamblador,
linux,
low level programming,
radare,
radare2,
reversing
martes, 3 de enero de 2017
Reversing 0x03 - Variables locales
Etiquetas:
assembly,
disassembly,
ensamblador,
low level programming,
radare,
radare2,
reversing
lunes, 12 de septiembre de 2016
Técnicas antidepuración - PEB.NtGlobalFlag
Para continuar la serie sobre técnicas antidepuración, en esta entrada hablare acerca de la técnica que usa otro campo de la estructura PEB, más específicamente el campo NtGlobalFlag (offset 0x68).
Este campo, al igual que PEB.BeingDebugged (offset 0x02), cambia su valor cuando el programa es cargado desde un depurador, es decir, cuando el programa no esta siendo depurado, normalmente su valor es 0x0, mientras que cuando es cargado desde un depurador, su valor cambia a 0x70, valor que se explica por el establecimiento de las siguientes banderas con sus respectivos valores:
FLG_HEAP_ENABLE_TAIL_CHECK -> 0x10
FLG_HEAP_ENABLE_FREE_CHECK -> 0x20
FLG_HEAP_VALIDATE_PARAMETERS-> 0x40
Si observas, la suma de los valores con los que se establecen estas banderas es 0x70, que es el valor que adquiere PEB.NtGlobalFlag cuando el programa esta siendo depurado. Entonces, para saber si un programa esta dentro de un depurador usando PEB.NtGlobalFlag, antes se debe hacer una comprobación de su valor con 0x70, si es igual, entonces esta siendo depurado, en caso contrario, no lo esta, en esencia es el mismo funcionamiento que emplea la técnica IsDebuggerPresent(), la única diferencia es que ahora windows no nos proporciona una función para acceder directamente a PEB.NtGlobalFlag, por lo que debemos hacer uso de un código parecido al siguiente:
O también alguno de estos, que desde mi punto de vista, son la mejor opción si eres una persona que se interesa en el mundo del reversing y lenguaje ensamblador:
Pero bueno, sea cual sea la forma en que implementes esta técnica, debo advertirte, evitarla es igualmente fácil que evitar la técnica IsDebuggerPresent(), si observas, basta con manualmente cambiar el valor de la flag NtGlobalFlag y setearlo a 0x0, así, si el programa se carga desde un depurador, funcionara de igual manera que como si estuviera fuera de este.
pero manten la calma, apenas estamos en la segunda técnica antidepuración, esto ira aumentando de complejidad e iremos conociendo nuevas técnicas en futuras entradas.
Por ahora, estudiar, comprender e intentar hacer bypass de estos códigos puede ser un buen ejercicio para reforzar lo leido... Sin más que decir, manos a la obra y happy hacking! :).
pero manten la calma, apenas estamos en la segunda técnica antidepuración, esto ira aumentando de complejidad e iremos conociendo nuevas técnicas en futuras entradas.
Por ahora, estudiar, comprender e intentar hacer bypass de estos códigos puede ser un buen ejercicio para reforzar lo leido... Sin más que decir, manos a la obra y happy hacking! :).
martes, 6 de septiembre de 2016
Técnicas antidepuración - IsDebuggerPresent()
La técnica más simple para comprobar si un programa se encuentra dentro de un depurador, es decir, esta siendo depurado, es aquella que realiza una comprobación al estado de la bandera BeingDebugged, dicha bandera se encuentra en el PEB (Process Environment Block) y tiene el offset 0x02.
Se puede notar que la función nos va a retornar un valor Booleano, es decir, si es 1 (TRUE) significa que el programa fue cargado desde un depurador, si es 0 (FALSE) significa que el programa esta corriendo fuera de un depurador.
Otros códigos equivalentes a lo anterior pueden ser los siguientes:
La simpleza de esta medida antidepuración la convierte hoy en día en una de las medidas menos efectivas para tratar de evitar a un depurador ya que basta con modificar manualmente la flag PEB.BeingDebugged con el valor 0x00 para evitarla.
Pero bueno ya en otras entradas abordare técnicas más sofisticadas para detectar depuradores, por ahora trata de entender bien el funcionamiento de los códigos proporcionados anteriormente y happy hacking!.
Pero bueno ya en otras entradas abordare técnicas más sofisticadas para detectar depuradores, por ahora trata de entender bien el funcionamiento de los códigos proporcionados anteriormente y happy hacking!.
domingo, 3 de julio de 2016
Aprendiendo el aeiou de radare2
En esta entrada les voy a compartir el aeiou de radare2, es decir, hablare acerca de algunos comandos que ahorraran la curva de aprendizaje a aquellas personas que se están animando a entrar al mundo del reversing y cuya opción para desensamblar, depurar, analizar y manipular archivos binarios fue nada más y nada menos que radare2, herramienta de código abierto que tiene la capacidad de ejecutarse desde una terminal y ofrecer unos resultados más que satisfactorios, pero bueno, basta de tanto blah, blah, blah y pasemos a lo que corresponde.
Antes que nada debemos tener instalado radare2, cuya ultima versión esta disponible en su repositorio GitHub. Y bueno, como soy una persona que cree que la mejor forma de aprender es de manera practica, usare este ejecutable (ccf58978584aacfed3ea9917e153e36b) para ejemplificar todos los comandos que mencionare enseguida.
Comando de ayuda y evaluación matemática ( ? )
Este comando es uno de los más simples y mi favorito, ya que radare2 tiene un comando asignado para cada letra del alfabeto, es decir, de la a-z, memorizar y recordar cada uno, es algo muy difícil, pero tranquil@s porque basta con incluir al final de un comando el símbolo ?, para obtener una descripción de lo que hace dicho comando específicamente, pero bueno, dijimos que pondremos en practica lo que se menciona en esta entrada, así que carguemos el ejecutable en radare2 usando el comando r2.

Como podemos ver el comando por si solo nos arroja una descripción de todos los comandos básicos de r2, pero si probamos ahora con a? se mostrara solo la ayuda para el comando a específicamente:

Además de ser un comando para obtener ayuda, también sirve como comando de evaluación matemática, y lo vemos claramente en la siguiente imagen:
Nótese el espacio que hay después del signo ?, si se omite, el comando se interpretara como comando de ayuda.
Comandos para obtener información del fichero
Radare2 cuenta con algunos comandos que permiten conocer información de un archivo binario, entre estos comandos se encuentran:
iI -> Comando que nos lista gran cantidad de información acerca del archivo binario, entre esa información se encuentran, el tipo de binario, arquitectura, lenguaje, estado de las contra-medidas vs exploiting, etc.

Si solo necesitamos conocer un valor especifico, podemos usar el operador ~ seguido de iI para buscar coincidencias como lo hace el comando grep en linux, es decir, si solo queremos saber el tipo de binario que es nuestro fichero usamos iI~bintype, o si queremos saber si tiene activado el bit nx usamos iI~nx:
ii -> Este comando nos muestra información de todos los objetos que son importados por el archivo binario:
Nuestro ejecutable realiza 3 importaciones y printf es una de ellas.
il -> Nos lista las librerías que utiliza nuestro archivo binario:
ie -> Este comando nos muestra el punto de entrada del archivo binario, es decir, la dirección de la primera instrucción que se ejecuta:
iM -> Parecido al comando anterior pero esta vez lo que se obtiene es la dirección de main:
is -> Lista todos los símbolos del binario:
iz -> Con este comando obtenemos una lista de las strings que contiene el archivo binario:
Comandos de búsqueda
Radare2 también cuenta con una serie de comandos de búsqueda, entre los más útiles se encuentran:
/ string -> Este comando nos lista todas las direcciones en las que se encuentra una coincidencia con la string que se pasa como parámetro:
/a instrucción -> Es un comando que permite conocer todas las direcciones en las que se encuentra una coincidencia con la instrucción en ensamblador que se pasa como parámetro, es decir, si queremos listar todas las instrucciones jmp eax que contiene el fichero binario tendríamos que usar /a jmp eax:

/A tipo_de_instrucción-> tiene un comportamiento muy similar al comando anterior, solo que esta vez se obtiene la lista de direcciones que coinciden con el tipo de instrucción que se paso como parámetro, en otras palabras, si nosotros queremos obtener los saltos (jmp) que se encuentran en el desensamblado del fichero binario, tenemos que usar /A jmp, aunque no lo parezca, este es un comando muy diferente al anterior, ya que /a jmp eax solo lista las direcciones donde se encuentra un jmp eax exactamente, mientras que /A jmp lista cualquier tipo de salto que se encuentre en el archivo binario, es decir, jmp eax, jmp ebx, jmp ecx, jmp edx, etc.
/R [filter] -> Este comando es muy útil para un exploiter (Creador de exploits), ya que muestra un listado de gadgets ROP, es decir, conjunto de instrucciones que finalizan con la instrucción RET, JMP, o CALL y que al ser enlazadas pueden facilitar la creación de un exploit funcional:
iS | grep perm=..w -> Con esta instrucción se obtiene un listado de todas las secciones del archivo binario en las que se permite la escritura:
iS | grep perm=...x -> Similar a la instrucción anterior, pero esta vez se listan las secciones del binario que son ejecutables:

Comandos para análisis,desensamblado,búsqueda de referencias, manejo de funciones, argumentos y variables locales
aaa -> Este comando analiza todo y auto-nombra las funciones, es el primer comando que debemos ejecutar antes que todos los que se mencionan enseguida.
afl -> Nos lista todas las funciones que fueron analizadas por el comando aaa:
s [nombre_función|dirección_función] -> Para poder abordar o posicionarnos en alguna de las funciones que lista afl podemos usar este comando, es decir, si queremos abordar la función sym.main tenemos dos posibilidades y son las siguientes:
algo parecido debe usarse si la función que queremos abordar es sym.aeiou:
podemos ver que lo único que cambio fue el nombre y la dirección de la función.
pdf -> Este comando desensambla la función que abordamos usando el comando s, es decir si ejecutamos s sym.main y después ejecutamos el comando pdf lo que obtendremos sera el código desensamblado de dicha función:
pdf@[nombre_función|dirección_función] -> Si queremos ahorrarnos el uso del comando s, o no tenemos la intención de abordar una función diferente a la que actualmente estamos abordando podemos usar este comando, he aquí un ejemplo:
Ahora bien, si lo que se desea es solamente obtener una N cantidad de lineas del código desensamblado, podemos optar por usar pd [N]@[función_name]:
axt [nombre_función] -> Este comando nos muestra las referencias que existen hacia una función, es decir, instrucciones en código ensamblador desde las cuales es llamada una función, por ejemplo, si queremos saber las direcciones desde las que se efectúa una llamada a printf podemos usar axt sym.imp.printf:
En la imagen podemos observar que en nuestro fichero binario se efectúan 3 llamadas a la función printf (en las direcciones 0x400582, 0x400560 y 0x400544) para comprobar que esto es correcto, podemos hacer uso del comando pd que ya mencionamos anteriormente:

Y en efecto, en esas 3 direcciones se efectúa una llamada a la función printf.
afa -> Si queremos conocer los argumentos de una función tenemos que usar este comando, por ejemplo, si queremos conocer los argumentos de la función sym.aeiou debemos hacer lo que se muestra a continuación:
afv -> Este comando ofrece también un listado, solo que esta vez lo que se lista son las variables locales de la función:
afn new_name_function-> Con esta instrucción podemos cambiar el nombre de una función:
afan old_name new_name-> Si lo que se desea es renombrar algún argumento de la función podemos usar este comando:
afvn old_name new_name-> Sirve para renombrar las variables locales de una función:
gráficos y comentarios
Como no podía faltar, radare2 también nos ofrece un ambiente más ameno y cómodo llamado visual mode, que si bien no es nada cercano a una GUI, si que puede ser algo mucho más sencillo de usar que la CLI una vez te acostumbras.
para acceder a este modo solo basta con tipear el comando V, de igual manera que en la CLI el comando ? nos muestra la ayuda para este modo:
Y bueno ahí esta, no entrare en detalle con cada uno de los comandos pero si mencionare uno de los comandos que más util nos puede ser y ese es:
VV@[function_name] -> Este comando nos muestra un gráfico (ascii art) de una función, por ejemplo, si queremos ver el grafico de la función sym.aeiou usamos VV@sym.aeiou y obtendremos algo como esto:
Al momento de estar visualizando el gráfico disponemos de algunos atajos de teclado que podemos obtener al oprimir ?, algunos de estos atajos son:
asdw-mueve el grafo completohjkl- mueve un nodo (también podemos usar las teclas de dirección)tab/TAB- selecciona next/previous nodet/f-Sigue camino verdadero/falso.-centra el gráficoq-salir
Y bueno ya para terminar este extenso recorrido aprendamos algo sobre los comentarios en radare2:
CC -> Nos lista todos los comentarios que contiene nuestro fichero objeto.
¿y si lo queremos es agregar un comentario? simple, solo basta con usar el comando s para posicionarnos en la dirección donde queremos agregar el comentario y después usar CC [Comentario] y listo:
Como vemos en la imagen lo que se hizo primero fue abordar la dirección 0x004004ef para después agregar el comentario "llamada a función aeiou" en dicha dirección usando CC, otra manera de obtener el mismo resultado es usar el comando CCu [Comentario]@[addr]:
Y bueno, eso es todo... claro que no son todos los comandos ni mucho menos todas las posibilidades que ofrece este excelente framework llamado Radare2, pero espero que sirva de algo a aquellos que recién se inician a experimentar con el, sin más que decir, happy hacking :).
Etiquetas:
assembly,
disassembly,
Exploiting,
radare,
radare2,
reversing
viernes, 17 de junio de 2016
lunes, 13 de junio de 2016
Reversing 0x01 - Hola Mundo!
Etiquetas:
assembly,
C,
disassembly,
ensamblador,
low level programming,
reversing
domingo, 12 de junio de 2016
sábado, 21 de mayo de 2016
Desensamblando una shellcode usando rasm2 | Vídeo
Etiquetas:
assembly,
disassembly,
Exploiting,
radare,
radare2,
rasm2,
reversing,
shellcode
Suscribirse a:
Entradas (Atom)































