Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Introducción 1.1
Historia 1.1.1
1.1.6
1.2
formato 1.2.3
1.3
Colores 1.3.1
1.3.3
zoom 1.4.6
1.4.7
1.4.8
2
Yank / Pegar 1.4.9
1.5
ensamblador 1.5.2
1.6
desmontan 1.6.6
1.6.7
1.7
1.8
1.8.3
1.8.7
1.8.10
3
scripting 1.9
Macros 1.9.1
bucles 1.9.2
R2pipe 1.9.3
depurador 1.10
Empezando 1.10.1
1.10.4
1.10.5
1.10.6
comandos 1.12
Rax2 1.12.1
Rafind2 1.12.2
Rarun2 1.12.3
Rabin2 1.12.4
1.12.4.4
1.12.4.7
Radiff2 1.12.5
4
Rasm2 1.12.6
Montar 1.12.6.1
Desmontar 1.12.6.2
configuración 1.12.6.3
Ragg2 1.12.7
idioma 1.12.7.1
Rahash2 1.12.8
plugins 1.13
depuración de 1.13.6
1.13.8
1.13.9
1.14
IOLI 1.14.1
Avatao 1.14.2
R3v3rs3 4 1.14.2.1
.Introducción 1.14.2.1.1
. radare2 1.14.2.1.2
. principal 1.14.2.1.4
. vmloop 1.14.2.1.5
5
. código de bytes 1.14.2.1.7
. outro 1.14.2.1.8
de referencia 1.16
6
Introducción
Introducción
Este libro es una versión actualizada (iniciado por Maijin) del libro radare1 originales (escrito por panqueque). Que se mantiene activa y
Consulte el sitio Github para añadir nuevos contenidos o corregir faltas de ortografía:
Github: https://github.com/radare/radare2book
Gitbook: https://www.gitbook.com/book/radare/radare2book/details
En línea: http://radare.gitbooks.io/radare2book/content/
PDF: https://www.gitbook.com/download/pdf/book/radare/radare2book
Epub: https://www.gitbook.com/download/epub/book/radare/radare2book
mobi: https://www.gitbook.com/download/mobi/book/radare/radare2book
7
Historia
Historia
En 2006, Sergi Álvarez (también conocido como panqueques) trabajaba como analista forense. Dado que no se le permitió utilizar el software privado para sus
necesidades personales, decidió escribir un redactor con la herramienta-un pequeño hexadecimal características muy básicas:
sea extremadamente portátil (UNIX amable, línea de comandos, c, pequeños dispositivos de disco)
abiertos, esto es mediante la búsqueda desplazamientos de 64 bits para una cadena o hexpair
El editor fue diseñado originalmente para recuperar un archivo borrado de una partición HFS +.
Después de eso, panqueque decidió extender la herramienta para tener un io enchufable para poder asociar a los procesos e implementar las
Desde entonces, el proyecto ha evolucionado para proporcionar un marco completo para el análisis de los binarios, mientras que haciendo uso de los
conceptos básicos de UNIX. Estos conceptos incluyen el famoso "todo es un archivo", "pequeños programas que interactúan utilizando stdin / stdout" y
La necesidad de scripting mostró la fragilidad del diseño inicial: una herramienta monolítica hecha la API difícil de usar, por lo que se necesitaba una
refactorización de profundidad. En 2009 radare2 (r2) nació como un tenedor de radare1. El refactor añade flexibilidad y características dinámicas.
Esto permitió mucho mejor integración, allanando el camino para usar r2 de diferentes lenguajes de programación . Más tarde, el r2pipe API permitido
Lo que comenzó como un proyecto de un solo hombre, con algunas contribuciones eventuales, se convirtió progresivamente en un gran proyecto basado en la
comunidad en torno a 2014. El número de usuarios estaba creciendo rápidamente, y el autor y principal desarrollador tenido a cambiar los papeles del
codificador al administrador con el fin de integrar el trabajo de los diferentes desarrolladores que se incorpora al proyecto.
Indicar a los usuarios reportar sus problemas permite que el proyecto para definir nuevas direcciones para evolucionar. Todo se
El proyecto se mantiene activo en el momento de escribir este libro, y hay varios proyectos secundarios que proporcionan, entre otras
cosas, una interfaz gráfica de usuario ( Cortador ), Un descompilador ( r2dec , RADECO ), La integración Frida ( r2frida ), Yara, unicornio,
Keystone, y muchos otros proyectos en el indexado r2pm (El gestor de paquetes radare2).
8
Historia
Desde 2016, la comunidad se reúne una vez al año r2con , Un congreso en torno radare2 que tiene lugar en Barcelona.
9
El marco
El marco
El proyecto Radare2 es un conjunto de pequeñas utilidades de línea de comandos que se pueden utilizar juntos o independientemente.
Este capítulo le dará una rápida comprensión de ellos, pero se puede comprobar las secciones dedicadas para cada herramienta al final de
este libro.
radare2
La herramienta principal de todo el marco. Utiliza el núcleo del editor hexadecimal y depurador. radare2 le permite abrir un número de fuentes de
entrada / salida, como si fueran simples, archivos planos, incluyendo discos, conexiones de red, controladores del núcleo, procesos bajo la
Implementa una interfaz de línea de comandos avanzados para moverse alrededor de un archivo, análisis de datos, desmontaje,
parchear binarios, comparación de datos, buscar, reemplazar, y visualizando. Puede ser escrito con una variedad de idiomas,
rabin2
Un programa para extraer información de binarios ejecutables, tales como ELF, PE, Java CLASS, Mach-O, más cualquier formato soportado por plugins r2.
rabin2 es utilizado por el núcleo para obtener datos como símbolos exportados, importaciones, información de los archivos, referencias cruzadas (refx),
rasm2
Un ensamblador de línea de comandos y desensamblador para múltiples arquitecturas (incluyendo Intel x86 y x86-64, MIPS, ARM, PowerPC, Java
Ejemplos
10
El marco
rahash2
Una implementación de una herramienta de hash basado en bloques. Desde pequeñas cadenas de texto a discos grandes, rahash2 soporta múltiples algoritmos,
incluyendo MD4, MD5, CRC16, CRC32, SHA1, SHA256, y otros. rahash2 se puede utilizar para comprobar la integridad o el seguimiento de los cambios de archivos
Ejemplos
$ archivo rahash2
radiff2
Una utilidad diffing binario que implementa múltiples algoritmos. Es compatible a nivel de byte o delta diffing para archivos binarios y código-análisis diffing
para encontrar los cambios en los bloques de código básicas obtenidas a partir del análisis de código radare.
rafind2
ragg2
Un frontend para r_egg. ragg2 compila los programas escritos en un simple lenguaje de alto nivel en pequeños binarios para x86,
x86-64, y ARM.
11
El marco
Ejemplos
$ Hi.r gato
$ Hi.c gato
$ Ragg2 hi.c $
./hi.c.bin Hola
rarun2
Un lanzador para ejecutar programas dentro de los diferentes entornos, con diferentes argumentos, permisos, directorios y descriptores de
Resolver crackmes de
pruebas Fuzzing
$ Foo.rr2 gato
=. / PP400 = 10 arg0
tmp
# = Chroot.
. /foo.rr2
12
El marco
$ Nc -l 9999
1 - abrir una nueva terminal y el tipo 'TTY' para obtener un nombre de terminal:
r2 -r foo.rr2 -d / bin / ls
rax2
A minimalista evaluador expresión matemática para la cáscara que es útil para hacer las conversiones de base entre los valores de coma
flotante, representaciones hexadecimales, cuerdas hexpair a ASCII, octal a un entero, y más. También es compatible con la configuración
Ejemplos
13
El marco
$ 01.111.001 y rax2 -b
$ Rax2 -S radare2
72616461726532
14
radare2 la descarga
radare2 la descarga
https://github.com/radare/radare2
Los paquetes binarios están disponibles para un número de sistemas operativos (Ubuntu, Maemo, Gentoo, de Windows, iPhone, etc.). Sin
embargo, está muy aconsejable para obtener el código fuente y compilarlo usted mismo para entender mejor las dependencias, para hacer
Una nueva versión estable se publica normalmente cada mes. bolas de alquitrán todas las noches a veces están disponibles en
http://bin.rada.re/ .
El repositorio de desarrollo radare es a menudo más estables que los comunicados de 'estables'. Para obtener la última versión:
Esto probablemente tomará un tiempo, por lo que tomar un café y seguir leyendo este libro.
Para actualizar su copia local del repositorio, el uso git pull en cualquier parte del árbol de código fuente radare2:
$ Git pull
O enviar un parche:
La forma más común de adquirir R2 actualiza y el sistema instalado ancha es mediante el uso de:
$ Sys / install.sh
CC = sonido metálico LDFLAGS = -fuse-ld = mesón de oro. liberación --buildtype = liberación --prefix ~ / .local / sto w / / release radare2 liberación Ninja -C
scripts de ayuda
Echar un vistazo a la sys / * guiones, los se utilizan para automatizar cosas relacionadas con la sincronización, la construcción y la instalación de R2 y sus fijaciones.
La más importante es sys / install.sh. Que se tire, limpio, construir y sistema de r2 symstall amplia.
Symstalling es el proceso de la instalación de todos los programas, bibliotecas, documentación y archivos de datos utilizando los enlaces simbólicos en lugar de
Por defecto se instalará en / usr, pero se puede definir un nuevo prefijo como argumento.
Esto es útil para los desarrolladores, ya que les permite ejecutar sólo 'hacer' y probar los cambios sin tener que ejecutar make install de nuevo.
Limpiar
La limpieza de la estructura de directorios es importante para evitar problemas como el que une a los viejos archivos de objetos o no actualización de los objetos después
de un cambio de ABI.
Si desea quitar las instalaciones anteriores de su sistema, debe ejecutar los siguientes comandos:
dieciséis
radare2 la descarga
17
Compilación y Portabilidad
Compilación y Portabilidad
Actualmente el núcleo de radare2 puede compilarse en muchos sistemas y arquitecturas, pero el desarrollo principal se realiza en GNU /
Linux con GCC, y en MacOS X con sonido metálico. Radare también se conoce para compilar en muchos sistemas y arquitecturas
Las personas a menudo quieren utilizar radare como un depurador para la ingeniería inversa. Actualmente, la capa depurador se puede
utilizar en Windows, GNU / Linux (Intel x86 y x86_64, MIPS y ARM), OS X, FreeBSD, NetBSD, y OpenBSD (Intel x86 y x86_64) ..
En comparación con núcleo, la característica de depurador es la portabilidad a gota más restrictivo. Si el depurador no ha sido portado a
Observe que hay E / S conector que utilice el BGF, el BGF, WinDbg o vino como back-ends, y por lo tanto se basan en presencia de
herramientas de terceros correspondiente (en el caso de la depuración remota - sólo en el equipo de destino).
Para construir un sistema que utiliza acr y Hacer GNU ( por ejemplo, en sistemas * BSD):
$ Sys / install.sh
Construir estática
Usted puede construir radare2 estáticamente, junto con todas las demás herramientas con el comando:
$ Sys / static.sh
Estibador
Radare2 barcos repositorio una Dockerfile que se puede utilizar con estibador.
18
Compilación y Portabilidad
Este dockerfile también es utilizado por la distribución REMnux de SANS, y está disponible en la ventana acoplable
registryhub .
19
Compilación en Windows
ventanas
Radare2 se basa en el generador de sistema de construcción Mesón para apoyar la compilación en todas las plataformas, incluyendo Windows. Mesón generará
una solución de Visual Studio, todos los archivos necesarios para el proyecto, y el cable hasta el C ++ Visual compilador de Microsoft para usted.
Requisitos previos
3 Mesón Git
Paso a paso
Visual Studio debe estar instalado con un compilador de C ++ Visual, el apoyo a las bibliotecas de C ++ y el SDK de Windows correspondiente
En el Visual Studio 2015 instalador, asegurar Lenguajes de Programación> de Visual C ++ se selecciona instaladores En el Visual Studio
Si necesita una copia de Visual Studio, las versiones de la comunidad son gratuitos y funcionan muy bien.
Se recomienda encarecidamente instalar Conda - un sistema de gestión del medio ambiente Python - cuando se trabaja con Python en
la plataforma Windows. Esto aislará el entorno de construcción Radare2 de otras versiones de Python instalado y minimizar los
conflictos potenciales.
20
Compilación en Windows
Configurar Conda:
Siga estos pasos para crear y activar un entorno de Conda llamado r2. Todas las instrucciones de este punto en adelante asumirán este
3. activar r2
En cualquier momento que deseen entrar en este entorno, abra el símbolo del Anaconda y reedición activar r2.
instalar Mesón
Todas las versiones de Mesón iguales o inferiores a 0.47.1 tienen un error que impiden el uso normal en Windows. Porque no hay
versión oficial con las correcciones disponibles, debe instalar a partir de fuentes. Los siguientes pasos le guiará a través de este.
2. Descargar https://github.com/mesonbuild/meson/archive/master.zip
Todo el código Radare2 se gestiona a través del sistema de control de versiones Git y alojado en GitHub .
A medida que navega el asistente de instalación, se recomienda configurar estas opciones cuando aparecen:
21
Compilación en Windows
Utilizar la biblioteca nativa de Windows canal seguro (en lugar de OpenSSL) Pedido de estilo de Windows,
comprometerse finales de línea al estilo Unix (core.autocrlf = true) ventana de la consola por defecto Uso de
2. Cierre todas las ventanas de la consola previamente abiertas y volver a abrir para asegurar que reciban el nuevo PATH
1. En su entorno Radare2 Conda, desplazarse a una ubicación donde se guardará el código y compilado. Esta ubicación necesita
Siga estos pasos para compilar una versión de depuración de 32 bits (x86) de Radare2. (Si usted quiere construir una versión de 64 bits (x64) de Radare2,
reemplazar todas las instancias de x86 con x64. Del mismo modo, si usted quiere construir una versión de lanzamiento, reemplazar todas las instancias de depurar con lanzamiento
.)
3. Inicializar Estudio de herramientas de Visual mediante la ejecución del comando que coincide con la versión instalada en su máquina de
Visual Studio:
4. Generar el sistema de construcción con Mesón: mesón construir --buildtype depuración --backend vs2015 -
prefijo% CD% \ dest
22
Compilación en Windows
Mesón requiere actualmente - prefijo para que apunte a una ruta absoluta. Usamos el% pseudovariable% de CD para obtener la ruta
Los / m [axcpucount] parámetro genera un proceso de trabajo MSBuild por procesador lógico en su máquina. Puede especificar un valor
numérico (por ejemplo / m: 2) para limitar el número de procesos de trabajo si es necesario. (Esto no se debe confundir con el
23
Interfaces de usuario
Interfaces de usuario
Radare2 ha visto muchas interfaces de usuario diferentes están desarrollando en los últimos años.
El mantenimiento de una interfaz gráfica de usuario está lejos del alcance del desarrollo de la maquinaria central de un conjunto de herramientas de ingeniería
inversa: se prefiere tener un proyecto y la comunidad separada, permitiendo que ambos proyectos para colaborar y mejorar juntos - en lugar de forzar a los
desarrolladores de la CLI para pensar en los problemas de interfaz gráfica de usuario y tener que ir y venir entre el aspecto gráfico y la lógica de nivel bajo de las
implementaciones.
En el pasado, ha habido por lo menos 5 interfaces de usuario nativas diferentes (Ragui, r2gui, gradare, r2net, bokken), pero ninguno de ellos tiene el
Además, R2 tiene un servidor web integrado y barcos algunas interfaces de usuario básicas escritas en HTML / JS. Puede comenzar como esto:
$ R2 -C = H / bin / ls
Después de 3 años de desarrollo privado, Hugo Teso; el autor de Bokken (Python GUI-GTK de r2) dio a conocer al público en cualquier
otro frontal de r2, esta vez escrito en C ++ y Qt, que ha sido muy bien recibido por la comunidad.
Esta GUI fue nombrado Iaito, pero siempre y cuando él prefirió no seguir manteniéndola, Xarkes decidió que tenedor que bajo el nombre de
cortador (nombre votado por la comunidad), y dirigir el proyecto. Esto es como se ve:
https://github.com/radareorg/cutter .
24
Interfaces de usuario
25
Primeros pasos
La curva de aprendizaje es por lo general un poco caro al principio. Aunque después de una hora de su utilización, usted debe entender fácilmente
cómo funcionan la mayoría de las cosas, y cómo combinar las diferentes herramientas radare ofertas. Se le anima a leer el resto de este libro para
entender cómo funcionan algunas cosas no triviales, y en última instancia, para mejorar sus habilidades.
Navegación, inspección y modificación de un archivo binario cargado se realiza mediante tres acciones simples: buscar (la posición), impresión
El comando 'buscar' se abrevia como s y acepta una expresión como argumento. La expresión puede ser algo así como 10, + 0x25, o [ 0x100 +
ptr_table]. Si está trabajando con archivos basados en bloques, es posible que prefiera para establecer el tamaño de bloque a un valor requerido
con segundo mando, y buscar hacia adelante o hacia atrás con posiciones alineadas a la misma. Utilizar s ++ y s-- comandos para navegar por este
camino.
Si radare2 abre un archivo ejecutable, por defecto se abrirá el archivo en modo de direccionamiento virtual (VA) y las secciones se va a proyectar a
sus direcciones virtuales. En el modo de VA, la búsqueda se basa en la dirección virtual y la posición de inicio se establece en el punto de entrada
del ejecutable. Utilizando - norte opción que puede suprimir este comportamiento por defecto y pedir radare2 para abrir el archivo en modo no-VA
para usted. En el modo no-VA, la búsqueda se basa en el desplazamiento desde el principio del archivo.
26
Primeros pasos
El comando 'imprimir' se abrevia como pag y tiene un número de sub-modos - la segunda carta que especifica un modo de impresión deseado.
Que se le permitiera escribir archivos, especifique la - w opción de radare2 al abrir un archivo. los w comando se puede utilizar para escribir
> wx 90 90 90 90 ; hexpairs
Al añadir una? a un comando mostrará su mensaje de ayuda, por ejemplo, ¿pag? . Al añadir? * Mostrará comandos comenzando con la cadena
Para entrar en el modo visual, pulse V <ENTER>. Utilizar q para salir del modo visual y volver al indicador.
En el modo visual puede utilizar las teclas para navegar hjkl (izquierda, abajo, arriba, ya la derecha, respectivamente). Puede utilizar estas teclas en el modo de cursor
quitarse o do llave. Para seleccionar un rango de bytes en modo de cursor, mantenga pulsada la tecla CAMBIO
Mientras que en el modo visual, también se puede sobrescribir bytes pulsando yo . Puede pulsar LENGÜETA para cambiar entre el hexágono (medio) y
las columnas de cadena (derecha). Prensado q dentro del panel hexagonal se vuelve al modo visual. Presionando pag o PAG puede desplazarse a
diferentes representaciones modo visual. Hay un segundo modo visual más importante - la interfaz de paneles maldiciones similar, accesible con V!
mando.
27
Banderas de línea de comandos
$ Radare2 -h
Uso: r2 [-ACdfLMnNqStuvwzX] [parche -P] [-p prj] [-a arco] [bits de -b] [-i archivo]
[-S addr] [-B baddr] [-m maddr] [-c cmd] [k = v -e] archivo | pid | - | - | =
28
Banderas de línea de comandos
- n, -nn no cargue información RBin (-nn estructuras del compartimiento de carga solamente)
- u establecer bin.filter = falsa para obtener prima sym / SEC / nombres cls
Abrir un archivo en modo de escritura sin necesidad de analizar los encabezados de formato de archivo.
archivo $ r2 -nw
$ R2 -
$ R2 -a -b 32 ppc ls.fat
$ R2 -i patch.r2 target.bin
29
Banderas de línea de comandos
$ R2 = 0 -e scr.color BLAH.BIN
Depurar un programa:
$ Ls -d r2
prueba $ r2 -p
30
Formato de los comandos
Las personas que usan Vim diariamente y están familiarizados con sus comandos se encontrarán como en casa. Verá este formato
utilizado en todo el libro. Los comandos se identifican por un solo caso sensible carácter [a-zA-Z].
px # ejecutar px
Los ! prefijo se utiliza para ejecutar un comando en contexto shell. Si desea utilizar la devolución de llamada cmd desde el plugin de E / S debe
prefijar con =! .
Tenga en cuenta que un solo signo de exclamación se ejecutará el comando e imprimir la salida a través de la API rcons. Esto significa que
Todos el zócalo, las API del sistema de archivos y de ejecución pueden ser restringidos con el cfg.sandbox variable de configuración.
Algunos ejemplos:
pd 2000 | eax grep ; grep códigos de operación que utilizan el 'EAX' registrarse
La tubería estándar de UNIX | también está disponible en la cáscara radare2. Se puede utilizar para filtrar la salida de un comando r2 con cualquier
programa de shell que se lee de la entrada estándar, tales como grep, menos, wc. Si no desea que nada para desovar, o no puede, o el sistema de destino
no tiene las herramientas básicas que necesita UNIX (Windows o usuarios incrustados), también se puede utilizar el incorporado en grep (~ ).
31
Formato de los comandos
el ~ carácter permite la función grep-como interno utilizado para filtrar la salida de cualquier comando:
O incluso combinarlos:
Esta función grep interna es una característica clave para radare2 secuencias de comandos, ya que puede ser utilizado para iterar sobre una lista de
desplazamientos o datos generados por desensamblador, oscila, o cualquier otro comando. Referirse a bucles
Los @ carácter se utiliza para especificar un desplazamiento temporal en el que se ejecutará el comando a su izquierda. a continuación, se restaura la
La mayoría de los comandos ofrecen apoyo terminación automática usando < TAB> clave, por ejemplo s eek o F desfases comandos. Ofrece terminación
automática utilizando todos los valores posibles, tomando nombres bandera en este caso. Observe que es posible ver la historia de los comandos
utilizando el! ~ ... comando - que ofrece un modo visual para desplazarse por el historial de comandos radare2.
Para extender el apoyo de autocompletar para manejar más comandos o habilitar el autocompletado a sus propios comandos definidos en
32
expresiones
expresiones
Las expresiones son representaciones matemáticas de los valores numéricos de 64 bits. Se pueden mostrar en diferentes formatos, se comparan o
se utilizan con todos los comandos que aceptan argumentos numéricos. Las expresiones pueden utilizar operaciones aritméticas tradicionales, así
como unos binarios y booleanos. Para evaluar expresiones matemáticas añada las rutas con el comando? :
0xfffffffffffffffa octal
01777777777777777777772 unidad
17179869184.0G
cadena "\ xfa \ xff \ xff \ xff \ xff \ xff \ xff \ xff"
trits 0t11112220022122120101211020120210210211201
+ : adición
- : la resta
* : Multiplicación /:
división%: módulo
> : Desplazamiento
[0x00000000]>? Vi 1 + 2 + 3 6
Con el uso del operador lógico OR debe citar todo el comando para evitar la ejecución de la | tubo:
33
expresiones
0x3
octal 03 unidad
: decimal
También puede utilizar variables y buscar posiciones para construir expresiones complejas.
Utilizar el PS comando para listar todos los comandos disponibles o leer el capítulo refcard de este libro.
código de operación de
longitud $ s tamaño de
archivo $ j saltar la dirección (por ejemplo, JMP 0x10, 0x10 jz => 0x10) $ f
opcode referencia de memoria (por ejemplo, mov eax, [0x10] => 0x10) $ b
tamaño de bloque
[0x4A13B8C0]>? + $ L $ m
0x4a13c000
34
expresiones
35
Sesión básica depurador
Para depurar un programa, comenzar con el radare - re opción. Tenga en cuenta que se puede adjuntar a un proceso que se ejecuta mediante la especificación de su
$ Pidof MC 32220
$ R2 r2 -d 32220 $ -d / bin /
ls
. . .
Se hará una pausa en su ejecución a principios de ld.so enlazador dinámico. Como resultado de ello, aún no se verá el punto de entrada o cualquier bibliotecas
Puede anular este comportamiento estableciendo otro nombre para un punto de interrupción de entrada. Para ello, agregue un comando radare
Otra manera de continuar hasta que una dirección específica es el uso de la DCU mando. Lo que quiere decir: "depuración continuará hasta que"
principal de la DCU
Ten en cuenta que cierto software malicioso u otros programas complicados en realidad puede ejecutar código antes principal() y por lo tanto no podrás
A continuación se muestra una lista de los comandos más comunes utilizados con depurador:
36
Sesión básica depurador
Hay otra opción para la depuración en radare, que puede ser más fácil: se utiliza el modo visual.
De esa manera usted no tendrá que recordar muchos comandos ni para mantener el estado del programa en su mente.
[0xb7f0c8c0]> Vpp
La vista inicial después de entrar en el modo visual es una vista hexdump del contador actual programa de destino (por ejemplo, EIP para x86).
Prensado pag se puede navegar a través del resto de puntos de vista modo visual. Puede pulsar pag y PAG para girar a través de los modos de impresión
más comunes. Uso F7 o s para entrar en y F8 o S a pasar por encima de la instrucción actual. Con el do clave que puede cambiar el modo de cursor
para marcar una selección de rangos de bytes (por ejemplo, para sobrescribir tarde con NOP). Puede establecer puntos de interrupción con F2
llave.
En el modo visual puede introducir comandos regulares radare anteponiendo con: . Por ejemplo, para volcar un un bloque de contenido de la
memoria en la ESI:
Para obtener ayuda sobre el modo visual, pulse? . Para desplazarse por la pantalla de ayuda, utilizar las flechas. Para salir de la vista de ayuda, pulse
q.
Un comando es utilizado con frecuencia Dr , que se utiliza para leer o escribir valores de registros de propósito general del objetivo. Para una
representación más compacta valor del registro es posible utilizar dr = mando. También puede manipular el hardware y los registros de coma
flotante ampliada /.
37
Contribuyendo a radare2
contribuyendo
Radare2 libro
Si quieres contribuir al libro Radare2, puede hacerlo en el repositorio de Github . contribuciones sugeridas incluyen:
relatos CTF
Por favor, obtener el permiso para el puerto cualquier contenido que no es dueño / no creó antes de colocarlo en el libro Radare2.
38
Configuración
Configuración
El núcleo lee ~ /. config / radare2 / radare2rc mientras que a partir. Puedes añadir mi comandos de este archivo para sintonizar la configuración
radare2 a su gusto.
Para evitar radare2 de analizar este archivo en el arranque, pasarla a la - norte opción.
Toda la configuración de radare2 se realiza con la eval comandos. Un archivo de configuración inicial típica es el siguiente:
= dbg.bep cargador
La configuración también se puede cambiar con - mi opción de línea de comandos. De esta manera usted puede ajustar la configuración de la
línea de comandos, manteniendo el archivo .radare2rc intacta. Por ejemplo, para comenzar con la configuración vacía y luego ajustar scr.color y asm.syntax
Internamente, la configuración se almacena en una tabla hash. Las variables se agrupan en espacios de nombres: cfg. , expediente. , dbg. , SCR. y
así.
Para obtener una lista de todas las variables de configuración sólo tiene que escribir mi en la línea de comandos. Para limitar la salida a un espacio de nombres
seleccionado, pasarlo con un punto final a e. Por ejemplo, archivo de correo. mostrará todas las variables definidas dentro del espacio de nombres "archivo".
39
Configuración
er [clave] establecer clave de configuración como de sólo lectura. sin vuelta atrás
CE [k] [color] conjunto de colores para la clave dada (pronta, offset, ...) e una
Una alternativa más simple a la mi comando es accesible desde el modo visual. Tipo ve para entrar en él, utilice las flechas (arriba, abajo, izquierda,
derecha) para navegar por la configuración y q para salir de ella. La pantalla inicial para la configuración de edición visual se ve así:
[EvalSpace]
dbg cmd fs
hex http
gráfico
HUD scr
búsqueda
io
Para los valores de configuración que pueden tomar uno de varios valores, puede utilizar los =? operador para obtener una lista de valores válidos:
golpear, bandera
40
Configuración
41
Colores
Colores
acceso a la consola está envuelto en API que permite mostrar la salida de cualquier comando como ANSI, W32 consola o formatos HTML. Esto
permite que el núcleo de radare para funcionar dentro de los entornos con capacidades que muestran limitadas, como granos o dispositivos
Para habilitar el soporte de colores por defecto, añadir una opción de configuración correspondiente al archivo de configuración .radare2:
Tenga en cuenta que la activación de los colores no es una opción booleana. En cambio, es un número porque hay diferentes niveles de profundidad de color. Esto es:
La razón de tener este tipo de opciones definidas por el usuario se debe a que no hay manera estándar o portátil para los programas de terminal para
consultar la consola para determinar la mejor configuración, lo mismo que las codificaciones de juegos de caracteres, por lo r2 le permite elegir que con la
mano.
Por lo general, las consolas en serie pueden trabajar con 0 o 1, mientras que xterms puede admitir hasta 3. rcons tratarán de encontrar la combinación
de colores más cercano para su tema cuando se elige una diferente con el eco mando.
Es posible configurar el color de casi cualquier elemento de salida de desmontaje. Para los terminales * NIX, R2 acepta especificación de color en
Tipo CE para obtener una lista de todos los colores que se utilizan actualmente. Tipo ECS para mostrar una paleta de colores a escoger los colores de:
42
Colores
43
Colores
temas
Usted puede crear su propio tema de color, pero radare2 tener sus propios los predefinidos. Utilizar el eco
En el modo visual utilizar el R clave para cambiar aleatoriamente colores o elegir el tema siguiente en la lista.
44
Variables de configuración
Variables de configuración
A continuación se muestra una lista de las variables de configuración de uso más frecuente. Puede obtener una lista completa mediante la emisión mi comando
sin argumentos. Por ejemplo, para ver todas las variables definidas en el "cfg" espacio de nombres, tema e cfg. ( mente el punto final). Usted puede obtener
los ¿¿mi?? comando para obtener ayuda sobre todas las variables de configuración evaluables de radare2. Siempre que el resultado de este
comando es bastante grande que se puede combinar con el grep interna ~ filtrar por lo que busca:
El modo Visual cuenta con un navegador eval que es accesible a través de la VBE mando.
asm.arch
Define la arquitectura de la CPU de destino utilizado para desmontar ( PD, PD comandos) y análisis de código ( una mando). Puede
rasm2 -L. Es muy sencillo añadir nuevas arquitecturas para el desmontaje y el análisis de código. Existe una interfaz para eso. Para x86,
que se utiliza para unir una serie de motores de desensamblador de terceros, incluyendo GNU binutils, Udis86 y unos pocos los hechos
a mano.
asm.bits
Determina anchura en bits de los registros de la arquitectura actual. Los valores admitidos: 8, 16, 32, 64. Nótese que no todos arquitecturas de destino son
asm.syntax
Los cambios de sabor sintaxis para desensamblador entre Intel y AT & T. Por el momento, este ajuste afecta Udis86 desensamblador para
Intel 32 / Intel solamente 64 objetivos. Los valores admitidos son Intel y att.
asm.pseudo
45
Variables de configuración
Un valor booleano para elegir un motor de cadena de desmontaje. "Falso" indica un nativo, definido por la arquitectura actual, "verdadero"
asm.os
Selecciona un sistema operativo de destino de binario cargado actualmente. Por lo general, el sistema operativo detecta automáticamente
Rabin-ri. Todavía, asm.os se puede utilizar para cambiar a una mesa diferente syscall empleado por otro sistema operativo.
asm.flags
asm.lines.call
Si se establece en "true", dibujar líneas a la izquierda de la salida de desmonte ( PD, PD comandos) para representar gráficamente los cambios de flujo
de control (saltos y llamadas) que están dirigidos dentro del bloque actual. Ver también
asm.linesout.
asm.linesout
Cuando se define como "verdadera", la vista desmontaje también dibujar líneas de flujo de control que van fuera del bloque.
asm.linestyle
Un valor booleano que cambia la dirección de análisis de flujo de control. Si se establece en "false", se realiza de arriba hacia abajo de un
bloque; de lo contrario, va de abajo hacia arriba. El ajuste de "falsa" parece ser una mejor opción para mejorar la legibilidad y es el que viene por
defecto.
asm.offset
valor booleano que controla la visibilidad de las compensaciones para las instrucciones individuales desmontadas.
asm.trace
Un valor booleano que controla la visualización de la información de seguimiento (número de secuencia y el contador) a la izquierda de cada código de operación. Se
46
Variables de configuración
asm.bytes
Un valor booleano se utiliza para mostrar u ocultar la visualización de bytes sin formato de instrucciones.
cfg.bigendian
Cambiar orden de bits. "Verdadero" significa big endian, "falso" es para ascendente hacia la izquierda. "File.id" y "file.flag" tanto para ser verdad.
cfg.newtab
Si se habilita esta variable, mensajes de ayuda se muestran junto con los nombres de comandos en la implementación del tabulador para
comandos.
scr.color
Esta variable especifica el modo para la salida de la pantalla coloreada: "falso" (o 0) significa que no hay colores, "verdadero" (o 1) significa modo
de 16 colores, 2 significa modo de 256 colores, 3 significa 16 modo millón-colores. Si su tema favorito se ve raro, tratar de subir esto.
scr.seek
Esta variable acepta una expresión con todas las funciones o un puntero / bandera (por ejemplo. EIP). Si se establece, radare establecerá buscar la posición de su valor
en el arranque.
cfg.fortunes
Activa o desactiva los mensajes de "Fortune" que se muestran en cada radare comienzan.
cfg.fortunes.type
Fortunas se clasifican por tipo. Esta variable determina qué tipos están autorizados para la visualización cuando
cfg.fortunes es cierto , para que puedan ser afinados en lo que es apropiado para la audiencia deseada. tipos actuales son consejos,
47
archivos
archivos
Utilizar r2 -H para enumerar todas las variables de entorno que son importantes para saber dónde estará en busca de archivos. Esos caminos dependen de la
R2_PREFIX = / usr
archivos RC
archivos RC son scripts r2 que se cargan en tiempo de inicio. Estos archivos deben estar en 3 lugares diferentes:
Sistema
Tu hogar
Cada usuario del sistema puede tener sus propios guiones R2 para ejecutar en el arranque para seleccionar la combinación de colores, y otras opciones
~ / .Radare2rc
radare2 / radare2rc.d /
Archivo de destino
48
archivos
Si desea ejecutar una secuencia de comandos cada vez que se abre un archivo, basta con crear un archivo con el mismo nombre del archivo, pero añadiendo . r2 lo.
49
Los comandos básicos
La mayoría de los nombres de comandos en radare se derivan de nombres de acción. Deben ser fáciles de recordar, si son cortas. En realidad,
todos los comandos son letras individuales. Subcomandos o comandos relacionados se especifican utilizando el segundo carácter del nombre del
comando. Por ejemplo, / foo es un comando para buscar la cadena normal, mientras que / x 90 90 se utiliza para buscar parejas hexadecimales.
El formato general para un comando válido (como se explica en el Formato de los comandos capítulo) es el siguiente:
[tiempos] [cmd] [~ grep] [@ [@ iter] addr tamaño!] [|> tubería] [.]; ...
Por ejemplo,
Si un comando comienza con =! , El resto de la cadena se pasa al plugin IO actualmente cargado (un depurador, por ejemplo). La mayoría de los
$ R2 -d / bin / ls
Si un comando comienza con! , Posix_system () es llamado para pasar el comando a su concha. Compruebe!? para más opciones y
ejemplos de uso.
El significado de los argumentos (iter, addr, tamaño) depende del comando específico. Como regla general, la mayoría de los comandos tienen un
número como argumento para especificar el número de bytes a trabajar, en lugar del tamaño de bloque definido actualmente. Algunos comandos
50
Los comandos básicos
Los @ signo se utiliza para especificar una ubicación de desplazamiento temporal o buscar una posición en la que se ejecuta el comando, en lugar de
buscar la posición actual. Esto es muy útil ya que no tiene que buscar alrededor todo el tiempo.
Utilizando @@ puede ejecutar un solo comando en una lista de banderas que coinciden con el pegote. Se puede pensar en esto como una operación foreach:
> s0
los > operación se utiliza para redirigir la salida de un comando en un archivo (sobrescribir si ya existe).
> PR> dump.bin; volcar bytes 'en bruto' del bloque actual a archivo llamado 'dump.bin'
el | operación (tubería) es similar a lo que estás acostumbrado a esperar de él en una cáscara * NIX: una salida de un comando como entrada
a otro.
Puede pasar varios comandos en una sola línea separándolos con un punto y coma; :
> px; Dr
51
buscando
buscando
Para moverse por el archivo que se está inspeccionando tendremos que cambiar la compensación a la que estamos usando el
s mando.
El argumento es una expresión matemática que puede contener nombres de bandera, paréntesis, suma, resta, multiplicación de immediates de
[0x00000000]> S 0x10
[0x00000010]> s + 4 [0x00000014]>
s [0x00000010]> s + [0x00000014]>
Observe cómo el indicador de compensar los cambios. La primera línea se mueve el desplazamiento a la dirección actual 0x10.
Y, por último, los 2 últimos comandos están deshaciendo y rehaciendo la última operaciones de búsqueda.
En lugar de utilizar sólo números, podemos usar expresiones complejas u operaciones aritméticas básicas para representar la dirección a
buscar.
Para ello, compruebe el? $? mensaje de ayuda que describe las variables internas que pueden ser utilizados en las expresiones. Por ejemplo,
[0x00000000]> s $$ + 4
Desde el depurador (o al emular) también podemos utilizar los nombres de los registros como referencias. Se cargan como banderas
Aquí está la ayuda total de la s mando. Vamos a explicar con más detalle a continuación.
52
buscando
s- deshacer buscar
s+ rehacer buscar
PC sr solicitar el registro
Si desea examinar el resultado de una expresión matemática, se puede evaluar utilizando el? mando. Basta con pasar la expresión
como argumento. El resultado se puede visualizar en formato hexadecimal, decimal, octal o binario.
También hay subcomandos de? que muestran la salida en un formato específico (en base 10, base 16, ...). Ver ? v y? VI.
En el modo visual, puede pulsar u ( deshacer) o T ( rehacer) dentro de la historia tratará de volver de nuevo a anterior o avanzar a la siguiente
ubicación.
Abrir documento
Como un archivo de prueba, vamos a utilizar un simple hello_world.c compilado en formato ELF Linux. Después compilamos que vamos a abrir con radare2:
53
buscando
$ R2 hola_mundo
[0x00400410]>
Todos los comandos que buscan que tienen una dirección como parámetro de comando pueden utilizar cualquier base numérica como hexadecimal, octal, binario o
decimal.
[0x00400410]> s 0x0
[0x00000000]>
0x0 [0x00000000]> s
[0x00000000]>
[0x00000000]> s + 128
[0x00000080]>
[0x00000080]> s
[0x00000000]> s
[0x00400410]>
54
buscando
[0x00400410]> s * f undo_3 @
0x400411
0x4005b4
55
Tamaño de bloque
Tamaño de bloque
El tamaño del bloque determina el número de bytes radare2 comandos de proceso cuando no se le da un argumento tamaño explícito. Puede
cambiar temporalmente el tamaño de bloque especificando un argumento numérico a los comandos de impresión. Por ejemplo 20 px.
[0xB7F9D810]> B?
| b EIP + 4 argumento numérico puede ser una expresión | establecer bf foo tamaño de
; ... = 0x110
los bf comando se utiliza para cambiar el tamaño de bloque de valor especificado por una bandera. Por ejemplo, en símbolos, el tamaño de bloque de
. . .
56
secciones
secciones
El concepto de secciones está ligada a la información extraída de los binarios. Podemos mostrar esta información mediante el uso de
la yo mando.
[0x00005310]> es
[Secciones]
03 176 0x00000278 0x00000278 176 -r-- .gnu.hash 04 0x00000328 0x00000328 3000 3000 -r--
.dynsym 05 0x00000ee0 1412 0x00000ee0 1412 -r-- .dynstr 06 250 0x00001464 0x00001464 250 -r--
0x000015d0 4944 -r-- .rela.dyn 09 0x00002920 0x00002920 2448 2448 -r-- .rela.plt 10 0x000032b0
. . .
Como usted sabe, los binarios tienen secciones y mapas. Las secciones definen el contenido de una parte del archivo que puede ser mapeado en
memoria (o no). Lo que está asignada está definida por los segmentos.
Antes de la refactorización IO hecho por condret, la S comando se utiliza para gestionar lo que ahora llamamos mapas. En la actualidad
imágenes de firmware, gestores de arranque y los archivos binarios suelen colocar varias secciones de un archivo binario en diferentes direcciones en la memoria.
Para representar este comportamiento, ofrece la radare es . Utilizar ¿es? para obtener el mensaje de ayuda. Para una lista de todas las secciones creadas utilizan es ( o ISj
para obtener el formato JSON). los iS = mostrará las barras región en ASCII-art.
Por ejemplo:
57
secciones
También puedes usar om comando para ver la información acerca de las secciones asignadas:
[0x00401000]> om
6 fd: 4 + 0x0001ae08 0x00000100 - test rwx 0x004000ff 5 fd: 3 + 0x00000000 0x00000000 - 0x0000055f
Utilizar om? para obtener todos los posibles subcomandos. Para una lista de todos utilizan los mapas definidos om ( o omj para obtener el formato JSON o om * para obtener el
formato de los comandos r2). Para obtener la vista ASCII Art uso om =.
Por ejemplo:
[0x00401000]> om-6
58
archivos de asignación
archivos de asignación
subsistema de E / S del Radare le permite mapear el contenido de archivos en el mismo espacio de E / S utilizado para contener un binario cargado. Los nuevos
los o comando permite al usuario abrir un archivo, este se asigna en la posición 0 si no tiene un encabezado binario conocido y luego los mapas
A veces, queremos rebasar un binario, o tal vez queremos cargar o asignar el archivo en una dirección diferente.
Al poner en marcha r2, la dirección base se puede cambiar con el - segundo bandera. Pero hay que notar la diferencia al abrir archivos con
encabezados desconocidos, como gestores de arranque, por lo que necesitamos para mapear usando el - metro bandera (o especificar como
argumento a la o mando).
radare2 es capaz de abrir archivos y porciones mapa de ellos en lugares al azar en la memoria especificar atributos como permisos y nombre. Es la
herramienta básica perfecta para reproducir un entorno como un archivo central, una sesión de depuración, por También la carga y mapear todas
Apertura de archivos (y el mapeo de ellos) se realiza mediante el O ( ) La orden de abrir. Vamos a leer la ayuda:
59
archivos de asignación
[0x00000000]> O?
| O- cierre todos los archivos, análisis, BINFILES, banderas, igual que r2! -
| OA [-] [A] [B] [nombre de archivo] Especifica el arco y los bits de archivo dado | oq
| o. [Len] abrir un malloc: // [len] copiando los bytes del desplazamiento actual
Vinculados] libselinux.so.1
4 bibliotecas
Convertir un archivo:
60
archivos de asignación
[0x00000000]> o
- 6 / bin / ls @ 0x0; r
- 10 /lib/ld-linux.so.2 @ 0x100000000; r
[0x00000000]> px @ 0x499999
archivos utilizando el unmap o- mando. Pasar el descriptor de archivo requerido a ella como un argumento:
[0x00000000]> O-14
61
Modos de impresión
Modos de impresión
Una de las características clave de radare2 está mostrando la información en muchos formatos. El objetivo es ofrecer una selección de opciones de
Los datos binarios pueden ser representados como enteros, pantalones cortos, largos, flotadores, marcas de tiempo, cuerdas hexpair, o formatos más complejos
como estructuras C, listados de desmontaje, descompilación lista, ser el resultado de un procesamiento externo ...
A continuación se muestra una lista de los modos de impresión disponibles listados por ¿pag? :
[0x00005310]> p?
| p = [BEP] [N] [len] [b] mostrar entropía / CHARS imprimibles / CHARS bares [?] | p2 [len]
8x8 2bpp-azulejos
| pd [?] [sz] [a] [b] desmontar N códigos de operación (PD) o N bytes (PD)
| PF [?] [. nam] [fmt] datos de impresión con formato (pf.name, pf.name $ <expr>)
| p [II] [DF] [len] impresión N ops / bytes (f = func) (véase pi? y PDI)
| pq [?] [iz] [len] imprimir el código QR con la primera nBytes del bloque actual
| pr [?] [GLX] [len] impresión N bytes primas (en líneas o hexblocks, 'g'unzip)
[0x00005310]>
62
Modos de impresión
Consejo: cuando se utiliza la salida JSON, puede anexar el ~ {} al comando para obtener una versión bastante impresa de la salida:
[0x00000000]> DO
[{ "Levantado": false, "fd": 563280, "URI": "malloc: // 512", "de": 0 "puede escribir": true, "tamaño": 512, "o verlaps": false }] [0x00000000]> DO ~} {[
563280,
Para más información sobre los poderes mágicos de ~ consulte la ayuda en? @? , y el Formato de los comandos capítulo anterior en el libro.
Ver hexadecimal
px da una salida fácil de usar que muestra 16 pares de números por fila con desplazamientos y representaciones primas:
63
Modos de impresión
[0x00404888]> p8 16
31ed4989d15e4889e24883e4f0505449
Dn] | pt
Por ejemplo, se puede 'ver' el búfer en uso como marcas de tiempo en el momento NTFS:
Como se puede ver, el orden de bits afecta el resultado. Una vez que haya impreso un sello de tiempo, puede grep la salida, por ejemplo, por
año:
[0x08048000]> pt ~ 1974 | wc -l 15
16:15:43 +0000
64
Modos de impresión
El formato de fecha por defecto se puede configurar mediante el cfg.datefmt variable. Reglas de formato para que siga el (3) formato strftime bien
conocido. Compruebe la página de manual para más detalles, pero estos son los más importantes:
% A El nombre abreviado del día de la semana según la localización actual. % A El nombre completo del día de la semana según la localización
actual. % D El día del mes como un número decimal (rango 01 a 31). % D Equivalente a% y% m /% d /. (Yecch-sólo para norteamericanos). % H
La hora como un número decimal usando un reloj de 24 horas (rango 00 a 23). % I La hora como un número decimal usando un reloj de 12 horas
(rango 01 a 12). % M El mes como un número decimal (rango 01 a 12). % M El minuto como un número decimal (rango 00 a 59). % P O "AM" o
% S El número de segundos desde la Época, 1970-01-01 00:00:00 0000 (UTC). (TZ)% S El segundo como un número decimal (rango de 00 a 60). (El rango es
% Y El año como un número decimal sin un siglo (rango 00 a 99). % Y El año como un número decimal incluyendo el siglo.
% Z La + hhmm o -hhmm zona horaria numérico (es decir, la hora y el minuto desplazamiento desde UTC). (SU)
Tipos basicos
Hay modos de impresión disponibles para todos los tipos básicos. Si usted está interesado en una estructura más compleja, tipo PF ?? para los
sesenta y cinco
Modos de impresión
[0x00499999]> PF ??
| PF: pf [.k [.f [= v]] | [v]] | [n] | [0 | cnt] [fmt] [a0 a1 ...] | Formato: | segundo
| re desensamblar un opcode
| norte siguiente Char especifica el tamaño de valor con signo (1, 2, 4 o 8 byte (s))
| norte siguiente Char especifica el tamaño de valor sin signo (1, 2, 4 o 8 byte (s))
|z \ 0 cadena terminada
|: omitir 4 bytes
|. saltar 1 byte
Utilice triple signo de interrogación PF ??? para obtener algunos ejemplos usando las cadenas de formato de impresión.
66
Modos de impresión
[0x00499999]> PF ???
| PF: pf [.k [.f [= v]] | [v]] | [n] | [0 | cnt] [fmt] [a0 a1 ...] | Ejemplos:
| PF barra 3xi foo 3-array de struct, cada uno con campos denominados
| pf.obj xxdz anterior siguiente nombre de tamaño Definir el formato obj como xxdz
| PF IWQ foo bar trol Imprimir el formato IWQ con foo, bar, Troll
como los nombres respectivos de los campos | PF 0iwq foo bar trol
(BiFC)
ay de 7 enteros
| ? PF ic i ... foo bar "(PF XW yo foo) troll" yo Imprimir anidado structres anónimos | pfn2
[0x4A13B8C0]> pf i 0x00404888 =
837634441
[0x4A13B8C0]> PF
0x00404888 = 837634432,000000
formatos de códigos de impresión válido para los idiomas legible por humanos son:
ordenador personal do
67
Modos de impresión
pcs cuerda
PCJ JSON
PCJ javascript
PCP pitón
Si tenemos que crear un archivo .c contiene un blob binario, utilice el ordenador personal mando, que crea esta salida. El tamaño por defecto es como en
muchos otros comandos: el tamaño del bloque, que se puede cambiar con el segundo
mando.
Pero sólo podemos anular temporalmente el tamaño de bloque expresándola como un argumento.
[0xB7F8E810]> PC 32
# definir _BUFFER_SIZE 32
0x89, 0xE0, 0xe8, 0x49, 0x02, 0x00, 0x00, 0x89, 0xc7, 0xe8, 0xE2, 0xff, 0xff, 0xff, 0x81
, 0xC3, 0xd6, 0xA7, 0x01, 0x00, 0x8B, 0x83, 0x00, 0xff, 0xff, 0xff, 0x5a, 0x8d, 0x24, 0x
[0x7fcd6a891630]> PC
"\ X48 \ x89 \ XE7 \ XE8 \ x68 \ x39 \ x00 \ x00 \ x49 \ x89 \ XC4 \ X8b \ x05 \ XEF \ x16 \ x22 \ x00 \ X5a \ x48 \ x8d \ x24 \ xc 4 \ x29 \ xc2 \ x52 \ x48 \ x89 \ xd6 \
x49 \ x89 \ xe5 \ x48 \ x83 \ xe4 \ xf0 \ x48 \ X8b \ X3D \ x06 \ X1A
Instrumentos de cuerda
Las cadenas son probablemente uno de los puntos de entrada más importantes a la hora de empezar a aplicar ingeniería inversa a un programa, ya que suelen
hacer referencia a la información sobre las acciones de funciones (afirma, depuración o INFO mensajes ...). Por lo tanto, radare soporta varios formatos de serie:
68
Modos de impresión
[0x00000000]> ps?
impresión PS
JSON
La mayoría de las cadenas están terminados en cero. A continuación se presenta un ejemplo utilizando el depurador para continuar la ejecución de un programa
hasta que se ejecuta la llamada al sistema 'abierto'. Cuando recuperamos el control sobre el proceso, se obtienen los argumentos que se pasan a la llamada al
sistema, apuntadas por EBX%. En el caso de la llamada 'abierta', que es una cadena terminada en cero, lo que podemos inspeccionar el uso PSZ.
[0x4A13B8C0]>
Esto puede ser utilizado para mirar a los argumentos que se pasan a una función. Para lograr esto, basta con pasar una 'secuencia en la memoria de formato' como
argumento para pf, y en el tiempo de cambio de posición buscan la corriente / desplazamiento utilizando
@. También es posible definir conjuntos de estructuras de pf. Para ello, el prefijo de la cadena de formato con una
69
Modos de impresión
valor numérico. También puede definir un nombre para cada campo de la estructura añadiéndolos como una lista de argumentos spaceseparated.
puntero:
0x00404890 = 0x48e2}
sym.gst_plugin_desc
[0x000185E0]> PF iissxsssss Mayor Menor versión _init nombre desc \ fuente de origen del paquete de licencia
0x000185e4 = 10
http://www.fluendo.com
desmontaje
los pd comando se utiliza para desmontar código. Se acepta un valor numérico para especificar el número de instrucciones que debe ser
desmontado. los pD comando es similar pero en lugar de una serie de instrucciones, decompila un número determinado de bytes.
[0x00404888]> pd 1
; - Entry0: 0x00404888
70
Modos de impresión
El sabor arquitectura para el desensamblador se define por la asm.arch variables eval. Puedes usar e asm.arch = ?? para enumerar todas las
arquitecturas disponibles.
a___ _16_32_64 arm.as LGPL3 como ARM ensamblador (uso ARM_AS medio ambiente)
. . .
Hay varias opciones que se pueden utilizar para configurar la salida del desensamblador. Todas estas opciones se describen en ¿mi?
asm.
71
Modos de impresión
[0x00005310]> e? asm.
asm.anal: Analizar código y árbitros, mientras que el desmontaje (ver anal.strings) asm.arch: Establecer el arco para ser
asm.assembler: Establecer el nombre del plugin para utilizar en el montaje de asm.bbline: Mostrar línea en blanco
después de cada asm.bits bloques básicos: tamaño de la palabra en bits en asm.bytes ensamblador: muestra los bytes
de cada asm.bytespace instrucción: bytes hexadecimales separados con un espacio en blanco asm.calls: información
relacionada con la función Mostrar destinatario de la llamada como comentarios en asm.capitalize disasm: uso en
asm.cmt.flgrefs: banderas Mostrar comentario asociado a asm.cmt.fold referencia rama: Doblar los comentarios, alternar
con Vz
. . .
Actualmente existen 136 asm. variables de configuración así que no una lista de todos ellos.
desmontaje de sintaxis
los asm.syntax variable se utiliza para cambiar el sabor de la sintaxis de montaje utilizado por un motor de desensamblador. Para cambiar entre
att
También puede comprobar asm.pseudo, que es una vista pseudocódigo experimental, y asm.esil qué salidas ESIL ( 'Intermedio series de
idioma evaluable'). El objetivo de ESIL es tener una representación legible de cada código de operación semántica. Tales
representaciones pueden ser evaluados (interpretado) para emular efectos de instrucciones individuales.
72
banderas
banderas
Las banderas son conceptualmente similares a los marcadores. Se asocian un nombre con un offset dado en un archivo. Las banderas pueden ser agrupados en
'espacios bandera'. Un espacio bandera es un espacio de nombres para banderas, la agrupación de banderas de características o tipo similar. Ejemplos para
Se puede quitar una bandera añadiendo el - carácter de comando. La mayoría de los comandos aceptan - como argumento prefijo como una
[0x4A13B8C0]> f-flag_name
73
banderas
[0x00005310]> fs?
flagspaces de visualización
[0x4A13B8C0]> símbolos fs; seleccionar sólo las banderas de símbolos flagspace [0x4A13B8C0]> f
[0x4A13B8C0]> f myflag; crear un nuevo indicador denominado 'myflag' [0x4A13B8C0]> f-myflag; eliminar la
banderas locales
Cada nombre de bandera debe ser único para abordar razones. Pero es bastante común la necesidad de tener las banderas, por ejemplo,
dentro de las funciones, con nombres simples y ubicuos como lazo o regreso . Para este propósito se puede utilizar los llamados banderas
"locales", los cuales están ligados a la función en la que residen. Es posible añadirlos usando F. mando:
74
banderas
[0x00003a04]> pd 10 │
[0x2206d8: 8] = 0 │
[0x2206d8: 8] = 0 │
[0x00003a04]>
75
Escribir
Radare puede manipular un archivo binario cargado de muchas maneras. Puede cambiar el tamaño del archivo, mover y bytes de copiar / pegar, insertar nuevos bytes
(cambiantes datos al final del bloque o archivo), o simplemente sobrescribir bytes. Los nuevos datos se pueden administrar como una amplia cuerdas, las instrucciones
Cambiar el tamaño del archivo mediante el r mando. Se acepta un argumento numérico. Un valor positivo establece un nuevo tamaño para el archivo. Un
bytes de escritura utilizando el w mando. Se acepta varios formatos de entrada como ensamblador en línea, endianfriendly DWords, archivos, archivos
76
Escribir
[0x00404888]> w?
| w6 [de] base64 / hex escribir base64 [d] ecoded o [e] cadena ncoded
| wc [?] [IR *?] escribir deshacer caché / commit / reset / lista (io.cache)
| [?] Nosotros [nNsxX] [arg] extender las operaciones de escritura (inserte vs sustituir) | WF - | archivo
| en peso [f] presentar [sz] escribir en el archivo (de la corriente de buscar, de bloque) [?] | WTS host: puerto [SZ] enviar
| wx [?] [FS] 9090 escribir dos NOP Intel (desde wxfile o wxseek)
Algunos ejemplos:
Durante escribir
los wo comando (escribir sobre) tiene muchas subcomandos, cada uno combina los datos existentes con los nuevos datos utilizando un
operador. El comando se aplica al bloque actual. operadores compatibles incluyen XOR, ADD, SUB ...
77
Escribir
[0x4A13B8C0]> wo?
| wox 0x0203; act bloque XOR con 0203 | WOA 02 03; añadir [0203] [0203] [...] a
curblk | ay 02 03
| operaciones soportadas:
| wow == escritura bucle valor (alias 'wb') | WOA + = Además | WOS - = resta | WOM *
Es posible implementar cifrado-algoritmos usando primitivas de núcleo radare y wo. Un ejemplo de sesión xor rendimiento (90) + add
(01, 02):
[0x7fcd6a891630]> px
- compensar - 0123456789ABCDEF
0x7fcd6a891630 4889 e7e8 6839 0000 4989 1622 c48b 05ef 0x7fcd6a891640 005a 488d 24C4
29c2 5248 89d6 4989 E548 0x7fcd6a891650 83e4 F048 8b3d 061A 498D 2200 4cd5 1049
0x7fcd6a891660 8d55 0831 ede8 06e2 0000 488d 15cf e600 [0x7fcd6a891630]> wox 90
[0x7fcd6a891630]> px
- compensar - 0123456789ABCDEF
0x7fcd6a891630 d819 d919 7778 541B 90ca d81d c2d8 1946 0x7fcd6a891640 1374 60d8 B290
d91d 1dc5 98a1 9090 d81d 0x7fcd6a891650 90DC 197c 9f8f 1490 d81d 95d9 9f8f 1490
0x7fcd6a891660 13d7 9491 9f8f 1490 13ss 9491 9f8f 1490 [0x7fcd6a891630]> WOA 01 02
[0x7fcd6a891630]> px
- compensar - 0123456789ABCDEF
0x7fcd6a891630 d91b 787a 91cc d91f 1476 61da 1ec7 99a3 0x7fcd6a891640 91de 1a7e d91f 96dB
14d9 9593 1401 9593 0x7fcd6a891650 c4da 1a6d E89A D959 9192 9159 1cb1 D959
78
Escribir
79
Enfocar
Enfocar
El zoom es un modo de impresión que le permite obtener una visión global de todo el archivo o un mapa de memoria en una sola pantalla.
En este modo, cada byte representa file_size / block_size bytes del archivo. Utilizar el pz
El cursor se puede utilizar para desplazarse más rápido a través de la Alejar vista. Prensado z de nuevo el zoom-in en la posición del cursor.
[0x004048c5]> pz?
dirección final
PZH
0x00000000 7F00 0000 e200 0000 146e 6f74 0300 0000 0x00000010 0000 0000 0068 2102
00ff 2024 e8f0 007a 0x00000020 8c00 18c2 ffff 0080 4421 41c4 1500 5dff 0x00000030 FF10
0018 0fc8 031A 000C 8484 E970 8648 0x00000040 d68b 3148 348b 03a0 8b0f c200 5D25
7074 0x00000050 7500 00e1 ffe8 58fe 4dc4 00e0 dbc8 b885
pz // o pzp
0x00000000 2f47 0609 070A 0917 1e9e a4bd 2a1b 2c27 0x00000010 322d 5671 8788 8182
5679 7568 82a2 7d89 0x00000020 8173 7f7b 727a 9588 a07b 5c7d 8daf 836d 0x00000030
b167 6192 a67d 8aa2 6246 856e 8c9b 999f 0x00000040 A774 96c3 b1a4 6c8e a07c 6a8f
8983 6a62 0x00000050 7d66 625F 7ea4 7ea6 b4b6 8b57 a19f 71a2
80
Enfocar
Pzf
0x00406e65 48d0 80f9 360f 8745 ffff ffeb ae66 0f1f 0x00406e75 4400 0083 F801 0f85 3FFF
ffff 410f B600 0x00406e85 3c78 0f87 6301 0000 0fb6 c8ff 24cd 0026 0x00406e95 4100 660F
1f84 0000 0000 0084 C074 043c 0x00406ea5 3a75 18b8 0500 0000 83f8 060f 95c0 e9cd
0x00406eb5 feff FF0F 1f84 0000 0000 0041 8801 4983 4983 0x00406ec5 C001 C201 C101
pO // o Pzf
0x00000000 0000 0000 0000 0000 0000 0000 0000 0000 0x00000010 0000 2b5c 5757 3a14
331f 1b23 0315 1d18 0x00000020 222a 2330 2b31 2e2a 1714 200d 1512 383D 0x00000030
1E1A 181b 0a10 1a21 2a36 281E 1d1c 0e11 0x00000040 1B2a 2F22 2229 181e 231E 181c
1913 262b 0x00000050 apartado 2B30 4741 422f 382a 1e22 0f17 0f10 3913
Puede limitar el zoom a una serie de bytes en lugar de toda la bytespace. Cambio zoom.from y
[0x00003a04]> e? enfocar.
zoom.byte: devolución de llamada zoom para calcular cada byte (Ver pz ayuda?) zoom.from: Zoom dirección de inicio
zoom.in: Especificar los límites de zoom.maxsz zoom: Zoom tamaño máximo de bloque zoom.to: Dirección de zoom
[0x00003a04 ]> e zoom. zoom.byte = h zoom.from = 0 zoom.in = io.map zoom.maxsz = 512 zoom.to = 0
81
Yank / Pegar
Yank / Pegar
Radare2 tiene un portapapeles interno para guardar y escribir porciones de memoria cargada desde la capa io actual.
copia (tirón)
pasta
La operación tirón leerá N bytes (especificado por el argumento) en el portapapeles. después podemos utilizar el yy comando para pegar lo
Puede dar un tirón / pega bytes en el modo visual seleccionándolas con el modo de cursor ( vc) y a continuación, utilizando el
y y Y asociaciones de teclas que son alias para y y yy comandos de la interfaz de línea de comandos.
[0x00000000]> y?
| Uso: y [ptxy] [len] [[@] DIRECCIÓN] Ver # wd? para el establecimiento de memoria, lo mismo que 'yf'. | y
| YFA copia de archivos copiar todos los bytes del archivo (se abre w / io) | 0x3344 yy
portapapeles pasta
sesión de ejemplo:
82
Yank / Pegar
Puede realizar un tirón y pegar en una sola línea sólo por el uso de la yt comando (yank-a). La sintaxis es la siguiente:
[0x4A13B8C0]> x
c7e8 e2ff ... 9 ........ 0x4A13B8CC, ffff 81c3 eea6 0100 8b83 08ff ......... ... 0x4A13B8D8, ffff 5a8d
2484 29c2
. . Z. $.).
[0x4A13B8C0]> x
c7e8 e2ff ... 9 ........ 0x4A13B8CC, 89e0 E839 0700 08ff 0089 8b83 ... 9 ..... ... 0x4A13B8D8, ffff
. . Z. $.).
83
comparando Bytes
comparando Bytes
Para la mayoría de las tareas de ingeniería inversa genéricos como encontrar las diferencias entre dos archivos binarios, lo que ha cambiado bytes,
encontrar diferencias en los gráficos de los resultados de análisis de código, y otras operaciones diffing sólo se puede utilizar radiff2:
$ Radiff2 -h
Dentro r2, las funcionalidades expuestas por radiff2 están disponibles con la do mando.
c( abreviatura de "comparar") le permite comparar las matrices de bytes de diferentes fuentes. El comando acepta la entrada en un número de
formatos y luego se lo compara con los valores que se encuentran en la posición actual buscar.
[0x00404888]> c?
| ccc [at] Igual que el anterior, pero sólo muestran líneas diferentes
| [Dir] @at Compare hexdumps memoria de $$ y el horario de verano en diff unificado cu [?] | bolo alimenticio [dir] @at disasm Diff
unificado de $$ y dirección dada | cv [1248] [hexpairs] @at Comparar 1,2,4,8-byte de valor | CV [1248] [addr] @at
| CD [dir] chdir
Para comparar los contenidos de la memoria a la corriente buscar posición en contra de una determinada cadena de valores, el uso cx:
84
comparando Bytes
[0x08048000]> p8 4 7f 45 4c 46
iguales
Otra subcomando de la do comando es cc que significa "comparar el código". Para comparar una secuencia de bytes con una secuencia en la
memoria:
c8 compara una palabra cuádruple de la corriente buscan (en el ejemplo de abajo, 0x00000000) en contra de una expresión matemática:
[0x00000000]> c8 4
0x00000000 (byte = 01) 7f '' -> 04 '' 0x00000001 (byte = 02) 45 'E' -> 00 ''
El parámetro número puede, por supuesto, ser expresiones matemáticas que utilizan nombres de bandera y nada permitida en una expresión:
[0x00000000]> cx 7f469046
0x00000001 (byte = 02) 45 'E' -> 46 'F' 0x00000002 (byte = 03) 4c 'L' -> 90
''
Puede utilizar el comando comparar para encontrar diferencias entre un bloque actual y un archivo previamente descargado en un disco:
85
comparando Bytes
bytes iguales
86
SDB
SDB
SDB significa Cadena base de datos. Es una sencilla base de datos clave-valor que sólo funciona con cadenas creadas por panqueque. Se utiliza en
muchas partes del r2 tener un disco y base de datos en memoria que es pequeño y rápido para gestionar su uso como una tabla hash en los esteroides.
SDB es una base de datos clave de cadena simple / valor en función de almacenamiento en disco cdb de djb y es compatible con JSON y matrices introspección.
Hay también los sdbtypes: una biblioteca vala que implementa varias estructuras de datos en la parte superior de un SDB o una instancia de Memcache.
ejemplo de uso
hola mundo
Utilización de matrices:
87
SDB
$ SDB - '[] list = 1,2' '[0] lista' '[0] list = foo' '[] lista' '[1] list = bar' 1 foo bar 2 2 foo
$ SDB foo =
=3
+ Un
4
- un
3
$ Rm -f d
Y qué ?
Por lo tanto, ahora se puede hacer esto dentro de sus sesiones radare2!
88
SDB
() {
$ R2 -A ./test [0x08048320]> ** k
32
SGVsbG8gd29ybGQ = [...]
Más ejemplos
** k
k anal / **
89
SDB
k*
anal k / *
k foo = bar
foo k
k syscall / * ~ ^ 0x
90
modo visual
Modo visual
El modo visual es un fácil de usar interfaz alternativa más al indicador de línea de comandos de radare2. Permite una fácil navegación, tiene un
modo de cursor para seleccionar bytes, y ofrece numerosas combinaciones de teclas para simplificar el uso del depurador. Para entrar en el modo
Navegación
La navegación se puede hacer usando hjkl o las flechas y las teclas Re Pág / PgDown. También entiende habituales teclas Inicio / Fin. Como
en Vim los movimientos pueden repetirse precediendo la tecla de navegación con el número, por ejemplo 5j se moverá hacia abajo por 5
91
modo visual
El modo Visual utiliza "modos de impresión", que son básicamente diferente del panel que se puede girar. Por defecto estos son:
↻ Panel hexdump -> panel de desmontaje → Panel depurador → palabras hexadecimales de volteo del panel
→ Hex-less panel de hexdump → análisis de panel mapa de color Op → Panel hexdump anotada ↺.
Observe que la parte superior del panel contiene el comando que se utiliza, por ejemplo, para el desmontaje del panel:
Obteniendo ayuda
Para ver ayuda en todas las combinaciones de teclas definidas para el modo visual, pulse? :
[1-9] seguir JMP / llamada identificada por acceso directo (similares; [1])
(A)
Automóvil club británico código ssemble, visual (A) ssembler
92
modo visual
xX Mostrar referencias externas / árbitros de la función actual desde / a los datos / código
F2 F4 punto de interrupción de
solo F8 paso
paso sobre F9
continuar
93
visual Desmontaje
Navegación visual
Desmontaje
Desplazarse dentro del desmontaje utilizando las teclas de flecha o hjkl. Utilizar o a buscar directamente a una bandera o una compensación, escribirla
cuando sea solicitado por el símbolo: [ desplazamiento]>. Siga un salto o una llamada utilizando el número de su teclado [ 0-9] y el número a la derecha en el
desmontaje de seguir una llamada o un salto. En este ejemplo la tipificación 1 en el teclado seguiría a la llamada a libc_start_main sym.imp .__ y por lo tanto,
re como definir
re se puede utilizar para cambiar el tipo de datos del bloque actual, varios tipos básicos / estructuras están disponibles, así como una
d → ...
d→b
. . .
Para mejorar la legibilidad del código puede cambiar la forma radare2 presenta valores numéricos en el desmontaje, por defecto la mayoría de
desmontaje valor numérico pantalla como hexadecimal. Puede ser que desee para visualizarla como un decimal, binario o incluso personalizado
seguido por yo a continuación, elija lo que la base para trabajar, esto es el equivalente a ahi:
94
visual Desmontaje
d → → i ... 0x004048f7
d → i → 10 0x004048f7
d → i → 2 0x004048f7
Recuerde que, para ser capaz de editar archivos cargados en realidad radare2, usted tiene que comenzar con el - w
minúscula presionando do Alterna el modo de cursor. Cuando este modo está activo, se pone de relieve el byte seleccionado actualmente (o intervalo de
bytes).
El cursor se utiliza para seleccionar un rango de bytes o simplemente para que apunte a un byte. Puede utilizar el cursor para crear una bandera con nombre en
la ubicación specifc. Para ello, busque en la posición requerida, a continuación, pulse F e introduzca un nombre para una bandera. Si el archivo se abre en modo
de escritura mediante el - w bandera o el O + de comandos, también puede utilizar el cursor para sobrescribir un rango seleccionado con nuevos valores. Para ello,
seleccione un rango de bytes (con HJKL y tecla SHIFT pulsada), a continuación, pulse yo e introduzca los valores hexpair para los nuevos datos. Los datos se
repiten según sea necesario para llenar el rango seleccionado. Por ejemplo:
El Visual ensamblador es una característica que proporciona una vista previa en vivo mientras se escribe en las nuevas instrucciones para parchear en el
desmontaje. Para usarlo, solicitar o colocar el cursor en la posición deseada y pulsa la tecla 'A'. Para proporcionar múltiples instrucciones, separarlos con
punto y coma,; .
95
visual Desmontaje
REFX
Cuando radare2 ha descubierto un XREF durante el análisis, se le mostrará la información en el Visual Desmontaje utilizando REFX
etiqueta:
Para ver donde esta cadena se llama, pulse X , Si desea saltar a la ubicación en la que se utilizan los datos a continuación, pulse el
Para habilitar este uso VEW esta configuración var e dbg.funcarg = true
96
visual Desmontaje
Añadir un comentario
Buscar
97
visual Desmontaje
/: permite resaltar de cadenas en la pantalla actual. : cmd permite el uso de uno de los "/?" comandos que realizan búsquedas
más especializadas.
el HUDS
El "Userfriendly HUD"
El "Userfriendly HUD" se puede acceder mediante el ?? combinación de teclas. Este HUD actúa como una hoja de trucos interactiva que se
puede utilizar para encontrar más fácilmente y ejecutar comandos. Este HUD es particularmente útil para los recién llegados. Para los
usuarios experimentados, el otro HUDS que son más activityspecific puede ser más útil.
Este HUD se puede visualizar mediante el _ clave, se muestra una lista de todas las opciones definidas y le permite saltar a ellos. Utilizando el
teclado se puede filtrar rápidamente la lista a una bandera que contiene un patrón específico.
Ajustar el desmontaje
look-and-feel del desmontaje se controla mediante las teclas de configuración. * "asm, que se pueden cambiar mediante el mi mando.
Todas las claves de configuración también se pueden editar a través del editor de configuración visual.
Este HUD se puede acceder mediante el mi clave en el modo visual. El editor le permite examinar y cambiar la configuración del
radare2 fácilmente. Por ejemplo, si desea cambiar algo en la pantalla desmontaje, seleccione asm de la lista, navegue hasta el
elemento que desea modificar, y luego seleccionarlo pulsando Enter. Si el artículo es una variable booleana, ésta cambia, de lo
98
visual Desmontaje
99
visual Desmontaje
100
visual Desmontaje
Los siguientes son algunos ejemplos de variables eval relacionados con el desmontaje.
101
visual Desmontaje
Ejemplos
Esta última operación también se puede hacer uso de & en el modo visual.
31ed ebp = 0
102
visual Desmontaje
e asm.describe = true
RSI pop 0x00404875 ; pops último elemento de la pila y almacena el resultado en argumen
0x00404879 y RSP, -0xf; binaria y operación entre src y dst, tiendas resultan en el horario de verano
103
visual ensamblador
visual ensamblador
Puede utilizar el modo visual para ensamblar código usando A . Por ejemplo vamos a reemplazar el empujar por una JMP:
104
visual ensamblador
Es necesario abrir el archivo en modo escritura ( -w r2 o oo +) con el fin de parchear el archivo. También puede utilizar el modo de caché: e
Recuerde que parchear los archivos en modo de depuración único parche no la memoria del archivo.
105
Editor de configuración visual
ve o mi en el modo visual le permite editar la configuración radare2 visualmente. Por ejemplo, si desea cambiar la visualización del ensamblaje
106
Editor de configuración visual
107
Editor de configuración visual
108
Los paneles visuales
Concepto paneles
visuales
1. Pantalla dividida
2. visualizar las pantallas múltiples, tales como símbolos, registros, pila, así como paneles personalizados
3. Menú cubrirá todos los comandos de uso común para usted de modo que usted no tiene que memorizar alguna de ellas
CUI se reunió con algunos GUI útil como el menú, que es paneles visuales.
Los paneles se pueden acceder desde el modo visual mediante el uso de! .
Visión general
comandos
109
Los paneles visuales
| [1-9] siguen JMP / llamada identificada por acceso directo (similares; [1]) | ''
| do cursor de palanca
| do el color de palanca
| yo inserte hexagonal
|V ir al modo de gráfico
Uso básico
Utilizar lengüeta para desplazarse por los paneles hasta llegar al panel de destino. A continuación, utilice hjkl, Al igual que en vim, para desplazar el panel en el que
se encuentra actualmente. Utilizar S y s a pasar por encima de / en, y todos los paneles deben ser actualizados dinámicamente mientras se está depurando. Ya
110
Los paneles visuales
los valores mediante la inserción de hex. Esto será explicado despues. mientras que golpea lengüeta puede ayudarle a moverse entre los paneles, se
recomienda utilizar metro para abrir el menú. Como de costumbre, puede utilizar hjkl para moverse por el menú y encontrará un montón de cosas útiles
allí.
Pantalla dividida
| es para el vertical y - es para la división horizontal. Puede eliminar cualquier panel pulsando X .
paneles de división se puede cambiar el tamaño de Modo de ventana, al que se accede con w.
cursor de palanca
Editar valores
Ya sea en el panel Registro o pila, puede editar los valores. Utilizar do para activar el modo de cursor y se puede mover el cursor pulsando hjkl, como
siempre. A continuación, golpeó yo , al igual que el modo de inserción de vim, para insertar un valor.
111
bytes búsqueda
La búsqueda de Bytes
El motor de búsqueda radare2 se basa en el trabajo realizado por Esteve, además de múltiples características implementadas en la parte superior de la misma. Es
compatible con múltiples búsquedas por palabra clave, máscaras binarias y valores hexadecimales. Se crea automáticamente banderas para la búsqueda golpearon
112
bytes búsqueda
[0x00000000]> /?
| Uso: [! Bf] / [arg] Buscar cosas (ver 'e ?? búsqueda' para las opciones) | Uso io.va para la búsqueda en espacios
| / C JMP [esp] buscar por código asm coincidente con la cadena dada
| / G [g] [de] encontrar todos los caminos del gráfico de A a B (/ GG seguimiento saltos, ver search.coun
ty
anal.depth)
| /En] mismo que E / S, pero con un repliegue diferente si no nos anal puede ser
ed
| [?] / R [erwx] sym.printf analizar referencia código de operación un desplazamiento (/ re para esil) | / R [grepopcode]
Porque todo se trata como un archivo en radare2, no importa si desea buscar en un zócalo, un dispositivo remoto, en el proceso de la
memoria, o un archivo.
113
bytes búsqueda
114
Búsquedas básicas
Búsqueda básica
Una búsqueda básica para una cadena de texto sin formato en un archivo sería algo así como:
Como puede verse en la salida anterior, radare2 genera una bandera "hit" para cada entrada encontrada. A continuación, puede utilizar la PD comando
para ver las cadenas almacenadas en las compensaciones marcados por las banderas de este grupo, y tendrán nombres de la forma hit0_ <índice>:
[0x00404888]> / ls
. . .
Puede buscar cadenas de todo el carbón de leña (por ejemplo, cartas Unicode) utilizando el / w mando:
Para realizar una búsqueda sensible a las mayúsculas para el uso de cadenas / yo :
[0x0040488f]> / i Stallman
Busca 8 bytes de 0x00400238 a 0x0040488f: 53 74 61 6c 6c 6d 61 6e [#] muestras: 004 138 <0x0040488f golpea = 0
Es posible especificar secuencias de escape hexadecimales en la cadena de búsqueda anteponiendo con "\ x":
115
Búsquedas básicas
[0x00000000]> / \ x7FELF
Pero, si usted está en busca de una cadena de valores hexadecimales, usted es probablemente mejor de utilizar el / X
mando:
[0x00000000]> / x 7F454C46
Una vez que la búsqueda se hace, los resultados se almacenan en el búsquedas espacio de bandera.
[0x00000000]> fs 0
0. instrumentos de cuerda
1 0. símbolos
2 6. búsquedas
Para extraer un "éxito" banderas después de que no los necesita más, utilizar el golpe f- * mando.
A menudo, durante las largas sesiones de búsqueda, tendrá que lanzar la última búsqueda más de una vez. Puede utilizar la // comando para
116
Configurando la búsqueda
El motor de búsqueda radare2 se puede configurar a través de varias variables de configuración, modificable con el mi mando.
e search.in = [foo]; pecify boundarie búsqueda. Los valores admitidos se enumeran en el mar e rch.in = ??
e search.align = 4 ; Mostrar sólo los resultados de búsqueda alineados por el límite especificado.
e search.asmstr = 0; buscar cadena en lugar de e search.flags montaje = true; si está activado, crear banderas
en éxitos
los search.align variable se utiliza para limitar válidos resultados de búsqueda a cierta alineación. Por ejemplo, con e search.align = 4 verá sólo los toques que se
los search.flags variable booleana indica al motor de búsqueda a los resultados de bandera para que puedan ser referenciados más adelante. Si una
búsqueda actualmente en ejecución se interrumpe con Ctrl-C secuencia de teclado, la posición de búsqueda actual está marcado con search_stop.
117
patrón de búsqueda
Los / pag comando le permite aplicar las búsquedas de patrones repetidos en IO almacenamiento de back-end. Es posible identificar secuencias
de bytes repetidos sin especificar explícitamente. El único parámetro de comando establece patrón de longitud mínima detectable. Aquí hay un
ejemplo:
[0x00000000]> / p 10
Esta salida del comando se mostrará diferentes patrones que se encuentran y cuántas veces cada uno de ellos se encuentra.
118
Automatización
Buscar Automatización
los cmd.hit variable de configuración se utiliza para definir un comando radare2 a ser ejecutado cuando una entrada coincidente se
encuentra por el motor de búsqueda. Si desea ejecutar varios comandos, separarlos con
;. Alternativamente, se puede organizar en una secuencia de comandos por separado, y luego invocarlo en su conjunto con .
31ed4989d15e4889
31ed4989d15e4889
119
Buscar hacia atrás
A veces usted quiere encontrar una palabra clave al revés. Esto es, antes de que la corriente de polarización, al hacer esto usted puede buscar hacia atrás y buscar
hacia adelante mediante la adición de algunos search.from / a restricciones o bien utiliza el / segundo mando.
[0x100001200]> / nop
nop
Tenga en cuenta que / segundo está haciendo lo mismo que / , Pero al revés, así que lo que si queremos usar / X ¿hacia atrás? Nosotros podemos usar / bx, y lo mismo
[0x100001200]> / x 90 0x100001a23
0x100003c5c hit1_11 90
[0x100001200]> / bx 90 [0x100001200]> s
0x10000355b [0x10000355b]> / bx 90
120
Buscar hacia atrás
121
Buscar en la Asamblea
ensamblador Buscar
Si desea buscar un cierto código en ensamblador, También se puede usar / do o / una comandos.
El comando / un jmp eax monta una cadena de código de máquina y, a continuación, busca los bytes resultantes:
122
La búsqueda de AES Keys
Gracias a Víctor Muñoz, radare2 ahora cuenta con el apoyo del algoritmo que desarrolló, capaz de encontrar claves AES expandidas
search.distance límite, o hasta que se alcanza el final del archivo. Se puede interrumpir la búsqueda actual pulsando
Ctrl-C. Por ejemplo, para buscar claves AES en la memoria física de su sistema:
[0x00000000]> / Ca 0 claves
AES encontrado
123
Desmontaje
Desmontaje
Desmontaje de radare es sólo una manera de representar una matriz de bytes. Se maneja como un modo de impresión especial dentro pag mando.
En los viejos tiempos, cuando el núcleo radare era más pequeño, el desensamblador fue manejada por un archivo de RSC externa. Es decir, radare
vierten primer bloque actual en un archivo, y luego simplemente se llama objdump configurado para desmontar para Intel, ARM u otras arquitecturas
soportadas.
Fue un trabajo y una solución amigable de Unix, pero fue ineficaz, ya que repetía las mismas acciones una y otra caros, porque no
Así que había una necesidad de crear una biblioteca desensamblador genérica para soportar múltiples plugins para diferentes arquitecturas. Podemos enumerar
$ -L rasm2
> e asm.arch = ??
Esto fue muchos años antes de que apareció coronamiento. Así r2 utilizaba udis86 y Olly desensambladores, muchos de GNU (de binutils).
Hoy en día, el apoyo desensamblador es una de las características básicas de radare. Ahora tiene muchas opciones, endianness, incluyendo
Para ver el desmontaje, utilizar el pd mando. Se acepta un argumento numérico para especificar el número de códigos de operación de la secuencia actual se
desea ver. La mayoría de los comandos de radare consideran el tamaño del bloque actual como límite predeterminado para la entrada de datos. Si desea
desmontar más bytes, establecer un nuevo tamaño de bloque con el segundo mando.
124
Desmontaje
los pD comando funciona como pd pero acepta el número de bytes de entrada como su argumento, en lugar del número de códigos de operación.
La sintaxis "pseudo" puede ser algo más fácil para un ser humano de entender que las anotaciones de ensamblador por defecto. Pero puede llegar a ser
125
Adición de metadatos
El trabajo típico involucrados en la reversión de los archivos binarios hace potentes capacidades de anotación esencial. Radare ofrece varias formas
Siguiendo los principios básicos comunes de UNIX, es fácil escribir una pequeña utilidad en un lenguaje de script que usa objdump, otool o
cualquier otra utilidad existente para obtener información de un binario y para importar en radare. Por ejemplo, echar un vistazo a idc2r.py enviado
con radare2ida . Para usarlo, invocar como idc2r.py file.idc> file.r2. Se lee un archivo IDC exportado desde una base de datos IDA Pro y produce
una secuencia de comandos R2 que contiene los mismos comentarios, nombres de funciones y otros datos. Puede importar el 'file.r2'
[0x00000000]>. file.r2
los . comando se utiliza para interpretar los comandos Radare de fuentes externas, incluyendo archivos y salida del programa. Por ejemplo, para omitir la
generación de un archivo intermedio e importar directamente la secuencia de comandos que puede utilizar esta combinación:
Por favor, tenga en cuenta que la importación de IDA Pro metadatos de volcado IDC es el mecanismo en desuso y puede no funcionar en el
futuro. El método recomendado para hacerlo - el uso python-BID -basado ida2r2.py que abre archivos BID directamente sin IDA Pro instalado.
los do comando se utiliza para gestionar los comentarios y las conversiones de datos. Se puede definir un rango de bytes del programa debe ser interpretado
como cualquiera de código, datos binarios o cadena. También es posible ejecutar código externo en todos los puntos de la bandera especificada con el fin de
buscar un poco de metadatos, como un comentario, desde un archivo externo o base de datos.
Hay muchos diferentes comandos de manipulación de metadatos, aquí es la visión de todos ellos:
126
Adición de metadatos
[0x00404cc0]> C?
n forma amigable | C
ommands
| CL [-] [*] [archivo: Línea] espectáculo [dir] o añadir 'código de línea' información (bininfo) | CS [-] [espacio]
| CC [-] [Comentario de texto] [@addr] añadir / eliminar comentarios [?] | CC. [Addr]
| CPBa [-a] | [a] [Texto] [@addr] añadir / quitar comentario en la dirección dada | CCU [comentario de texto] [@addr]
| Cd [-] [tamaño] [repetir] [@addr] matriz de datos hexdump (Cd 4 10 dword == [10]) | Cf [-] [SZ] [?] [0 | cnt] [fmt] [a0 a1 ...] [@addr]
memoria de formato (ver PF?) | CF [SZ] [FCN-signo ..] [@addr] firma de la función | Cm [-] [SZ] [FMT ..] [@addr] de análisis magia (?
Ver pm)
Basta con añadir el comentario a una determinada línea / en direcciones puede utilizar California mando:
0x00000000
los ¿DO? familia de comandos le permite marcar un rango como una de varias clases de tipos. Tres tipos básicos son: código (desmontaje se realiza
COMAND para definir una cadena, utilice el Discos compactos comando para la definición de una matriz de elementos de datos, y el uso de la
La anotación de los tipos de datos se realiza más fácilmente en el modo visual, utilizando la tecla "D", abreviatura de "cambiar el tipo de datos". En primer
lugar, utilizar el cursor para seleccionar un rango de bytes (pulse do tecla para cambiar el modo de cursor y utilice las teclas hjkl para expandir la selección),
luego presione 'd' para obtener un menú de posibles acciones / tipos. Por ejemplo, para marcar el rango como una cadena, utilice la opción 's' en el menú. Se
127
Adición de metadatos
string_foo
los cf comando se utiliza para definir una cadena de formato de memoria (la misma sintaxis utilizada por el PF
RIP:
[0] {
14696}
0x7fd9f13ae638 [1] {
571.928.325}
} dieciséis
Los [ sz] argumento para cf se utiliza para definir el número de bytes de la estructura debe asumir en el desmontaje, y es completamente independiente
del tamaño de la estructura de datos definida por la cadena de formato. Esto puede parecer confuso, pero tiene varios usos. Por ejemplo, es posible
que desee ver la estructura con formato que se muestra en el desmontaje, pero todavía tienen visibles esos lugares como compensaciones y con bytes
sin formato. A veces, se encuentran grandes estructuras, pero únicamente se han identificado algunos campos, o sólo está interesado en campos
específicos. Entonces, se puede decir R2 para mostrar sólo los campos, usando la cadena de formato y uso de 'saltar' campos, y también tienen el
SZ argumento.
Utilizando cf, es fácil de definir estructuras complejas con oneliners simples. Ver PF? para más
información. Recuerde que todos estos do comandos también se puede acceder desde el modo visual pulsando el d ( conversión de datos) clave.
Tenga en cuenta que a diferencia de t comandos cf no cambia los resultados del análisis. Sólo es una gran ayuda visual.
A veces, sólo la adición de una sola línea de comentarios no es suficiente, en este caso radare2 le permite crear un vínculo para un archivo de
texto en particular. Se puede utilizar con CC, mando o pulsando , Clave en el modo visual. Esto abrirá un $ EDITOR para crear un nuevo archivo, o si
existe el nombre de archivo, se acaba de crear un enlace. Se verá en los comentarios de desmontaje:
128
Adición de metadatos
│0x00003afc RSI lea, str.usr_share_locale; 0x179cc; "/ Usr / share / locale" RDI │0x00003b03 lea, [0x000179b2]
; "coreutils"
llamada │0x00003b0a sym.imp.bindtextdomain; [2]; char * bindtextdomain (char * nombre de dominio, char * nombredir)
Nota , ( locale-help.txt) aparecido en los comentarios, si apretamos , de nuevo en el modo visual, se abrirá el archivo. El uso de este mecanismo
podemos crear unas largas descripciones de algunos lugares en particular en el desmontaje, hojas de datos de enlace o artículos relacionados.
129
ESIL
ESIL
ESIL significa 'evaluable Cuerdas lenguaje intermedio'. Su objetivo es describir una Adelante ) -Como representación semántica para cada
código de operación de la CPU de destino. representaciones esil pueden ser evaluados (interpretado) con el fin de emular las instrucciones
individuales. Cada comando de una expresión ESIL está separado por una coma. Su máquina virtual puede ser descrito como esto:
si (word.isOperator ()) {
esil.push (palabra); }
nextCommand (); }
Como podemos ver ESIL utiliza un intérprete basado en pila similar a lo que se utiliza comúnmente para calculadoras. Tiene dos categorías de
entradas: valores y operaciones. Un valor simplemente es empujado en la pila, un operador continuación aparece valores (sus argumentos si se
quiere) de la pila, realiza su operación y empuja sus resultados (si los hay) de nuevo. Podemos pensar en ESIL como una notación post-fix de las
¿Puedes adivinar que es esto? Si tomamos esta notación post-fix y transformar de nuevo en-fix obtenemos
esp - 4 =
Podemos ver que esto corresponde a la instrucción x86 ebp empujar! ¿No es genial? El objetivo es ser capaz de expresar la mayoría de las operaciones
comunes realizadas por CPUs, como operaciones aritméticas binarias, cargas de memoria y tiendas, llamadas al sistema de procesamiento. De esta
manera si podemos transformar las instrucciones para ESIL podemos ver lo que hace un programa mientras se está ejecutando incluso para las
arquitecturas más crípticos que definitivamente no tiene un dispositivo para depurar el.
usando ESIL
130
ESIL
Hay 2 variables de entorno que son importantes para la observación de lo que hace un programa:
[0x00000000]> e = true # asm.emustr para la versión 2.2 y anteriores [0x00000000]> e = true # asm.emu.str para la
asm.emu dice R2 si desea información ESIL que se mostrará. Si se establece en true, podrás ver los comentarios aparecen a la
derecha de su desmontaje que indican cómo los contenidos de los registros y las direcciones de memoria se cambian por la
instrucción actual. Por ejemplo, si tiene una instrucción que resta un valor de un registro que le dice lo que el valor era antes y lo que
se hace después. Esto es súper útil por lo que no tiene que sentarse allí mismo y realizar un seguimiento de qué valor va a donde.
Un problema con esto es que se trata de una gran cantidad de información para tomar en una vez y, a veces simplemente no lo necesita. R2 tiene
un buen compromiso para esto. Eso es lo que el emu.str variable es para ( asm.emustr en
2.2 y anteriores). En lugar de esta salida muy detallado con cada valor de registro, esto sólo se suma información realmente útil a la salida, por
ejemplo, cadenas que se encuentran en las direcciones de un programa utiliza o si un salto es probable que sea tomada o no.
La tercera variable es importante asm.esil. Esto cambia su desmontaje ya no se muestran las instrucciones desmontadas reales, sino
que ahora muestra expresiones Esil que describen lo que hace que la instrucción correspondiente. Así que si quieres echar un
vistazo a cómo se expresan en las instrucciones ESIL basta con establecer "asm.esil" true.
Comandos Esil
[0x00000000]>
131
ESIL
[0x00000000]> aes
[0x00000000]> 10aes
[0x00000000]> AESO
[0x00000000]> 10aeso
[0x00001019]>
ESIL Código
operandos Nombre Operación ejemplo
de operación
Obtener la dirección de la
- src)
133
ESIL
134
ESIL
> ar r_01 = 5; ar
r_00 = 0; ar r_00
0x00000000
> "Ae r_01, r_00, + ="
+= src, reg AÑADIR eq reg = reg + src > Ar r_00
0x00000005
> ar r_01 = 3; ar
r_00 = 5; ar r_00
0x00000005
> "R_01 ae, r_00, * ="
*= src, reg eq MUL reg reg = * src > Ar r_00
0x0000000F
135
ESIL
> ar r_01 = 3; ar
r_00 = 6; ar r_00
0x00000006
> "Ae r_01, r_00, / ="
/= src, reg eq DIV reg = reg / src > Ar r_00
0x00000002
> ar r_01 = 3; ar
r_00 = 7; ar r_00
0x00000007
> "Ae r_01, r_00,% ="
> Ar r_00
0x00000001
%= src, reg eq MOD reg = reg% src
> Ar r_00 = 9; ar r_00
0x00000009
> ar r_00 = 1; ar
r_01 = 1; ar r_01
0x00000001
> "Ae r_00, r_01, << ="
<< = src, reg Desviación a la izquierda eq reg = reg << src > Ar r_01
0x00000002
> ar r_00 = 1; ar
r_01 = 8; ar r_01
0x00000008
> "Ae r_00, r_01, >> ="
>>= src, reg Shift derecho eq reg = reg << src > Ar r_01
0x00000004
> ar r_00 = 2; ar
r_01 = 6; ar r_01
0x00000006
> "Ae r_00, r_01, y ="
> R_01 ar
136
ESIL
> Ar r_01
y= src, reg Y eq reg = reg & src 0x00000002
> ar r_00 = 2; ar
r_01 = 1; ar r_01
0x00000001
> "R_00 ae, r_01, | ="
|= src, reg O eq reg = reg | src > Ar r_01
0x00000003
> ar r_00 = 2; ar
r_01 = 0xab; ar r_01
0x000000ab
> "Ae r_00, r_01, ^ ="
^= src, reg eq XOR reg = reg ^ src > Ar r_01
0x000000a9
---------------------------
--- --- --- ---
137
ESIL
> "ae
0xLOQUESEA, 0x10000, = [4],"
= [] =
> PXW 4 @ 0x10000
[*] = 0x00010000
[1] = 0xLOQUESEA ....
src, dst meter * Dst = src
[2] =
[4] =
> "Ae 0x0,0x10000, = [4],"
[8]
[] [*]
[1] > "Ae 0x10000, [4],"
0x74736574
[2]
src ojeada apilar = * src
[4]
[8] > Ar r_00 = 0x10000
| = [] | =
[1] | =
>
[2] | = reg nombre código
>
[4] | =
[8]
Escoja n-ésimo
RPICK metro Selección inversa elemento de la base de 0, RPICK
la pila
138
ESIL
eliminar la referencia y
empujar su valor real
paradas ESIL
DESCANSO Descanso DESCANSO
emulación
saltos a enésima
IR norte Ir GOTO 5
palabra ESIL
Detiene la ejecución
(razón: ESIL
QUE HACER Que hacer QUE HACER
expresión no
terminado)
Banderas Esil
ESIL VM tiene un banderas de estado internas que son de sólo lectura y se pueden utilizar para exportar los valores de los indicadores de CPU de destino
subyacentes. Es debido a que la ESIL VM siempre calcula los cambios de pabellón, mientras que las CPU de destino sólo se actualizan las banderas bajo ciertas
segundo - prestado, esto requiere que se especifique de qué bit (ejemplo: $ b4 - Comprueba si borro
w de 4) c bit
o - rebosar
pag - paridad
r - regsize (asm.bits / 8)
s - firmar
[0-9] * - Se utiliza para configurar las banderas y registros sin tener efectos secundarios,
es decir, el establecimiento de esil_cur, esil_old y esil_lastsz. (Ejemplo: "$ 0, de, =" para
Sintaxis y comandos
Un código de operación objetivo se traduce en una lista separada por comas de expresiones esil.
139
ESIL
tamaño del operando por defecto está determinado por el tamaño de destino de la operación.
Los ? operador utiliza el valor de su argumento para decidir si para calcular la expresión entre llaves.
Espacios en blanco, saltos de línea y otros caracteres se ignoran. Así que lo primero cuando se procesa un programa ESIL es eliminar espacios:
Llamadas al sistema necesitan un tratamiento especial. Se indican con '$' al comienzo de una expresión. Puede pasar un valor numérico opcional para
especificar un número de llamada al sistema. Un emulador ESIL debe manejar llamadas al sistema. Ver (r_esil_syscall).
140
ESIL
a, b, - b-a
a, b, / = b/=a
instrucciones especiales
PON están representados como cadenas vacías. Como se dijo anteriormente, llamadas al sistema están marcados por el comando '$'. Por ejemplo, '0x80, $'. Se
emulación de delegados de la máquina ESIL a una devolución de llamada que implementa llamadas al sistema para un OS / kernel específica.
Las trampas se implementan con el TRAMPA mando. Se utilizan para lanzar excepciones de instrucciones no válidas, la división por cero, la memoria
Análisis rápida
Aquí está una lista de algunas comprobaciones rápidas para recuperar información de una cadena ESIL. La información relevante se encuentra
indexOf ( "PC, =") -> modifica contador de programa (rama, salto, llamada) indexOf ( "SP, =") -> modifica la pila (¿y si nos
índice de(":") - > Esil desconocido, código de operación en bruto por delante
Compruebe dstreg
comprobar srcreg
Obtener destinaion Es
salto
Está condicionada
Evaluar
141
ESIL
banderas de CPU normalmente se definen como registros de bits individuales en el perfil RREG. Ellos ya veces encuentran bajo el tipo 'FLG'
registro.
Variables
1. No tienen ancho de bits predefinido. Esta forma en que debe ser fácil de extenderlas a 128, 256 y 512 bits más tarde, por ejemplo, para
3. Los nombres de Registro no tienen una sintaxis específica. Ellos son sólo cadenas.
4. Los números pueden ser especificados en cualquier base de apoyo de rnum (dec, hex, oct, binario ...).
5. Cada backend ESIL debe tener un perfil asociado RREG para describir las especificaciones de registro Esil.
Qué hacer con ellos? ¿Qué pasa con las aritméticas bits si las variables de uso en lugar de registros?
aritmética
1. ADD ( "+")
2. MUL ( "*")
3. SUB ( "-")
4. DIV ( "/")
5. MOD ( "%")
Aritmética bits
1. Y "y"
2. O "|"
3. XOR "^"
4. SHL "<<"
5. SHR ">>"
6. ROL "<<<"
7. ROR ">>>"
8. NEG "!"
142
ESIL
6. ROL "<<<"
7. ROR ">>>"
8. NEG "!"
En el momento de escribir estas líneas, ESIL todavía no soporta la FPU. Pero se puede implementar el soporte para instrucciones no compatibles utilizando
r2pipe. Con el tiempo vamos a obtener el soporte adecuado para aplicaciones multimedia y de punto flotante.
ESIL especifica que los comandos de control de flujo de análisis sintáctico debe estar en mayúsculas. Tenga en cuenta que algunas arquitecturas tienen nombres
de registro en mayúsculas. El perfil de registro correspondiente debe tener cuidado de no volver a utilizar cualquiera de los siguientes:
Ejemplo de uso:
CMPSB representante
! Cx,, {, rotura,}, ESI, [1], EDI, [1], == {,?, rotura,}, esi, ++, EDI, ++, CX, -, 0, IR
Los que se expresan con el comando 'TODO'. Actúan como un 'break', pero muestra un mensaje de advertencia que describe
143
ESIL
r @ Entry0 0x1000010f8
Introspección
Para facilitar el análisis ESIL debemos tener una manera de expresar las expresiones de introspección para extraer los datos que queremos. Por ejemplo,
es posible que desee obtener la dirección de destino de un salto. El analizador de expresiones Esil debe ofrecer una API para que sea posible la
rasgar, =
Necesitamos una manera de recuperar el valor numérico de 'estafa'. Este es un ejemplo muy sencillo, pero hay más compleja, como las condicionales.
destino de un salto
144
ESIL
API ganchos
Es importante para la emulación sea capaz de ganchos de instalación en el analizador, por lo que se puede extender a aplicar el análisis sin tener
que cambiar una y otra vez. Es decir, cada vez que una operación está a punto de ser ejecutado, un gancho de usuario se llama. Se puede utilizar
por ejemplo para determinar si DEP va a cambiar, o si la instrucción actualiza la pila. Más tarde, podemos dividir esa devolución de llamada en
varios más para tener una API análisis eventbased que puede ser extendido en JavaScript como esto:
Para el API en las funciones hook_flag_read (), hook_execute () y hook_mem_read (). Una devolución de llamada debe devolver verdadero o 1 si
desea anular la acción que se necesita. la memoria, por ejemplo, negar lee en una región, o anular la memoria escribe, haciendo
efectiva de sólo lectura. Return false o 0 si desea realizar un seguimiento de expresión ESIL análisis.
Otras operaciones requieren enlaces con funcionalidades externas al trabajo. En este caso, r_ref y r_io.
Io Get / Set
hacha, 44
44, hacha,: ou
ds, eax, =
145
Análisis
Radare2 tiene un muy amplio conjunto de comandos y opciones de configuración para llevar a cabo el análisis de datos y código, para extraer información útil a
partir de un sistema binario, como punteros, referencias de cadenas, bloques básicos, datos de código de operación, destinos de salto, referencias cruzadas y
mucho más. Estas operaciones son manejadas por el una ( analizar) de la familia de comandos:
británico[?] analizar todos (fcns + bbs) (AA0 para evitar sub cambio de nombre)
| ABT [addr] encontrar caminos en el gráfico de la función de desplazamiento actual bb al anuncio dado
vestido
| un [nombre] [@addr] mostrar / renombrar / crear cualquier bandera / función se utiliza en addr | ao [?] [len]
De hecho, una espacio de nombres es una de las más grandes de herramienta radare2 y permite controlar muy diferentes partes del análisis:
cargados
La gestión de diferentes tipos de gráficos, como CFG y gráfico de llamadas Manejo de las
146
Análisis
147
Análisis de código
Análisis de código
análisis de código es una técnica común que se utiliza para extraer información de código de montaje.
Radare2 tiene diferentes técnicas de análisis de código implementados en el núcleo y disponibles en diferentes órdenes.
Mientras el conjunto de funcionalidades de r2 están disponibles con la API, así como el uso de comandos. Esto le da la capacidad de
implementar su propio análisis de bucles utilizando cualquier lenguaje de programación, incluso con oneliners r2, shellscripts, o análisis o plugins
nativos centrales.
El análisis mostrará las estructuras de datos internas para identificar bloques básicos, árboles de funciones y para extraer información a nivel de código de
operación.
La secuencia de comandos análisis radare2 más común es aa, que significa "analizar todos". Que todo se refiere a todos los símbolos
y puntos de entrada. Si se elimina el binario que tendrá que utilizar otros comandos como AAA, AAB, AAR, aac más o menos.
Tómese su tiempo para entender lo que hace cada comando y los resultados después de ejecutar ellos para encontrar la mejor opción para sus necesidades.
[0x08048440]> aa
; - principal: |
148
Análisis de código
|| sym..imp.puts ()
|| sym..imp.abort ()
RAM_ ; 0x0804880c ||
|| sym..imp.puts ()
|| sym..imp.abort ()
\ 0x080486d4 c3 jubilado
En este ejemplo, se analiza todo el archivo ( aa) y luego imprimir el desmontaje de la principal() función ( pdf). los Automóvil club británico comando pertenece
a la familia de los comandos de análisis de automóviles y sólo tendrá la mayor cantidad de pasos básicos de análisis automático. En radare2
hay muchos tipos diferentes de los comandos de análisis automático con una profundidad de análisis diferente, incluyendo emulación parcial: AA,
AAA, AAB, AAAA, ... También hay un mapeo de esas órdenes a las opciones r2 de la CLI: r2 -A, r2 -AA, y así.
Es un sentido común que el análisis totalmente automatizado puede producir resultados no Sequitur, así radare2 proporciona comandos
separados para las etapas particulares del análisis que permite el control de grano fino del proceso de análisis. Por otra parte, hay un
tesoro de variables de configuración para el control de los resultados de análisis. Los puedes encontrar en anal.* y emú.* espacios de nombres
de variables cfg.
Uno de los comandos de análisis más importantes "básicas" es el conjunto de af subcomandos. af significa "función Analizar".
Usando este comando puede o permitir el análisis automático de la función particular o realizar uno completamente manual.
149
Análisis de código
| af + addr nombre [tipo] [diff] arte de la mano una función (requiere AFB +) | AF [addr]
| AFB + FCNA BBA sz [j] [f] ([T] ([d])) añadir bb a la función @ fcnaddr | AFB [?] [dir]
| AFC [LC] ([dir]) @ [dir] calcular los ciclos (AFC) o Ciclomática Complejidad (AFCC) | AFC [?] type @ [dir]
| AFL [l *] [FCN] funciones de lista de nombres (dir, tamaño, bbs, nombre) (ver afll) [?] | nombre del AFM
| AFN [?] nombre [dir] renombrar el nombre de la función en la dirección (indicador de cambio también)
| afo [fcn.name] Dirección del espectáculo para la función llamada como esto
| AFS [STACK_SIZE] establecer el tamaño de marco de pila para la función en la dirección actual
| Afu [addr] cambiar el tamaño y analizar la función de la dirección actual hasta addr
Algunas de las tareas más difíciles mientras realiza un análisis de la función son unir, cortar y cambiar el tamaño. Al igual que con otros
comandos de análisis tiene dos modos: semi-automático y manual. Para el semiautomática, puede utilizar AFM <nombre de función> para
combinar la función actual por el especificado por el nombre como un argumento, aff para reajustar la función después de los cambios de
<Dirección> para hacer el cambio de tamaño y el análisis de la función actual hasta la dirección especificada.
Aparte de esos modos semiautomáticos para editar / analizar la función, puede arte de la mano en el modo manual con af + mando y
editar bloques básicos de la misma utilizando AFB comandos. Antes de cambiar los bloques básicos de la función que se recomienda
[0x00003ac0]> AFB
0x00003ac0 0x00003b7f 01: 001A 191 f 0x00003b7f 0x00003b7f 0x00003b84 00: 0000 5 j 0x00003b92 f
0x00003b84 0x00003b84 0x00003b8d 00: 0000 9 f 0x00003b8d 0x00003b8d 0x00003b92 00: 0000 5
0000 81
150
Análisis de código
Hay dos comandos muy importantes para esto: AFC y AFB. Este último es un comando debe de conocer algunas plataformas como ARM.
Proporciona una manera de cambiar el "valor de bits" de la función en particular. Básicamente, lo que permite seleccionar entre los modos de
pulgar ARM y.
AFC por otro lado, permite especificar manualmente convención de llamada función. Puede encontrar más información sobre su uso
en calling_conventions .
El análisis recursivo
Esos son solamente los algoritmos de búsqueda de referencia semi-automatizados genéricos. Radare2 ofrece una amplia selección de la creación de cualquier
tipo referencias manuales. Para este control de grano fino se puede utilizar hacha comandos.
lista refs
| hacha addr [at] agregar código ref señalando addr (de curseek)
| axc addr [at] añadir ref código genérico | addr AXC [at] añadir código
| axgj [addr] Mostrar conexiones referencias externas para llegar a la función actual en formato JSON
El más utilizado hacha son comandos axt y axf, especialmente como parte de diversos guiones r2pipe. Digamos que vemos la cadena en los datos
o una sección de código y queremos encontrar todos los lugares que se hace referencia desde, debemos utilizar axt:
151
Análisis de código
[0x0001783a]> pd 2; - str.02x:
; - str.src_ls.c:
; STRING XREF de 0x0000543a (sub .__ assert_fail_41f + 27); XREF STRING de 0x00005459 (sub .__
sub.strlen_d50 0x5de0 [STRING] lea rcx, str.02x (nofunc) 0x17838 [CÓDIGO] str.02x
jae
Aparte de algoritmos predefinidos para identificar las funciones que hay una forma de especificar un preludio función con una opción de
RBP, RSP
Configuración
Radare2 permite cambiar el comportamiento de casi cualquier etapas de análisis o comandos. Hay diferentes tipos de opciones de
configuración:
Control de flujo
Dos opciones más comúnmente utilizadas para cambiar el comportamiento de análisis de flujo de control en radare2 son
anal.hasnext y anal.afterjump. El primero permite forzar radare2 para continuar el análisis después del final de la función, incluso si la
siguiente parte del código no fue llamado en cualquier lugar, por lo tanto el análisis
152
Análisis de código
todas las funciones disponibles. Este último permite forzar radare2 para continuar el análisis, incluso después de saltos incondicionales.
Además de los que también podemos establecer anal.ijmp seguir los saltos indirectos, análisis continuo;
anal.pushret analizar empujar ...; jubilado secuencia como un salto; anal.nopskip para omitir las secuencias de NOP en un principio de
función.
Por ahora, radare2 también le permite cambiar el tamaño máximo del bloque básico con anal.bb.maxsize
opción . El valor por defecto simplemente funciona en la mayoría de los casos de uso, pero es útil para aumentar la que, por ejemplo, cuando se trata de código
ofuscado. Ten en cuenta que algunas de las opciones básicas de bloques de control pueden desaparecer en un futuro a favor de formas más automatizado para
configurar los.
Para algunos binarios o metas inusuales, hay una opción anal.noncode. Radare2 no trata de analizar las secciones de datos como un código por defecto. Sin
embargo, en algunos casos -, binarios empaquetados de malware, binarios para sistemas embebidos, a menudo es un caso. Por lo tanto - esta opción.
control de referencia
Las opciones más importantes que cambian drásticamente los resultados del análisis. A veces, algunos se puede desactivar para ahorrar el tiempo y la
Tenga en cuenta que el control de cadenas de referencias está desactivado por defecto, ya que aumenta el tiempo de análisis.
gamas de análisis
anal.limits - permite que los límites del rango para las operaciones de análisis
anal.in - especificar los límites de búsqueda para el análisis ( io.maps, io.sections.exec, dbg.maps
tablas de salto
153
Análisis de código
tablas de salto son uno de los objetivos más difíciles en la ingeniería inversa binaria. Hay cientos de diferentes tipos, el resultado final en función de las
fases del compilador / enlazador y LTO de optimización. Por lo tanto radare2 permite habilitar algunas tablas de saltos de algoritmos de detección
experimentales utilizando anal.jmptbl opción. Con el tiempo, los algoritmos se movieron en el análisis por defecto bucles una vez que empiezan a trabajar en
todas las plataformas / target / caso_prueba compatible. Dos opciones más pueden afectar a las tablas de saltos de análisis de los resultados también:
anal.ijmp - seguir los saltos indirectos, algunas tablas de salto dependen de ellos
anal.datarefs - siga las referencias de datos, algunas tablas de salto utilizan los
Hay dos problemas comunes al analizar objetivos embebidos: / detección del pulgar ARM y MIPS valor GP. En el caso de los binarios de
ARM radare2 soporta algunas detección automática de los interruptores de modo ARM / pulgar, pero cuidado que utiliza la emulación
parcial ESIL, frenando así el proceso de análisis. Si no te gusta el resultado, el modo de funciones particulares se puede reemplazar con AFB
mando.
El problema MIPS GP es aún más difícil. Es un conocimiento básico de que el valor GP puede ser diferente no sólo para todo el programa, sino
también para algunas funciones. Para resolver parcialmente que hay opciones anal.gp
y anal.gp2. El primero establece el valor médico de cabecera para todo el programa o función en particular. Este último permite "constantify" el valor
médico de cabecera si algún código está dispuesto a cambiar su valor, siempre reiniciarlo si el caso. Esos son en gran medida experimental y
visuales
Uno de la forma más fácil de ver y comprobar los cambios de los comandos de análisis y las es llevar a cabo un desplazamiento en una vv el modo visual
Cuando queremos comprobar cómo los cambios afectan el resultado del análisis en el caso de las grandes funciones, podemos utilizar minimapa lugar, lo que permite
ver un gráfico de flujo más grande en el mismo tamaño de pantalla. Para entrar en el modo de tipo mini mapa VV entonces presione pag dos veces:
154
Análisis de código
Este modo le permite ver el desmontaje de cada nodo separado, simplemente navegar entre ellas el uso de
Lengüeta llave.
consejos de análisis
No es un caso poco común de que los resultados del análisis no son perfectos, incluso después de que ha intentado todas las opciones de configuración única. Aquí es
donde el "indicios de análisis" mecanismo de radare2 entra en acción. Permite para anular algunas de las propiedades básicas de código de operación o
meta-información, o incluso volver a escribir toda la cadena de código de operación. Estos comandos se encuentran debajo ah espacio de nombres:
155
Análisis de código
| ahi [?] 10 definir base numérica para immediates (1, 8, 10, 16, s)
Uno de los casos más comunes es la de establecer una base numérica particular para immediates:
| Ahi Uso [sbodh] [@ compensados] Definir base numérica | ahi [base] establecer base
[0x00003d54]> pd 2 0x00003d54
[0x00003d54]> ahi d
[0x00003d54]> pd 2 0x00003d54
[0x00003d54]> ahi b
[0x00003d54]> pd 2 0x00003d54
156
Análisis de código
Es notable que algunas etapas de análisis o comandos agregan los consejos de análisis internos, que se pueden comprobar con ah mando:
[0x00003d54]> ah
ahi 2 @ 0x3d54
A veces tenemos que anular salto o dirección de llamada, por ejemplo en caso de reubicación complicado, que es desconocida para radare2, por lo
tanto podemos cambiar el valor manualmente. El análisis de la información actual acerca de un código de operación particular, se puede comprobar con ao
mando. Nosotros podemos usar AHC comandos para realizar tal cambio:
157
Análisis de código
[0x00003cee]> pd 2 0x00003cee
ciclos de llamadas: 3
dirección: exec fallan: 0x00003cf3 pila: Familia nulo: cpu stackop: null
pd 2 0x00003cee
ciclos de llamadas: 3
dirección: exec fallan: 0x00003cf3 pila: Familia nulo: cpu stackop: null
[0x00003cee]> ah
158
Análisis de código
Como se puede ver, a pesar del desmontaje sin cambios ver la dirección de salto de código de operación se ha cambiado ( saltar opción).
Si algo de la descrita anteriormente no ayuda, puede simplemente anular desmontaje se muestra con todo lo que quieras:
[0x00003d54]> pd 2 0x00003d54
0x00003d54
159
Variables
Radare2 permite que las variables locales que administran, sin importar su ubicación, pila o registros. El análisis automático de las variables está habilitada
en el
depurador
afvr, afvb y AFV comandos son uniformes pero permiten la manipulación de argumentos basados en registros y variables, argumentos y
variables basadas en FP BP / y argumentos basados en SP y variables respectivamente. Si comprobamos la ayuda de afvr obtendremos la
Al igual que muchas otras cosas variables de detección se realiza por radare2 de forma automática, pero los resultados se puede cambiar con esos
argumentos / variables controlan los comandos. Este tipo de análisis se basa principalmente en los prototipos de funciones precargados y la
convención de llamada, por lo tanto símbolos de carga puede mejorarlo. Por otra parte, después de cambiar algo que puede volver a ejecutar el
análisis de las variables con AFVA mando. Muy a menudo el análisis de las variables se acompaña con análisis tipos , ver afta mando.
160
Variables
El aspecto más importante de la ingeniería inversa - nombrar las cosas. Por supuesto, puede renombrar variables también, que afecta a todos
los lugares que se hace referencia. Esto se puede lograr con AFVN para alguna tipo de argumento o variable. O simplemente puede eliminar la
Como se mencionó antes del bucle análisis se basa en gran medida de la información en el desempeño de tipos etapas de análisis de variables. De
este modo viene a continuación comando muy importante - afvt, lo que le permite cambiar el tipo de variable:
[0x00003b92]> AFV
var int local_8h @ RSP + 0x8 var int local_10h @ RSP + 0x10
0x30 var int local_32h @ RSP + 0x32 var int local_38h @ RSP
RSP + 0x46 var int local_47h @ RSP + 0x47 var int local_48h
[0x00003b92]> AFV
0x48
distinción entre las variables que se lee y se escribe - función, que todavía está en fase de desarrollo pesada utiliza con menos frecuencia. Se
pueden listar los que están siendo leídos con afvR mando y los que están siendo escritos con afvW mando. Ambos comandos proporcionan una
161
Variables
0x48ee
0x50cc
local_38h 0x52d3,0x531b
local_46h
La inferencia de tipos
La inferencia de tipos de variables y argumentos locales está bien integrado con el comando afta.
162
Variables
[0x000007aa]> pdf |
;-- principal:
; 0x8d4; "Hola"
[0x000007aa]> afta
;-- Dep:
str.Hello
; 0x8d4; "Hola"
; const char * s
163
Variables
También extrae información de tipo de cadenas de formato como printf ( "fmt:% s,% u,% d", ...), las especificaciones de formato se
Se puede crear un nuevo perfil para especificar un conjunto de caracteres de formato en función de diferentes bibliotecas / sistemas operativos /
Win = especificación
A continuación, cambiar su especificación predeterminada por una recién creada utilizando esta variable de configuración e = anal.spec victoria
Para obtener más información acerca de los tipos primitivos y definidos por el usuario apoyar en radare2 consulte tipos capítulo.
164
tipos
tipos
Radare2 apoya la C-sintaxis Descripción tipos de datos. Esos tipos son analizados por un analizador compatible-C11 y se almacenan en la
[0x000051c0]> t?
| tp <tipo> [addr | code] arrojado datos en <dirección> a <tipo> e imprimirlo | tpx <type> <hexpairs>
Tenga en cuenta que los (atómicos) tipos básicos no son los de la norma C - No char, _Bool, o corto .
Debido a que esos tipos pueden ser diferentes de una plataforma a otra, radare2 usos definido tipos similares,
int8_t o uint64_t y convertirá En t a int32_t o int64_t dependiendo de la plataforma / compilador binario o depurado.
tipos básicos se pueden enumerar utilizando t mando, para los tipos estructurados es necesario utilizar ts, ma o Te
para enumeraciones:
165
tipos
* int
int16_t
int32_t
int64_t int8_t
larga
largo largo
. . .
tipos de carga
archivo> Abrir un comando $ EDITOR para escribir las definiciones en su lugar usando a -
[0x000051c0]> "td struct foo {char * a; int b;}" [0x000051c0]> cat ~ / radare2-regresiones / contenedores
int z; };
También cuenta que hay una opción de configuración para especificar directorios de inclusión para los tipos de análisis sintáctico
[0x00000000]> e ~ ?? dir.type
dir.types: Ruta predeterminada para buscar archivos de tipo cparse [0x00000000]> e dir.types /
usr / include
tipos de impresión
Aviso A continuación hemos utilizado ts comando, que básicamente convierte la descripción de tipo C (o para ser más precisos que es la
166
tipos
los tp comando utiliza el PF cadena para imprimir todos los miembros de tipo en la actual dirección de desplazamiento / dada:
[0x000051c0]> ts foo pf zd a b
b: 0x000051cc = 10
'mundo' b: 0x000053cc = 20
También, usted podría llenar sus propios datos en la estructura e imprimirlo usando TPX mando
0x000051cc = 16
los tp orden de la misma realiza una conversión temporal. Pero si queremos enlazar alguna dirección o variable con el tipo elegido, podemos
167
tipos
(S1)
Una vez que la estructura está vinculada, radare2 trata de propagar desplazamiento en la función en la estructura actual de compensación, para ejecutar este programa
de análisis en su totalidad o en cualquiera de las funciones previstas después de todas las estructuras están vinculados usted tiene
taa mando:
Nota veces la emulación puede no ser exacta, por ejemplo, de la siguiente manera:
edi, 0x20
; "@"
QWord [local_8h]
El valor de retorno de malloc pueden diferir entre dos emulaciones, así que hay que establecer el valor de retorno sugerencia para utilizar manualmente Ahr de
comandos, así que corre tl o taa de comandos después de instalar la pista valor de retorno.
168
tipos
estructura Immediates
Hay un aspecto más importante del uso de tipos de radare2 - usando ejército de reserva se puede cambiar el código de operación inmediata en el que la estructura de
[0x000052f0]> pd 1 0x000052f0
aquí 8 - se compensó en cierta medida en la memoria, en donde RSI Probablemente produce algún puntero estructura. Imaginemos que tenemos las siguientes
estructuras
[0x000052f0]> "ms struct td {char [8] b; int miembro1; int member2;};" [0x000052f0]> "td estructura MS1 {uint64_t a; int
Ahora tenemos que configurar en lugar de compensar el buen miembro de estructura 8 En esta instrucción. En un primer momento, necesitamos una lista de tipos
ms1.member1
Tenga en cuenta que MS2 no aparece en la lista, ya que no tiene miembros con desplazamiento 8. Después de enumerar las opciones disponibles podemos vincularlo a los
1 0x000052f0
169
tipos
Representación interna
Para ver la representación interna de los tipos que se pueden utilizar tk mando:
[0x000051c0]> tk ~ S1 S1 = struct
struct.S1 = x, y, z
struct.S1.z.meta = 0 [0x000051c0]>
Definición de tipos primitivos requiere una comprensión básica de PF formatos, usted puede encontrar toda la lista de especificador de formato de PF ?? :
170
tipos
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| formato | explicación |
| ------------------------------------------------- - | | segundo
|z | \ 0 cadena terminada |
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
hay básicamente 3 llaves obligatorias para la definición de los datos básicos tipos: X = Tipo
type.X = format_specifier type.X.size = size_in_bits Por ejemplo, vamos a definir UNIDAD, de acuerdo a
documentación de microsoft .aspx # UINT) UINT es sólo equivalente de la norma C unsigned int ( o
UINT = tipo
type.UINT = d
type.UINT.size = 32
X.type.pointto = Y
Éste sólo se puede utilizar en caso de puntero type.X = p, Un buen ejemplo es la definición LPFILETIME, es un puntero a _ FILETIME que
pasa a ser una estructura. Suponiendo que estamos apuntando única máquina Windows de 32 bits, que se define como la
siguiente:
type.LPFILETIME.size = 32
type.LPFILETIME.pointto = _FILETIME
171
tipos
Este último campo no es obligatorio porque a veces las partes internas de estructura de datos serán de propiedad, y no vamos a tener una
type.UINT.meta = 4
Esta entrada es para la integración con C analizador y lleva la información de la clase tipo: tamaño entero, firmado / unsigned, etc.
estructuras
Esas son las claves básicas para estructuras (con sólo dos elementos):
X = struct struct.X = a,
b_number_of_elements
La primera línea se utiliza para definir una estructura llamada X , la segunda línea define los elementos de X como valores separados por comas. Después de eso, lo
_FILETIME struct {
dwHighDateTime; }
_FILETIME = struct
Tenga en cuenta que el número de elementos archivados se utiliza en el caso de las matrices sólo para identificar cuántos elementos hay en matrices, aparte de
sindicatos
172
tipos
Los sindicatos se definen exactamente como estructuras, la única diferencia es que va a sustituir la palabra struct
prototipos de funciones
representación prototipos de las funciones es el más orientado al detalle y el más importante de todos ellos. En realidad, esta es la que se utiliza
X = func
ARG_TYPE, arg_name
calling_convention
Debe explicarse por sí mismo. Vamos a hacer strncasecmp como un ejemplo de la arquitectura x86 para máquinas Linux. De acuerdo con las páginas
int strcasecmp (const char * s1, const char * s2, size_t n);
strcasecmp = func
func.strcasecmp.args = 3
func.strcasecmp.arg0 = char *, s1
func.strcasecmp.arg1 = char *, s2
Tenga en cuenta que la . cc parte es opcional y si no existiera el valor por defecto de llamadas de convención para su arquitectura objetivo se utiliza
Esta clave se utiliza para marcar las funciones que no volverá una vez llamados, como salida y _ salida .
173
tipos
174
convenciones de llamada
convenciones de llamada
Radare2 utiliza convenciones de llamada para ayudar en la identificación de la función argumentos formales y tipos de retorno. Se utiliza también como una guía
[AGL?]
| AFC convención establece manualmente el convenio de llamada para la función actual | AFC
[0x00000000]>
Para una lista de todas las convenciones de llamada disponibles para la arquitectura actual utilizando AFCL mando
Para mostrar la función prototipo de las funciones de la biblioteca estándar que tiene AFCF mando
Toda esta información se carga a través de SDB en / LiBr / anal / d / cc- [arco] - [bits de] .sdb
default.cc = amd64
ms = cc
cc.ms.name = ms
cc.ms.arg1 = rcx
cc.ms.arg2 = RDX
cc.ms.arg3 = r8
cc.ms.arg3 = r9
cc.ms.argn = pila
cc.ms.ret = rax
175
convenciones de llamada
cc.x.argi = rax se utiliza para establecer el argumento i de esta convención de llamada para registrar el nombre rax
cc.x.argn = pila significa que todos los argumentos (o el resto de ellos en caso de que hubiera Argi para cualquier i como número de seguimiento) será
cc.x.argn = stack_rev igual que cc.x.argn = pila a excepción de que significa argumento se pasan de derecha a izquierda
176
Las tablas virtuales
Hay un soporte básico de tablas virtuales análisis sintáctico (RTTI y otros). Lo más importante antes de empezar a realizar este tipo de
Todos los comandos para trabajar con tablas virtuales se encuentran en el AV espacio de nombres. Actualmente, el soporte es muy básico, lo que le permite sólo para
| avr [j @ addr] intenta analizar RTTI en addr vtable (ver anal.cpp.abi) | avra [j]
Los principales comandos aquí están AV y AVR. AV enumera todas las tablas virtuales que se encuentran cuando R2 abre el archivo. Si no está satisfecho
con el resultado puede que desee para tratar de analizar mesa virtual en una dirección particular con avr mando. Avra realiza la búsqueda y el análisis de
todas las tablas virtuales en el binario, como r2 hace durante la apertura de archivos.
177
llamadas al sistema
llamadas al sistema
Radare2 permite la búsqueda manual de código ensamblador que parece una operación de llamada al sistema. Por ejemplo en la plataforma ARM
generalmente están representados por la SVC instrucción, en los demás puede ser una diferente
[0x0001ece0]> / c SVC
. . .
. . .
detección de llamadas al sistema es accionado por asm.os, asm.bits, y asm.arch. Asegúrese de configurar los
opciones de configuración en consecuencia. Puedes usar asl comando para comprobar si el soporte para llamadas al sistema está configurado correctamente y según lo
[0x0001ece0]> asl
. . .
. . .
Si la configuración de apilarlas con ESIL AEI o AEIM, puedes usar / como mandar a buscar las direcciones donde se encontraron llamadas al sistema en
[0x0001ece0]> AEI
[0x0001ece0]> / as
. . .
Para reducir el tiempo de búsqueda es posible restringir la búsqueda rango para sólo segmentos ejecutables o secciones con / como
Utilizando la emulación ESIL radare2 puede imprimir argumentos syscall en la salida de desmontaje. Para permitir que el lineal (pero muy áspera) el
178
llamadas al sistema
En el caso de la ejecución AAE ( o AAAA que llama AAE) radare2 comando empujará encontrado llamadas al sistema a un especial syscall. flagspace,
[0x000187c2]> fs 0
0 * 1 importaciones
[0x000187c2]> f ~ syscall
. . .
. . .
También se puede navegar de forma interactiva a través dentro del modo de HUD ( V_)
0> syscall.sd_ble_gap_disconnect
syscall.sd_ble_gap_disconnect.3
179
Emulación
Emulación
Una de las cosas más importantes a tener en cuenta en la ingeniería inversa es una diferencia básica entre el análisis estático y análisis
dinámico. Como muchos ya saben, el análisis estático sufre del problema de explosión de ruta, lo cual es imposible de resolver, incluso en
Así, muchas herramientas profesionales de ingeniería inversa utilizan la emulación de código mientras se realiza un análisis de código binario, y
Para la emulación parcial (o emulación completa imprecisa) radare2 utiliza su propio ESIL lenguaje intermedio y la máquina virtual.
Radare2 apoya este tipo de emulación parcial para todas las plataformas que implementan ESIL edificante (x86 / x86_64, ARM,
Uno de los usos más comunes de este tipo de emulación es calcular saltos indirectos y saltos condicionales.
Para ver la representación ESIL del programa se puede utilizar el ao ordenar o permitir que el asm.esil
variable de configuración, para comprobar si el programa levantada correctamente, y para comprender cómo funciona ESIL:
180
Emulación
[0x00001660]> pdf
. (FCN) fcn.00001660 40 │
fcn.00001660 (); │
<0x00001675 je 0x1690
│ │ 0x00001677 mov rax, QWord [reloc._ITM_deregisterTMCloneTable]; [0x206fd8: 8] RBP = 0 │ │ 0x0000167e rax prueba, rax │.── <0x00001681 je
0x1690 │││ 0x00001683 pop RBP │││ 0x00001684 JMP rax │``─> 0x00001690 pop `
ret 0x00001691
. (FCN) fcn.00001660 40 │
fcn.00001660 (); │
0x0000166f RDI, rax, ==, $ z, ZF, =, $ b64, cf, =, $ p, PF, =, $ s, sf, =, $ O, de, = │
│ │ 0x0000167e 0, rax, rax, y, ==, $ z, zf, =, $ p, pf, =, $ s, sf, =, $ 0, cf, =, $ 0, de, = │.── <0x00001681 zf,? {, 5776, RIP, =,} │││
Para configurar manualmente la emulación imprecisa ESIL necesita ejecutar esta secuencia de comandos:
AEIP para establecer el VM IP inicial ESIL (puntero de instrucción) una secuencia de aer comandos
Mientras se realiza la emulación, por favor recuerde, que ESIL máquina virtual no puede emular las llamadas externas o llamadas al sistema,
junto con instrucciones SIMD. Así, el escenario más común es emular sólo una pequeña porción del código, como el cifrado / descifrado,
181
Emulación
Después de configurar correctamente la ESIL VM podemos interactuar con él como con un modo de depuración de costumbre. interfaz de
aesue <expresión ESIL> al paso hasta que alguna expresión ESIL especificado cumplido
AEC continuar hasta la rotura (Ctrl-C), éste se utiliza muy poco, sin embargo, debido a la omnipresencia de llamadas externas
En el modo visual, todas las teclas de acceso rápido de depuración va a funcionar también en modo de emulación ESIL.
Junto con la emulación de costumbre, hay una posibilidad de que el modo de grabación y reproducción:
Más acerca de este modo de funcionamiento se puede leer en Depuración inversa capítulo.
Aparte del modo de emulación manual, que puede ser utilizado de forma automática en el bucle de análisis. Por ejemplo, el AAAA comando
realiza la etapa de emulación ESIL bien con los demás. Para activar o desactivar su uso puede utilizar anal.esil variable de configuración.
Hay una opción más importante, aunque estableciendo que podría ser muy peligroso, especialmente en el caso de malware - emu.write que
permite ESIL VM para modificar la memoria. A veces se requiere, sin embargo, especialmente en el proceso de desembalaje
deobfuscating o código.
Para mostrar el proceso de emulación puede establecer asm.emu variable, que mostrará los valores de registro y memoria calculados en los
comentarios de desmontaje:
182
Emulación
. (FCN) fcn.00001660 40 │
fcn.00001660 (); │
0x00001660 lea RDI, obj .__ progname; 0x207220; RDI = 0x207220 -> 0x464c457f │
│ 0x00001668 lea rax, obj .__ progname; 0x207220; rax = 0x207220 -> 0x464c457f │
0x0000166f cmp rax, RDI ; ZF = 0x1 -> 0x2464c45; cf = 0x0; PF = 0x1 -> 0x2
│ │ rax prueba 0x0000167e, rax ; ZF = 0x1 -> 0x2464c45; PF = 0x1 -> 0x2464c45;
x0
│``─> 0x00001690 RBP pop ; RBP = 0x10102464c457f; RSP = 0x8 -> 0x464c457f
Nota aquí probable comentarios, lo que indica que la emulación ESIL previsto para determinado salto condicional a suceder.
Además de la configuración básica ESIL VM, puede cambiar el comportamiento con otras opciones ubicadas en emú.
Para la manipulación de ESIL trabajar con la memoria y la pila puede utilizar las siguientes opciones:
esil.fillstack y esil.stack.pattern le permite usar un vario patrón para el llenado pila ESIL VM en la inicialización
esil.nonull cuando se fija detiene la ejecución ESIL al puntero NULL leer o escribir.
183
información de símbolos
símbolos
Radare2 analiza automáticamente las importaciones disponibles y exporta secciones en el binario, sino que, además, se puede cargar información adicional de
depuración si está presente. Dos formatos principales son compatibles: enano y AP (para los binarios de Windows). Tenga en cuenta que, a diferencia de muchas
herramientas radare2 no se basa en la API de Windows para analizar archivos PDB, por lo que se pueden cargar en cualquier otra plataforma apoyado - por
ejemplo, Linux o OS X.
cargas de información de depuración DWARF automáticamente por defecto porque por lo general se almacena justo en el archivo ejecutable. PDB es un poco de
un animal diferente - siempre se almacena como un binario independiente, así la diferente lógica de manipulación.
Al principio, uno de los escenarios más comunes es analizar el archivo de distribución de Windows. En este caso, todos los archivos de AP están disponibles en el
servidor de Microsoft, que por defecto se encuentra en las opciones. Ver todas las opciones pdb en radare2:
pdb.autoload = 0 pdb.extract
=1
Microsoft-Símbolo-Servidor / 6.11.0001.402
El uso de la variable pdb.server se puede cambiar la dirección donde radare2 intentará descargar el archivo PDB por el GUID almacenado en la cabecera del
ejecutable. Por lo general, no hay ninguna razón para cambiar de forma predeterminada
Porque esos archivos PDB se almacenan como archivos "Cab" en el servidor, pdb.extract = 1 dice que
extraer automáticamente.
Tenga en cuenta que para la descarga automática funcione es necesario función "cabextract", y wget / rizo instalados.
A veces no es necesario hacerlo desde el radare2 en sí, por lo tanto - dos opciones rabin2 prácticos:
dónde - PÁGINAS descarga automáticamente el AP para el binaria seleccionada, utilizando los pdb. * opciones de configuración.
- PAG volcará el contenido del archivo PDB, que es útil a veces para una rápida comprensión de los símbolos
almacenados en ella.
184
información de símbolos
Aparte del escenario básico de sólo abrir un archivo, información de AP puede ser, además, manipulado por el carné de identidad comandos:
[0x000051c0]> ID?
Dónde IDPI es básicamente el mismo que rabin2 -P. Tenga en cuenta que IDP también se puede utilizar no sólo en el modo de análisis estático, sino también en el
Para simplificar las PDBs de carga, especialmente para los procesos con muchos archivos DLL vinculados, radare2 puede cargar automáticamente todas
PDBs requerida de forma automática - Sólo se necesita establecer el e pdb.autoload = true opción. A continuación, si se carga algún archivo en el modo de
depuración en Windows, usando file.exe r2 -d o r2 -d 2345 ( se unen a pid 2345), todos los archivos PDB relacionados serán cargados automáticamente.
DWARF de carga de información, por otra parte, es completamente automatizado. No es necesario para ejecutar cualquier comando / cambiar ningún
parámetro:
r2 `que rabin2`
[1];
[2];
0x00002447 lea RDI, obj .__ dso_handle; 0x207c40; "@ |" Llamada 0x2360 0x0000244e
[3];
0x00002458 byte mov [obj.completed.6991], 1; obj .__ TMC_END__; [0x2082f0: 1] = 0 0x0000245f pop RBP 0x00002460 ret
185
información de símbolos
RSP, 0x10
[7];
; section_end.ehdr
0x000024b0 lea RDI, str._s_2.1.0_git__d ___ linux_x86__d_git._s_n; 0x60d0; "% S 2.1.0-gi t% d @ linux-x86% d git.% S \ n" mov eax 0x000024b7, 0 0x000024bc
llamada 0x2350
[8];
0x24d6 [9];
0x000024ca RDI lea, str.commit: _f1aa3aa4d2599c1ad60e3ecbe5f4d8261b282385_build: _2017_11 _06__12: 18: 39; ../blob/version.c:26; 0x60f8;
[?]
; .//rabin2.c:27
Como se puede ver, se carga nombres de las funciones y la información de línea de origen.
186
firmas
firmas
Radare2 tiene su propio formato de las firmas, lo que permite tanto la carga / aplicar y crear sobre la marcha. Están disponibles bajo la z comando
de espacio de nombres:
[0x000100b0]> z?
Mostrar zignatures
Para cargar el archivo de la firma creada tiene que cargar desde un archivo usando SDB zo comandos o desde el archivo comprimido con
Para crear la firma que necesita para hacer la función en primer lugar, a continuación, se puede crear a partir de la función:
r2 / bin / ls
[0x000051c0]> aaa # esto crea funciones, entre ellas 'Entry0' [0x000051c0]> ZAF Entry0 entrada [0x000051c0]>
z de entrada:
. . . . . f4
0x000051c0 [0x000051c0]>
Como se puede ver se hizo una nueva firma con un nombre entrada de una función Entry0. Se puede mostrar en formato JSON también, que puede ser útil
187
firmas
[0x000051c0]> zj ~} {[
"Name": "entrada",
. . . . . . . . . . f4" ,
"gráfico": {
"1"},
"Compensación": 20928
"árbitros": []}]
[0x000051c0]>
Para eliminar esto justamente se z-entrada Pero si desea guardar todas las firmas creadas, es necesario guardarlo en el archivo de comandos usando
SDB myentry zos. Entonces podemos aplicarlas. Vamos a abrir un archivo nuevo:
r2 / bin / ls
. . . . . f4
0x000051c0 [0x000051c0]>
Esto significa que las firmas se cargan correctamente desde el archivo myentry y ahora podemos buscar funciones coincidentes:
[0x000051c0]> ZC
función resultados: 1
[0x000051c0]>
188
firmas
Tenga en cuenta que ZC solo comando comprueba las firmas en contra de la dirección de la corriente. Para buscar firmas a través del archivo de todos los que
tenemos que hacer una cosa poco diferente. No es un momento importante, sin embargo, si lo ejecutas "tal cual" - no lo puedo encontrar nada:
[0x000051c0]> z /
Hits: 0
[0x000051c0]>
Tenga en cuenta la dirección de la búsqueda - esto es porque necesitamos ajustar la búsqueda variar primero:
función resultados: 1
[0x000051c0]>
Estamos estableciendo el modo de búsqueda io.section ( era expediente por defecto) para buscar en la sección actual (suponiendo que estamos actualmente
en el . texto sección por supuesto). Ahora podemos comprobar, lo radare2 encontrado por nosotros:
[0x000051c0]> pd 5; - Entry0:
; - sign.bytes.entry_0: 0x000051c0
[0x000051c0]>
Aquí podemos ver el comentario de Entry0, que se toma de la análisis sintáctico ELF, sino también la
189
firmas
190
gráfico comandos
gráfico comandos
Al analizar los datos por lo general es útil tener diferentes formas de representarlo con el fin de obtener nuevas perspectivas para permitir al
Que representan bordes de los bloques básicos, llamadas a funciones, referencias de cadena como gráficos muestran una visión muy clara de esta información.
Radare2 soporta varios tipos de gráfico disponible a través de comandos empezando con AG:
[0x00005000]> ag?
| agc [formato] [FCN addr] callgraph función | AGF [formato] [FCN addr] básicos bloques de
| agr [formato] [FCN addr] Referencias gráfico | aga [formato] [FCN addr] Referencias
de datos gráfica | AGD [formato] [FCN addr] Dif gráfico | AGI [formato]
| re punto graphviz
|k SDB-valor de la clave
|* comandos r2
Por ejemplo, IGDA Muestra el gráfico importaciones en formato de punto, mientras aggj da salida a la gráfica personalizada en formato JSON.
191
gráfico comandos
Muestra el gráfico directamente a la salida estándar utilizando el arte ASCII para representar bloques y bordes.
Advertencia: se presentan grandes gráficos directamente a la salida estándar podría llegar a ser computacionalmente caro y hará que R2 no
responde por algún tiempo. En caso de duda, prefieren utilizar la vista interactiva (explicado más adelante).
Muestra el gráfico ASCII en una vista interactiva similar a VV que permite mover la pantalla, hacer zoom in / zoom out, ...
Muestra el gráfico ASCII directamente a la salida estándar en el modo de pequeña (que es el mismo que el de alcanzar el zoom máximo nivel en la
vista interactiva).
Imprime el código fuente punto que representa el gráfico, que puede ser interpretado por programas como
En el caso de la F formato (bloques básicos de la función), se tendrá información detallada sobre la función y tendrá
En todos los demás casos, sólo tendrá información básica sobre los nodos del grafo (ID, el título, el cuerpo, y los bordes).
Imprime el código fuente GML que representa el gráfico, que puede ser interpretado por programas como yEd
192
gráfico comandos
Grabados cadenas de valores clave que representan el gráfico que fue almacenada por SDB (base de datos de cadena de radare2).
Prints R2 comandos que recrear el gráfico deseado. Los comandos para construir el gráfico se
AGN [title] [cuerpo] añadir un nodo y la edad [título1] [title2] para agregar un borde. Los [ cuerpo] campo se puede expresar en base64 para
Para ejecutar los comandos fácilmente impresos, es posible anteponer un punto al comando ( . AGF *).
Radare2 convertirá el gráfico en formato de punto, utilice el punto programa para convertirlo en una . gif imagen y luego tratar de encontrar
La extensión de la imagen de salida se puede ajustar con el graph.extension variable de configuración. Extensiones disponibles son png,
Nota: debido a que grandes gráficos, la extensión más recomendada es SVG ya que producirá imágenes de tamaño mucho más pequeño
Si graph.web variable de configuración está habilitada, radare2 tratará de mostrar el gráfico usando el navegador ( esta característica es experimental y
193
scripting
scripting
Radare2 ofrece un amplio conjunto de una serie de características para automatizar el trabajo aburrido. Se extiende desde la simple secuenciación
de los comandos a los guiones de llamada / otros programas a través de IPC (comunicación entre procesos), llamados r2pipe.
Como se ha mencionado un par de veces antes de que haya una capacidad de secuenciar comandos usando; operador de punto y coma.
[0x00404800]> pd 1; ao 1
Dirección: 0x404800
5 Tipo: mov
Simplemente ejecuta el segundo comando después de terminar la primera, como en una concha.
ao | dirección de grep
Nota, la | tubo solamente puede dar salida a la tubería de r2 manda externa (shell) comandos, como programas de sistema o comandos shell
incorporado. Hay una manera similar a la secuencia de la R2 comandos, usando el operador de comilla invertida ` command`. La parte citada se
someterá a la sustitución de comandos y la salida será utilizado como un argumento de la línea de comandos.
Por ejemplo, queremos ver unos pocos bytes de la memoria en la dirección mencionada por el 'mov eax, addr' instrucción. Podemos hacer eso
194
scripting
[0x00404800]> pd 1
0x404800
5 Tipo: mov
nulo: cpu
tab..inter
[0x00404800]>
Y por supuesto que es posible redirigir la salida de un comando r2 en un archivo, utilizando el > y >> comandos
>> example.txt
los PS comando describe varias variables votos que puede utilizar para hacer acciones similares, incluso con mayor facilidad, como el $ v " valor inmediato"
195
bucles
bucles
Una de las tareas más comunes en la automatización es un bucle a través de algo, hay varias maneras de hacer esto en radare2.
[0x004047d6]> afi
0x004047d0 42 realsz: 42
StackFrame: 0
llamar-convención: amd64
ciclomática-complejidad: 1 bits: 64
llamar-refs: 0x00402450 C
[0x004047d6]>
Ahora vamos a decir, por ejemplo, que nos gustaría ver a un campo particular de esta salida para todas las funciones que se encuentran por el análisis. Podemos hacer
eso con un bucle para todas las banderas de función (cuyos nombres comienzan con FCN. ):
Este comando extraerá el nombre ámbito de la AFI salida de cada marca con un nombre que coincida con la expresión regular FCN. *.
196
bucles
También podemos bucle sobre una lista de desplazamientos, utilizando la siguiente sintaxis:
@@ = 1 2 3 ... N
Por ejemplo, decimos que queremos ver la información de código de operación para 2 compensaciones: el actual, y al actual + 2:
[0x004047d6]> ao @@ = $$ $$ + 2 Dirección:
[0x004047d6]>
Tenga en cuenta que estamos usando el $$ variable que se evalúa como el desplazamiento actual. También tenga en cuenta que $$ + 2 se evalúa antes de bucle, por lo
Una tercera forma de bucle es por tener los desplazamientos pueden cargar desde un archivo. Este archivo debe contener un desplazamiento por línea.
197
bucles
RDX
radare2 también ofrece diversas para cada construcciones para bucle. Uno de los más útiles es de bucle a través de todas las instrucciones de
una función:
Entry0 42
xor ebp, mov ebp │0x004047d2 r9, RDX │0x004047d5 RSI pop │0x004047d6
0A..AVI..AUI.
198
bucles
En este ejemplo, el comando PI 1 corre sobre todas las instrucciones de la función actual (Entry0). Hay otras opciones (lista no
@@ k sdbquery - iterar sobre todos los desplazamientos devueltos por que sdbquery
@@segundo - iterar sobre todos los bloques básicos de la función actual (ver AFB)
El último tipo de bucle que permite recorrer los tipos predefinidos de iterador:
Símbolos de las
importaciones
registra hilos
comentarios
banderas
funciones
Esto se hace mediante el @@@ mando. El ejemplo anterior de la inclusión de información sobre las funciones también se puede hacer uso de la
@@@ mando:
Esto extraerá nombre campo de AFI producción y dará salida a una gran lista de nombres de función. Podemos elegir sólo la segunda
199
macros
macros
Aparte de secuenciación simple y bucle, radare2 permite escribir macros simples, usando esta construcción:
Esto va a definir una macro llamada 'qwe' que se extiende secuencialmente primero 'pd 4' y luego 'ao'. Llamando a la macro utilizando la sintaxis . ( macro) es
simple:
(Qwe)
RSP
Dirección: 0x404800
5 Tipo: mov
[0x00404800]> (* (qwe, pd 4,
ao)
Y si quieren eliminar algunos macro, sólo tiene que añadir '-' antes del nombre:
eliminado. [0x00404800]>
200
macros
Por otra parte, es posible crear una macro que toma argumentos, que viene muy bien en algunas situaciones de secuencias de comandos simples.
Para crear una macro que toma argumentos simplemente añadirlos a la definición de macro. Sin duda, si estás usando personajes como ';', por citar
[0x00404800]
Entry0:. 0x004047d0
[0x004047d6]>
Como se puede ver, los argumentos son nombrados por el índice, a partir de 0: 0 $, $ 1, ...
201
R2pipe
R2pipe
La API r2pipe fue diseñado inicialmente para NodeJS con el fin de apoyar la reutilización de API r2.js de la web desde la línea de comandos. Los
permisos módulo r2pipe que interactúan con las instancias de R2 en diferentes métodos:
TCP (R2-c)
nodejs X X X X X -X
pitón X X - X X xx
rápido X X X X - -X
punto net X X X X - - -
Haskell x X - X - -X
Java - X - X - - -
golang X X - - - -X
rubí X X - - - -X
moho X X - - - -X
vala - X X - - - -
Erlang X X - - - - -
newLISP x - - - - - -
dlang X - - - - -X
perl X - - - - - -
Ejemplos de
Python
importar r2pipe
r2 = r2pipe.open ( "/ bin / ls" ) R2.cmd ( 'Automóvil club británico' () de impresión (r2.cmd "AFL" )) de impresión (r2.cmdj
202
R2pipe
NodeJS
r2pipe const = require ( 'r2pipe'); r2pipe.open ( '/ bin / ls', (err, res) =>
función (o) {
console.log (o);
r.quit ()
}); });
});
https://github.com/radare/radare2-r2pipe/blob/master/nodejs/r2pipe/README.md
Ir
$ R2pm -i r2pipe-go
https://github.com/radare/r2pipe-go
paquete principal
importar (
"FMT"
"Github.com/radare/r2pipe-go"
203
R2pipe
func principal() {
Si err! = nulo {
pánico (Err)}
Si err! = nulo {
pánico (Err)}
fmt.Println (buf1)}
Moho
$ Cat Cargo.toml
. . .
[Dependencias] r2pipe =
"*"
# [Macro_use]
fn principal () {
Rubí
204
R2pipe
exigir 'R2pipe'
pone '===================='
r2p.quit
Perl
utilizar R2 :: Pipe;
utilizar estricto;
Erlang
205
R2pipe
permitir
%% hr -sNOMBRE
- modo (compilar) .
R2pipePATH = Nombre del archivo: dirname (Escript: SCRIPT_NAME ()) ++ "/ Ebin" ,
Haskell
importar R2pipe
principal = hacer
- - Ejecutar r2 localmente
- - Conectarse a r2 a través de HTTP (por ejemplo, si "R2 -QC = H / bin / ls" se está ejecutando)
Punto net
206
R2pipe
utilizando Sistema;
utilizando System.Collections.Generic;
utilizando System.Linq;
utilizando System.Text;
utilizando System.Threading.Tasks;
utilizando r2pipe;
clase Programa {
# Si __MonoCS__
# más
# terminara si
Console.WriteLine ( "Hola r2!" + Pipe.RunCommand ( "? V" )); tarea < cuerda > asíncrono =
QueuedR2Pipe QR2 = nuevo QueuedR2Pipe (tubo); qr2.Enqueue ( nuevo R2Command ( "X" , ( cuerda resultado)
=> {
Java
207
R2pipe
importar org.radare.r2pipe.R2Pipe;
tratar {
Rápido
} más {
}});
Vala
208
R2pipe
var = R2P nuevo R2Pipe ( "/ bin / ls" ); r2p.cmd ( "Pi 4" , (X) => {
stdout .printf ( "Desmontaje: \ n% s \ n" , X); r2p.cmd ( "es decir" , (X) => {
}); });
loop.run ();
regreso 0 ; }
newLISP
(carga "R2pipe.lsp" ) (Println "PD 3: \ n" (r2pipe: cmd "Pd 3" )) (salida)
Dlang
importar std.stdio;
importar r2pipe;
vacío principal() {
auto r2 = r2pipe.open (); writeln ( "Hola " ~ R2.cmd ( "? E Mundial" ));
cuerda uri = r2.cmdj ( "Ij" ) [ "núcleo" ] [ "URI" ] .Str; writeln ( "Uri" , Uri);
209
depurador
depurador
Depuradores se implementan como plugins IO. Por lo tanto, radare puede manejar diferentes tipos de URI para el desove,
adjuntando y los procesos de control. La lista completa de plugins IO se puede ver con r2
- L. Los que tienen "d" en la primera columna ( "RWD") depuración apoyo. Por ejemplo:
depuración r_d Depurar un programa o pid. dbg: /// bin / ls, dbg: // 1388 (LGPL3)
RWD gDB Adjuntar a gdbserver, 'qemu -s', el BGF: // localhost: 1234 (LGPL3)
Existen diferentes sistemas de apoyo para muchas arquitecturas y sistemas operativos de destino, por ejemplo, GNU / Linux, Windows, Mac OS X, (,
memoria del proceso es tratado como un archivo normal. Todas las páginas de memoria asignadas de un programa depurado y sus bibliotecas pueden ser leídos e
La comunicación entre radare y la capa de IO depurador se envuelve en sistema() llama, que acepta una cadena como un argumento, y lo ejecuta
como un comando. Una respuesta está tamponada a continuación, en la consola de salida, su contenido puede ser adicionalmente procesadas
$ R2 -d / bin / ls
. . .
En general, los comandos del depurador son portables entre arquitecturas y sistemas operativos. Sin embargo, como radare trata de apoyar la misma
funcionalidad para todas las arquitecturas y sistemas operativos de destino, ciertas cosas tienen que ser manejados por separado. Ellos incluyen la
inyección de shellcodes y manejo de excepciones. Por ejemplo, en los objetivos de MIPS no hay ninguna característica de un solo paso a paso hardware
compatible. En este caso, radare2 proporciona su propia implementación de un solo paso mediante el uso de una combinación de análisis de código y
210
depurador
de [-SC] [rwx] [RM] [e] de depuración con ESIL (véase de?) dg <archivo>
doo [args] Vuelva a abrir en modo de depurador con args (alias de 'ood')
Para reiniciar la sesión de depuración, puede escribir oo o oo +, dependiendo del comportamiento deseado.
211
Empezando
Empezando
r2 -d / bin / ls: Abre radare2 con el archivo / bin / ls en el modo de depuración utilizando el depurador nativo radare2, pero no se ejecuta el
programa. Usted verá un indicador (radare2) - todos los ejemplos son de este indicador.
bandera db: colocar un punto de interrupción en la bandera, donde la bandera puede ser una dirección o un nombre de función
db - Bandera: eliminar el punto de interrupción en bandera, donde la bandera puede ser una dirección o un nombre de función
ood arg1 arg2: vuelva a abrir en modo de depuración con arg1 y arg2
212
La migración de ida, el BGF o WinDBG
r2 ptrace: // pid - Igual que el anterior, pero sólo para io (no depurador backend enganchado)
Utilizar rarun2 (Libpath = $ PWD: / tmp / lib, arg2 = hola, setenv = FOO = BAR ...) ver rarun2 -h / hombre rarun2
r2 -i <archivo de guión> ... - ejecutar un script después cargar el archivo => [ vídeo ]
213
La migración de ida, el BGF o WinDBG
[0x80480423]> #! C - introducir C repl (ver #! para listar todos los plugins disponibles RLang) => [ vídeo ], Todo tiene que ser hecho de una oneliner o
atajos
Análisis
Navegación
214
La migración de ida, el BGF o WinDBG
Editar
depurador
comienzo Proceso /
F9 corriente continua F9 r y
ejecución Continuar
Despegar ? o- ? despegar
entrar en F7 ds s norte
paso dentro 4
? ds 4 F7 n4
instrucciones
$$ afi - monitor
215
La migración de ida, el BGF o WinDBG
($$ )
desmontaje
hacia adelante
N/A pd vp DISA
desmontaje
desmontaje norte
N/A pd X vp x/i
instrucciones
Información en
deposito
backtrace
DBT
Backtrace parcial (más
N/A ( dbg.btdepth N/A bt
interna)
dbg.btalgo)
DBT
Backtrace parcial (más
N/A ( dbg.btdepth N/A BT -
externa)
dbg.btalgo)
216
La migración de ida, el BGF o WinDBG
Trapos
marcos
alguna bt
números de bastidor N/A ? N/A
mando
Parámetros / locales
Monitor
parámetros / locales en N/A afvj N/A
locales
JSON
visitada (R / W)
proyecto Relacionados
espectáculo proyecto
Pi [Archivo] ?
informaciones
Diverso
217
La migración de ida, el BGF o WinDBG
Características comunes
parche en su lugar
R2 puede hacer la carga básica de archivos del núcleo ELF de la caja y MDMP (minivolcados de Windows)
218
registros
registros
Los registros son parte de un área de usuario almacenada en la estructura de contexto utilizado por el planificador. Esta estructura puede ser manipulado para
obtener y establecer los valores de esos registros, y, por ejemplo, en máquinas Intel, es posible manipular directamente DR0-DR7 registros de hardware para
Hay diferentes comandos para obtener los valores de los registros. Para el uso general los utilizan:
[0x4A13B8C0]> dr r15 =
= 0x0000003b = rasgar
0x7f20bf5df630 RSP =
0x7fff515923c0
La interacción entre un plugin y el núcleo se realiza mediante comandos que devuelven las instrucciones radare. Esto se utiliza, por ejemplo, para establecer banderas
219
registros
Una vieja copia de los registros se almacena todo el tiempo para realizar un seguimiento de los cambios realizados durante la ejecución de un programa que se está
220
registros
0x00000000 r9 = 0x00000000 r8 =
Para guardar y restaurar los valores de registro sólo puede volcar la salida de 'dr *' comando en el disco y reinterpretar de nuevo:
regs.saved; restaurar
EFLAGS pueden ser alterados de manera similar. Por ejemplo, el establecimiento de indicadores seleccionados:
= azsti
Puede obtener una cadena que representa últimos cambios de registros utilizando DRD (registros de comando diff):
[0x4A13B8C0]> DRD
Éax = 0x0000003B era 0x00000000 delta 59 rip = 0x7f00e71282d0 era 0x00000000 delta
-418217264 rflags = 0x00000200 fue 0x00000000 delta 512 RSP = 0x7fffe85a09c0 era
221
registros
222
Mapas de memoria
Mapas de memoria
La capacidad de comprender y manipular los mapas de memoria de un programa depurado es importante por muchas diferentes tareas de
ingeniería inversa. radare2 ofrece un rico conjunto de comandos para manejar mapas de memoria en el binario. Esto incluye una lista de los mapas
de memoria de la binaria Actualmente depurado, la eliminación de mapas de memoria, manejo de bibliotecas cargadas y más.
En primer lugar, vamos a ver el mensaje de ayuda para dm, el comando que es responsable del manejo de mapas de memoria:
[0x55f2104cf620]> DM?
| tamaño dm addr Asignar <tamaño> bytes en <dirección> (en cualquier lugar si la dirección es -1) en chil
el procedimiento
| DMD [a] [archivo] volcado actual (todos) de depuración región del mapa a un archivo (de-to.dmp) (ver Sd) | DMH [?]
| DML <archivo> Cargar contenido del archivo en la región del mapa actual (ver Sl)
| DMI * [addr | libname] [symname] Lista de símbolos de lib objetivo de comandos radare
| DMP [?] <dirección> <tamaño> <permanentes> Cambiar la página en <dirección> con <tamaño>, la protección <por ms> (rwx)
| DMS * [addr | libname] [] sectname secciones lista de comandos lib objetivo en radare
En este capítulo, vamos a repasar algunos de los más útiles de subcomandos dm utilizando ejemplos simples. Para los siguientes ejemplos,
usaremos un sencillo Hola Mundo programa para Linux pero será el mismo para todos los binarios.
223
Mapas de memoria
holamundo $ r2 -d
asm.bits 64
[0x7f133f022fb0]>
Tenga en cuenta que pasamos "HelloWorld" a radare2 sin "./". radare2 tratará de encontrar este programa en el directorio actual y luego
en $ PATH, aunque "./" no se pasa. Esto es contradictorio con los sistemas UNIX, pero hace que el comportamiento consistente para
Vamos a utilizar dm para imprimir los mapas de memoria del binario que acabamos de abrir:
[0x7f133f022fb0]> dm
. r_x
. rw
0x00007f133f248000 - usr 4K s rw- unk0 unk0; map.unk0.rw 0x00007fffd25ce000 - usr 132K s rw- [pila] [apilar]; map.stack_.rw
0x00007fffd25f6000 - usr 12K s r-- [vvar] [vvar]; map.vvar_.r 0x00007fffd25f9000 - usr rx 8K s [vdso] [vdso]; map.vdso_.r_x 0xffffffffff600000 -
Para aquellos de ustedes que prefieren una forma más visual, puede utilizar dm = para ver los mapas de memoria utilizando un barras del arte ASCII.
Esto será útil cuando se desea ver cómo estos mapas se encuentran en la memoria.
[0x7f133f022fb0]> dm.
Utilizando dmm podemos "módulos de la lista (bibliotecas, archivos binarios cargados en la memoria)", esto es un comando muy útil para ver qué
módulos se cargaron.
224
Mapas de memoria
[0x7fa80a19dfb0]> dmm
/usr/lib/ld-2.27.so
Tenga en cuenta que la salida de dm subcomandos, y dmm específicamente, podría ser diferente en diversos sistemas y diferentes
binarios.
Podemos ver que junto con nuestro Hola Mundo sí binario, otra biblioteca se cargó que es ld-
2.27.so. No vemos libc sin embargo, y esto es porque se rompe antes de radare2 libc se carga en la memoria. Vamos a utilizar DCU ( re ebug do ontinuac u
asta) para ejecutar el programa hasta que el punto de entrada del programa, que radare banderas como Entry0.
Hablando de libc, una tarea popular para la explotación binaria es encontrar la dirección de un símbolo específico en una biblioteca. Con esta
información en mano, se puede construir, por ejemplo, un exploit que utiliza ROP. Esto se puede lograr usando el DMI mando. Así que si
queremos, por ejemplo, para encontrar la dirección de sistema() en el cargado libc, simplemente podemos ejecutar el siguiente comando:
515 0x00043750 0x7fa809e24750 FUNC LOCAL 1221 do_system 4468 0x001285a0 0x7fa809f095a0 LOCAL FUNC
100 svcerr_systemerr 5841 0x001285a0 0x7fa809f095a0 FUNC LOCAL 100 svcerr_systemerr 6427 0x00043d10
0x7fa809e24d10 WEAK sistema FUNC 45 7094 0x00043d10 0x7fa809e24d10 GLBAL FUNC 45 sistema 7480
Similar a dm. mando, con DMI. se puede ver el símbolo más cercano a la dirección actual.
Otro comando útil es una lista de las secciones de una biblioteca específica. En el siguiente ejemplo vamos a enumerar las secciones de ld-2.27.so:
225
Mapas de memoria
02 0x000001f0 352 0x4652d1f0 352 -r-- ld-2.27.so..hash 03 0x00000350 412 0x4652d350 412 -r--
ld-2.27.so..gnu.hash 04 0x000004f0 816 0x4652d4f0 816 -r-- ld-2.27.so ..dynsym 05 0x00000820 548
07 0x00000a88 164 0x4652da88 164 -r-- ld-08 2.27.so..gnu.version_d 0x00000b30 1152 0x4652db30 1152 -r-- ld-09
2.27.so..rela.dyn 0x00000fb0 11497 11497 0x4652dfb0 -rx ld-2.27.so ..text 10 0x0001d0e0 17760 0x4654a0e0 17760 -r--
ld-2.27.so..rodata 11 0x00021640 1716 0x4654e640 1716 -r-- ld-2.27.so..eh_frame_hdr 12 0x00021cf8 9876 0x4654ecf8
9876 -r-- ld-2.27. so..eh_frame 13 0x00024660 2020 0x46751660 2020 -rw- ld-2.27.so..data.rel.ro 14 0x00024e48 336
20 0x00025fe0 13272 0x00000000 13,272 ---- ld-2.27.so..symtab 21 0x000293b8 7101 0x00000000 7101 ----
226
Montón
Montón
radare2 de dm subcomandos también pueden mostrar un mapa de la pila, que es útil para aquellos que son interesantes en la inspección de la
pila y su contenido. Basta con ejecutar DMH para mostrar un mapa de la pila:
[0x7fae46236ca6]> DMH
diseño
. ────────────────────────────────────.
`────────────────────────────────────'
. ─ ─ ─ '│
│
. ─────────────────────────────────────────────.
│ Tamaño: 0x411 │
`──────────────────────────────────────── ─────'
. ─ ─ ─ '│
│
. ────────────────────────────────────────────────────.
`────────────────────────────────────── ──────────────'
Otros comandos de montón se pueden encontrar en DMH, comprobar DMH? para la lista completa.
227
Montón
[0x00000000]> DMH?
| DMHB Mostrar toda la lista ligada doble analizada de contenedores de main_arena instanc
mi
| DMHB [BIN_NUM | BIN_NUM: malloc_state] Display analizado lista doblemente enlazada de contenedores
pemnt]
| DMHC @ [chunk_addr] struct Display malloc_chunk por un trozo malloc dada | DMHF
| DMHF [fastbin_num | fastbin_num: malloc_state] Pantalla analiza lista enlazada única instancia en Biny rápidamente de una arena especial | DMHG
| DMHG [malloc_state] gráfico Display montón de una arena especial | dmhi @ [malloc_state] estructura de visualización heap_info /
Enumerar todos los elementos de malloc_state estructura del hilo principal (main_aren
una)
| dmhm [malloc_state] Lista todas las instancias malloc_state de una arena especial | dmht
Mostrar todos los contenedores de caché de la culata en T analizados de instanc TcAChE de main_arena
mi
228
archivos
archivos
El depurador radare2 permite al usuario mostrar y manipular los descriptores de archivos desde el proceso de destino.
Esta es una característica útil, que no se encuentra en otros depuradores, la funcionalidad es similar a la herramienta de línea de comando lsof.
Por lo tanto, en cualquier momento de la sesión de depuración puede reemplazar los descriptores de fichero stdio utilizar sockets de red creados por r2, o
Esta funcionalidad también está disponible en r2frida utilizando el comando dd precedido de una barra invertida. En R2 es posible que desee para ver la salida
229
Depuración inversa
Depuración inversa
Radare2 tiene depurador inversa, que puede buscar el contador de programa hacia atrás. (Por ejemplo inversa siguiente, reversecontinue en GDB) En primer
lugar es necesario guardar el estado del programa en el punto en que desea iniciar la grabación. La sintaxis para la grabación es:
[0x004028a0]> DTS +
Puedes usar dts los comandos de grabación y gestión de los programas estados. Después de registrar los estados, puede solicitar la PC de ida y vuelta a cualquier
dirección de los puntos después de guardado. Así que después de la grabación, puede tratar solo paso atrás:
0x004028ae dr estafa
[0x004028a0]> bss
0x004028a2 dr estafa
Cuando se ejecuta bss, depurador inversa restaurar el estado anterior registrado y ejecutar el programa de él hasta el punto deseado.
0x004028a2 dr estafa
DCB busca contador de programa hasta golpear el último punto de interrupción. Así que una vez establecido un punto de interrupción, se puede volver a ella en cualquier
momento.
230
Depuración inversa
[0x004028a0]> dts
NOTA: Registros del programa se pueden guardar en cualquier momento. Estos son formato de estilo diff que guardar sólo es diferente el área de
descifrado"
Usted puede dejar notas para cada uno de los registros para mantener en su mente. bss y DCB comandos recuperan el estado del programa del último
los registros del programa pueden exportarse a presentar y, por supuesto importarlo. registros de exportación / importación a / desde un archivo:
Sesión guarda en records_for_test.session y volcado en records_for_test.dump [0x004028c2]> DTSF sesión records_for_test: 0, diffs
Por otra parte, se puede realizar la depuración en modo inverso ESIL. En el modo ESIL, estado del programa puede ser administrado por AETS comandos.
[0x00404870]> + AETS
231
Depuración inversa
232
Acceso remoto
Radare se puede ejecutar localmente, o se puede iniciar como un proceso de servidor que se controla mediante un proceso radare2 local. Esto
es posible porque todo utiliza el subsistema IO de radare que abstrae el acceso al sistema (), cmd () y todas las operaciones básicas IO por lo
[0x00405a04]> =?
comandos de rap: | =
| = <[Fd] cmd enviar la salida de mando a distancia local para fd | = [Fd] cmd cmd Exec a distancia 'fd' (la última es
| = + [Proto: //] Agregar host del host (por defecto = rap: //, tcp: //, UDP: //) | = - [fd]
| == [fd] sesión remota abierta con el anfitrión 'fd', 'q' para salir
servidor de rap: | =:
Usted puede aprender capacidades remotas radare2 visualizando la lista de plugins IO soportados: radare2 -L.
Un pequeño ejemplo debería hacer esto más claro. Una sesión remota típica podría tener este aspecto:
Al sistpral1 remoto:
Al host2 remoto:
233
Acceso remoto
En localhost:
radare2 $ -
Añadir anfitriones
[0x004048c5]> =
Puede abrir archivos remotos en modo de depuración (o el uso de ningún plugin IO) que especifica el URI al agregar hosts:
[0x004048c5]> = + = + rap: // <host2>: 1234 / dbg: /// bin / ls Conectado a: <host2> 1234 en el
/// bin / ls
[0x004048c5]> = 0 px [0x004048c5]> = s
0x666
. . .
FD: 6> q
[0x004048c5]> = -
También puede redirigir la salida radare a un puerto TCP o UDP del servidor (por ejemplo, nc -l). En primer lugar, agregue el servidor con '= + tcp: //' o '= + UDP:
234
Acceso remoto
Los = < comando enviar el resultado de la ejecución de cmd para el número de conexión remoto N (o el último usado si ningún id
especificado).
235
GDB remoto
radare2 permite la depuración remota a través del protocolo remoto BGF. Para que pueda ejecutar un gdbserver y conectarse a él con radare2 para la
Tenga en cuenta que el siguiente comando hace lo mismo, r2 usará el plugin de depuración especificado por el URI si se encuentra.
El plug-in de depuración se puede cambiar en tiempo de ejecución utilizando los comandos dL o LD.
O si el gdbserver se está ejecutando en modo extendido, se puede asociar a un proceso en el host con:
Después de conectar, puede utilizar los comandos de depuración R2 estándar con normalidad.
radare2 todavía no se carga símbolos de gdbserver, por lo que necesita el binario a ser localmente presente para cargar símbolos de ella. En caso de que
los símbolos no están cargados, incluso si el binario está presente, puede intentar especificar la ruta de acceso con e dbg.exe.path:
Si los símbolos se cargan en una dirección base incorrecta, puede intentar especificar la dirección base con demasiado e bin.baddr:
Por lo general, la gdbserver informa del tamaño máximo de paquete que soporta. De lo contrario, radare2 recurre a los valores iniciales adecuados.
Sin embargo, puede especificar el tamaño máximo de paquete con la variable de entorno
R2_GDB_PKTSZ. También puede comprobar y establecer el tamaño máximo del paquete durante una sesión con el sistema IO,
=! .
236
GDB remoto
64 bytes
El sistema gdb IO proporciona comandos útiles que podrían no caber en cualquier comandos estándar radare2. Usted puede obtener una lista
sistema ()).
cmd = pid
=! Cmd del monitor - comando monitor y pasar para apuntar intérprete hex-encode
! = Exec_file [pid] - obtener el archivo que fue ejecutado por pid actual / especificado
$ R2 -
[0x00000000]> = g?
| = Fichero port g [args] escuchar en 'puerto' depuración 'Archivo' usando gdbserver | = G! archivo de puerto [args] mismo que el anterior, pero los mensajes de
$ R2 -
Y luego conectarse a él como lo haría con cualquier gdbserver. Por ejemplo, con radare2:
237
GDB remoto
238
WinDBG remoto
WinDBG
El apoyo WinDBG para R2 le permite adjuntar a la máquina virtual con Windows utilizando un archivo llamado zócalo (OI apoyará más en el futuro)
para depurar un cuadro de ventanas utilizando la interfaz de KD a través del puerto serie.
Tenga en cuenta que el apoyo WinDBG todavía es un trabajo en progreso, y esto es sólo una implementación inicial que va a mejorar con el
tiempo.
También es posible utilizar la interfaz de GDB remoto para conectarse y depurar kernels de Windows sin depender de las capacidades de
Windows.
bcdedit / depuración en
A partir de Windows 8 no hay manera de hacer cumplir la depuración para cada arranque, pero es posible mostrar siempre las opciones de
O como esta para Windows XP: boot.ini abierto y añadir / debug / debugport = COM1 / velocidad de transmisión = 115200:
30
default = multi (0) disk (0) rdisk (0) partición (1) \ [sistemas operativos] VENTANAS
multi (0) disk (0) rdisk (0) partición (1) \ WINDOWS = "Depuración con cable" / fastdetect / debug / d ebugport = COM1 / velocidad de transmisión = 57600
En caso de VMWare
Máquinas virtuales Configuración -> Añadir -> Serial Port Estado del dispositivo:
conexión:
239
WinDBG remoto
Radare2 utilizará el 'windbg' io plugin para conectarse a un archivo de socket creado por VirtualBox o qemu. Además, el depurador 'windbg'
plugin y que debe especificar el x86-32 también. (32 y 64 de depuración de bits es compatible)
[0x828997b8]> pd 20
; - EIP:
0x828997b8 cc int3
0x828997bc cc int3
0x828997bd 90 nop
0x828997be c3 jubilado
0x828997bf 90 nop
Con el fin de omitir esa trampa tendremos que cambiar EIP y correr 'dc' dos veces:
240
WinDBG remoto
dr EIP = EIP + 1 dc
dr EIP = EIP + 1 dc
Ahora la máquina virtual de Windows será interactiva de nuevo. Tendremos que matar a r2 y conecte de nuevo para volver a controlar el kernel.
además, el dp comando se puede utilizar para enumerar todos los procesos, y dpa o dp = para insertarse en el proceso. Esto mostrará la
241
Herramientas de línea de comandos
Herramientas
Radare2 no es sólo la única herramienta proporcionada por el proyecto radare2. El resto, si capítulos de este libro se centran en explicar el uso de
la herramienta radare2, este capítulo se centrará en explicar todos los demás instrumentos complementarios que se incluyen dentro del proyecto
radare2.
Todas las funcionalidades proporcionadas por las diferentes APIs y plugins tienen también herramientas diferentes para permitir a utilizarlas desde la
Gracias al diseño ortogonal del marco, es posible hacer todas las cosas que R2 es capaz de distintos lugares:
cáscara r2pipe r2
242
Rax2
Rax2
los rax2 utilidad viene con el marco radare y pretende ser un evaluador de expresión minimalista para la cáscara. Es útil para hacer las
conversiones de base entre los valores de punto, representaciones hexadecimales, cuerdas hexpair flotante para ascii, octal a entero. Es
compatible con endianness y se puede utilizar como una cáscara si no se dan argumentos.
Este es el mensaje de ayuda de rax2, esta herramienta se puede utilizar en la línea de comandos o de forma interactiva (la lectura de los valores de la entrada estándar),
Dentro R2, la funcionalidad de rax2 está disponible bajo la? mando. Por ejemplo:
[0x00000000]>? 3 + 4
Como se puede ver, las expresiones numéricas pueden contener expresiones matemáticas como suma, resta, .. así como las
3: decimal, la base 10
megabytes
.. .
243
Rax2
$ Rax2 -h
- re decodificación base 64 ;
- mi codificar base64 ;
- h ayuda ; rax2 -h
- v versión ; rax2 -v
Algunos ejemplos:
244
Rax2
$ Rax2 -s 4142 AB
$ Rax2 -S AB 4142
$ Rax2 -S <bin.foo
. . .
$ Rax2 -e 33
0x21000000
$ Rax2 -e 0x21000000 33
$ Rax2 -K 90203010
|.... |
| o |
| . |
| S |
| |
| |
| |
| |
+- - - - - - - - - - - - - - - - - +
245
Rax2
246
Rafind2
rafind2
Rafind2 es la línea de comandos de la fachada r_search biblioteca. Que le permite buscar cadenas, secuencias de bytes con
$ Rafind2 -h
Uso: rafind2 [-mXnzZhqv] [align -a] [-b sz] [-f / t / a] [- [e | s | S] str] [-x hex] fil e | dir ..
- e [expresiones regulares] buscar coincidencias de expresiones regulares (se puede utilizar varias veces)
- M [str] establece una máscara binaria para ser aplicado en las palabras clave
- s [str] buscar una cadena específica (se puede utilizar varias veces)
- S [str] buscar una cadena específica de ancho (se puede utilizar varias veces)
- q calma - no muestran partidas (nombres de archivo) sobre el juego contenidos (por defecto fo
- x [hex] búsqueda de cadena hexpair (909.090) (se puede utilizar varias veces)
Eso es cómo usarlo, primero vamos a buscar "lib" dentro de la / bin / ls binario.
. . .
PS
Tenga en cuenta que la salida es bastante escaso, y muestra los desplazamientos en la cadena lib es encontrado. entonces podemos utilizar esta salida para alimentar a
otras herramientas.
Contando resultados:
247
Rafind2
$ Export F = / bin / ls
0x000005f9 6c69 622f 6479 6c64 .. lib / dyld ........ 0x00000675 6c69 622f 6c69 6275 .. lib /
libutil.dyli 0x00000679 6c69 6275 7469 6c2e .. libutil.dylib ... 0x00000683 6c69 6200 000c
0000 .. lib ...... 8 ...... 0x000006a5 6c69 622f 6c69 626e .. lib / libncurses.5 0x000006a9 6c69
626e 6375 7273 .. libncurses.5.4.d 0x000006ba 6c69 6200 0000 0C00 .. lib .... ... 8 .....
0x000006dd 6c69 622f 6c69 6253 .. lib / libSystem.B. 0x000006e1 6c69 6253 7973 7465 ..
Pero rafind2 puede también ser utilizado como un sustituto de expediente para identificar los tipo MIME de un archivo usando la base de datos interna de la magia
radare2.
Mach-O
También funciona como una instrumentos de cuerda reemplazo, similar a lo que haces con -z rabin2, pero sin preocuparse de analizar las cabeceras y obedecer
secciones binarios.
248
Rarun2
Rarun2
Rarun2 es una herramienta que permite configurar un entorno de ejecución especificada - redefinir stdin / stdout, tuberías, cambiar las variables de
entorno y otros ajustes útiles para elaborar las condiciones de contorno que necesita para ejecutar un binario para la depuración.
$ Rarun2 -h
Se necesita el archivo de texto en formato clave = valor para especificar el entorno de ejecución. Rarun2 se puede utilizar tanto como herramienta
independiente o como parte de radare2. Para cargar el perfil rarun2 en radare2 necesita utilizar cualquiera -
El formato del perfil es muy simple. Tenga en cuenta las claves más importantes - programa y arg *
Uno de los casos de uso más comunes - redirigir la salida del programa depurado en radare2. Para ello, tiene que usar stdio, stdout,
249
Rarun2
/ bin
# arg2 = hola
# arg4 =: 048490184058104849
# arg6=@arg.txt
# sistema = r2 -
# ASLR = no
# unsetenv = FOO
# clearenv = true
# timeoutsig = SIGTERM # o 15
# listen = 8080
# pty = false
# tenedor = true
# bits = 32
# pid = 0
# # sueño = 0
# # maxfd = 0
# # execve = false
# # maxproc = 0
# # maxstack = 0
# # núcleo = false
# # stdio = blah.txt
# # stderr = foo.txt
# stdout = foo.txt
# entrada = input.txt
# chdir = /
# r2preload = yes
# setuid = 2000
# seteuid = 2000
# setgid = 2001
# setegid = 2001
# agradables = 5
250
Rabin2
Bajo este nombre conejito-árabe-como, radare esconde una poderosa herramienta para manejar archivos binarios, para obtener información sobre las
importaciones, las secciones, encabezados y otros datos. Rabin2 puede presentar en varios formatos aceptados por otras herramientas, incluyendo radare2 sí.
Rabin2 entiende muchos formatos de archivo: Clase Java, ELF, PE, Mach-O o cualquier formato soportado por los plugins, y es capaz de obtener símbolo de
importación / exportación, las dependencias de bibliotecas, las cadenas de secciones de datos, referencias externas, la dirección del punto de entrada, secciones,
arquitectura tipo.
$ Rabin2 -h
Uso: rabin2 [-AcdeEghHiIjlLMqrRsSvVxzZ] [- @ at] [-a arco] [bits de -b] [addr -B]
[-CF: C: D] [-f str] [-m addr] [-n str] [-N m: M] [-P [-P] pdb] [-o str] [-O str] [ consulta -k] [-D lang symname] |
expediente
- do lista clases
- C [fmt: C: D] crear [elf, mach0, pe] con el código y los datos hexpairs (ver -a)
- Nombre D lang demangle nombre de símbolo (-D todo por bin.demangle = true)
- mi punto de entrada
- F [binfmt] la fuerza para utilizar ese plugin bin (ignorar comprobación de cabecera)
- H campos de cabecera
- yo información binaria
- j salida en JSON
- l bibliotecas vinculadas
- N [min: max] fuerza min: número máximo de caracteres por cadena (ver -z y -zz)
- o [str] archivo de salida / carpeta para las operaciones de escritura (por defecto)
251
Rabin2
- r salida radare
- R reubicaciones
- s símbolos
- S secciones
- X [fmt] [f] .. paquete de contenido de grasa o zip los archivos y contenedores estén impresos en archivos
- zzz volcar cuerdas primas a la salida estándar (para archivos de gran tamaño)
. . . . . .
252
La identificación del archivo
Identificación del tipo de archivos se realiza utilizando - YO . Con esta opción, rabin2 imprime información sobre un tipo binario, al igual que su codificación,
x86
binsz 128456
64
ELF64
Microesfera
/lib64/ld-linux-x86-64.so.2
lang do
falso
nx
cierto
OS Linux
pcalign 0 pic
cierto
reubicaciones falsa
RELRO parcial
rpath NINGUNA
verdaderos SUBSYS VA
Linux
cierto
Para que la información de salida rabin2 en el formato que el programa principal, radare2, puede entender, pase -
IR opción a la misma:
253
La identificación del archivo
asm.pcalign = 0
254
Punto de entrada
los - mi opciones transferida a rabin2 mostrará puntos de entrada para binario dado. Dos ejemplos:
entrada]
vaddr = 0x00005310 PADDR = 0x00005310 0x00000000 = baddr laddr = 0x00000000 0x00000018 = HAddr típico programa de e =
1 puntos de entrada
0x00000018 s Entry0
255
Las importaciones
Las importaciones
Rabin2 es capaz de encontrar objetos importados por un ejecutable, así como sus desplazamientos en el PLT. Esta información es
útil, por ejemplo, para entender cuál es la función externa es invocado por llamada
instrucción. Pasar - yo bandera para rabin2 para obtener una lista de las importaciones. Un ejemplo:
. . .
256
exportaciones
exportaciones
210 0x000ae1f0 0x000ae1f0 GLOBAL FUNC 200 r_bin_java_print_exceptions_attr_summary 211 0x000afc90 0x000afc90 GLOBAL FUNC 135
r_bin_java_get_args
212 0x000b18e0 0x000b18e0 GLOBAL FUNC 35 r_bin_java_get_item_desc_from_bin_cp_list 213 0x00022d90 0x00022d90 GLOBAL FUNC 204
r_bin_class_add_method 214 0x000ae600 0x000ae600 GLOBAL FUNC 175 r_bin_java_print_fieldref_cp_summary 215 0x000ad880 0x000ad880 GLOBAL FUNC
144 r_bin_java_print_constant_value_attr_summar y
216 0x000b7330 0x000b7330 GLOBAL FUNC 679 r_bin_java_print_element_value_summary 217 0x000af170 0x000af170 GLOBAL FUNC 65
257
Símbolos (exportaciones)
Símbolos (Exportaciones)
Con rabin2, el formato de la lista de símbolos generado es similar a la lista de importaciones. Utilizar el - s opción para conseguirlo:
110 0x000150a0 0x000150a0 GLOBAL FUNC 56 _obstack_allocated_p 111 0x0001f600 0x0021f600 GLOBAL OBJ 8
program_name 112 0x0001f620 0x0021f620 GLOBAL OBJ 8 stderr 113 0x00014f90 0x00014f90 GLOBAL FUNC 21
_obstack_begin_1 114 0x0001f600 0x0021f600 WEAK OBJ 8 program_invocation_name 115 0x0001f5c0 0x0021f5c0
GLOBAL OBJ 8 alloc_failed_handler 116 0x0001f5f8 0x0021f5f8 GLOBAL OBJ 8 OPTARG 117 0x0001f5e8
0x0021f5e8 GLOBAL OBJ 8 stdout 118 0x0001f5e0 0x0021f5e0 GLOBAL OBJ 8 program_short_name
Con el - sr rabin2 opción produce un guión radare2 lugar. Más tarde se puede pasar al núcleo de bandera automáticamente todos los símbolos y para
sym.stdout 8 0x0021f5e8
f sym.program_invocation_short_name 8 0x0021f5e0
258
bibliotecas
Bibliotecas lista
Rabin2 puede listar las bibliotecas utilizadas por un binario con el - l opción:
libpthread.so.0 libc.so.6
22 bibliotecas
259
bibliotecas
linux-vdso.so.1 (0x00007fffba38e000)
libr_core.so => /usr/lib64/libr_core.so (0x00007f94b4678000) libr_parse.so => /usr/lib64/libr_parse.so (0x00007f94b4425000) libr_search.so =>
(0x00007f94b3dfa000) libr_bin.so => /usr/lib64/libr_bin.so (0x00007f94b3afd000) libr_debug.so = > /usr/lib64/libr_debug.so (0x00007f94b38d2000) libr_anal.so
=> /usr/lib64/libr_anal.so (0x00007f94b2fbd000) libr_reg.so => /usr/lib64/libr_reg.so (0x00007f94b2db4000) libr_bp.so => / usr / lib64 / libr_bp.so
(0x00007f94b2baf000) libr_io.so => /usr/lib64/libr_io.so (0x00007f94b2944000) libr_fs.so => /usr/lib64/libr_fs.so (0x00007f94b270e000) libr_asm.so => / usr /
(0x00007f94b185a000) libr_magic.so => /usr/lib64/libr_magic.so (0x00007f94b164d000) libr_flag.so => / usr /lib64/libr_flag.so (0x00007f94b1446000) libr_egg.so
=> /usr/lib64/libr_egg.so (0x00007f94b1236000) libr_crypto.so => /usr/lib64/libr_crypto.so (0x00007f94b1016000) libr_util.so => / usr / lib64 /libr_util.so
(0x00007f94b0d35000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f94b0b15000) libc.so.6 => /lib64/libc.so.6 (0x00007f94b074d000) libr_lang.so => / usr
/lib64/libr_lang.so (0x00007f94b0546000) libr_socket.so => /usr/lib64/libr_socket.so (0x00007f94b0339000) libm.so.6 => /lib64/libm.so.6 (0x00007f94affaf000)
0x00007f94b1446000) libr_egg.so => /usr/lib64/libr_egg.so (0x00007f94b1236000) libr_crypto.so => /usr/lib64/libr_crypto.so (0x00007f94b1016000) libr_util.so
=> /usr/lib64/libr_util.so (0x00007f94b0d35000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f94b0b15000) libc.so.6 => /lib64/libc.so.6
(0x00007f94b074d000) libr_lang.so => /usr/lib64/libr_lang.so ( 0x00007f94b0546000) libr_socket.so => /usr/lib64/libr_socket.so (0x00007f94b0339000) libm.so.6
libr_flag.so => /usr/lib64/libr_flag.so ( 0x00007f94b1446000) libr_egg.so => /usr/lib64/libr_egg.so (0x00007f94b1236000) libr_crypto.so => /usr/lib64/libr_crypto.so
(0x00007f94b1016000) libr_util.so => /usr/lib64/libr_util.so (0x00007f94b0d35000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f94b0b15000) libc.so.6 =>
(0x00007f94b0339000) libm.so.6 => /lib64/libm.so.6 (0x00007f94affaf000) libdl.so.2 => /lib64/libdl.so. 2 (0x00007f94afdab000) /lib64/ld-linux-x86-64.so.2
(0x00007f94b4c79000)so => /usr/lib64/libr_hash.so (0x00007f94b185a000) libr_magic.so => /usr/lib64/libr_magic.so (0x00007f94b164d000) libr_flag.so =>
(0x00007f94b1016000) libr_util.so => /usr/lib64/libr_util.so (0x00007f94b0d35000) libpthread.so.0 = > /lib64/libpthread.so.0 (0x00007f94b0b15000) libc.so.6 =>
(0x00007f94b0339000) libm.so.6 => /lib64/libm.so.6 (0x00007f94affaf000) libdl.so.2 => /lib64/libdl.so.2 (0x00007f94afdab000) / lib64 /ld-linux-x86-64.so.2
(0x00007f94b4c79000)so => /usr/lib64/libr_hash.so (0x00007f94b185a000) libr_magic.so => /usr/lib64/libr_magic.so (0x00007f94b164d000) libr_flag.so => /usr/lib64/libr_flag.so (0x00007f94b1446000) libr_egg.so = > /usr/lib64/libr_egg.so (0x
(0x00007f94af702000) libutil. SO.1 => /lib64/libutil.so.1 (0x00007f94af4ff000) libz.so.1 => /lib64/libz.so.1 (0x00007f94af2e8000)
Si se comparan los resultados de rabin2 -l y LDD, notará que rabin2 enumera un menor número de bibliotecas que LDD. La razón es que
rabin2 no sigue y no muestra las dependencias de bibliotecas. Sólo se muestran las dependencias binarias directos.
260
Instrumentos de cuerda
Instrumentos de cuerda
los - z opción se utiliza para enumerar las cadenas legibles que se encuentran en la sección de .rodata binarios ELF, o la sección .text de archivos PE.
Ejemplo:
000 0x000160f8 0x000160f8 11 12 (.rodata) ascii dev_ino_pop 001 0x00016188 0x00016188 10 11 (.rodata)
ascii sort_files 002 0x00016193 0x00016193 6 7 (.rodata) ascii posix003 0x0001619a 0x0001619a 4 5 (.rodata)
005 0x00016260 0x00016260 65 66 (.rodata) archivo de configuración ASCII # para dircolors, una utilidad para ayudarle a configurar el
006 0x000162a2 0x000162a2 72 73 (.rodata) Variable ASCII # LS_COLORS entorno de ls de GNU con la opción -color.
007 0x000162eb 0x000162eb 56 57 (.rodata) ascii # Copyright (C) 1996-2018 gratuito Softwar e Foundation, Inc.
009 0x0001636b 0x0001636b 76 77 (.rodata) se permiten ascii # siempre que el aviso de copyright y este aviso se conservan.
Con el - zr opción, esta información se representa como una lista de comandos radare2. Se puede utilizar en una sesión radare2 para crear automáticamente un
espacio indicador denominado "cadenas" pre-pobladas con banderas de todas las cadenas que se encuentran por rabin2. Por otra parte, este script va a
f str.posix 7 @ 0x00016193 Cs 7 @
0x00016193
f str.main 5 @ 0x0001619a Cs 5 @
0x0001619a
261
Las partes del programa
Rabin2 llamada con el - S opción proporciona información completa acerca de las secciones de un archivo ejecutable. Para cada sección del
índice, offset, tamaño, alineación, tipo y permisos, se muestran. El siguiente ejemplo demuestra esto:
03 176 0x00000278 0x00000278 176 -r-- .gnu.hash 04 0x00000328 0x00000328 3000 3000 -r--
.dynsym 05 0x00000ee0 1412 0x00000ee0 1412 -r-- .dynstr 06 250 0x00001464 0x00001464 250 -r--
0x000015d0 4944 -r-- .rela.dyn 09 0x00002920 0x00002920 2448 2448 -r-- .rela.plt 10 0x000032b0
15 0x00015a40 20201 0x00015a40 20201 -r-- .rodata 16 0x0001a92c 2164 0x0001a92c 2164 -r--
20 0x0001e3a0 2616 0x0021e3a0 2616 -rw- .data.rel.ro 21 0x0001edd8 480 0x0021edd8 480 -rw-
.dynamic 22 0x0001efb8
23 0x0001f000 840 0x0021f000 840 -rw- .got.plt 24 0x0001f360 616 0x0021f360 616 -rw-
.data 25 0x0001f5c8
Con el - sr opción, indicador rabin2 voluntad el inicio / final de cada sección, y pasará el resto de la información como un comentario.
262
Las partes del programa
section_end. 1 0x00000000
la sección CC 0 va = 0x00000000 pa = 0x00000000 sz = 0 vsz = 0 rwx = ---- @ 0x00000000 S 0x00000238 0x00000238 0x0000001c
la sección CC 1 va = 0x00000238 pa = 0x00000238 sz = 28 vsz = 28 rwx = -r-- .interp @ 0x00000238 S 0x00000254 0x00000254 0x00000020
0x00000020 .note.ABI_tag 4
263
Radiff2
Radiff2
Radiff2 es una herramienta diseñada para comparar archivos binarios, similar a la forma habitual diff compara archivos de texto.
$ Radiff2 -h
Uso: radiff2 [-abBcCdjrspOxuUvV] [-A [A]] [-g sym] [-t%] [archivo] [archivo]
- A [-a] ejecutar aaa o AAAA después de cargar cada uno binario (ver -C)
- b [bits de] especifican regístrese tamaño para el arco (16 (pulgar), 32, 64, ..)
- e [k = v] establecer el valor var config eval para todas las instancias RCore
- g [sym | DES1, DES2] diff gráfico de símbolo dado, o entre dos desplazamientos
- s Calcular distancia de edición (sin sustitución, Eugene W. Myers' O (ND) diff algorit
hm)
- S [nombre] diff código de clasificación (nombre, nameLen, addr, tamaño, tipo, dist) (sólo para -C o -g)
264
binaria diffing
binaria diffing
Sin ningún parámetro, radiff2 muestra por defecto lo bytes se cambian y sus compensaciones correspondientes:
9090909090 0x0007c805
eax sete al
Para el procesamiento a granel, es posible que desee tener una visión general de alto nivel de las diferencias. Esta es la razón por radare2 es capaz
743
Si desea que los datos más concretos, también es posible contar las diferencias, con el - do opción:
Si no está seguro de si se trata de binarios similares, con - do bandera puede comprobar hay funciones coincidentes. Es este modo, se le dará tres
columnas para todas las funciones: "En primer desplazamiento de archivo", "Porcentaje de coincidencia" y "Segundo desplazamiento archivo".
265
binaria diffing
sym.imp .__ libc_start_main 0x401190 | PARTIDO (1.000000) | 0x401190 sym.imp .__ libc_s tart_main
fcn.00401196 0x401196 | PARTIDO (1.000000) | 0x401196 fcn.00401196 fcn.0040103c 0x40103c | PARTIDO (1.000000) |
fcn.0040103c 0x40103c fcn.00401046 0x401046 | PARTIDO (1.000000) | 0x401046 fcn.00401046 fcn.000045e0 24 0x45e0 |
24 fcn.000045f0
. . .
Por otra parte, podemos pedir radiff2 para realizar análisis primera - la adición - UNA opción se ejecutará aaa en los binarios. Y podemos especificar la
$ Radiff2 -AC -a x86 / bin / true / bin / false | grep UNMATCH [x] Analizar todas las banderas comenzando
con sym. y Entry0 (aa) [x] Analizar len bytes de instrucciones para referencias (AAR) [x] Analizar las
[] [*] Uso -AA o AAAA para llevar a cabo análisis experimental adicional. [X] La construcción de un nombre de función para FCN. * Y
sym.func. * Funciones (aan)) [x] Analizar todas las banderas comenzando con sym. y Entry0 (aa) [x] Analizar len bytes de instrucciones
[] [*] Uso -AA o AAAA para llevar a cabo análisis experimental adicional. [X] La construcción de un nombre de función para FCN. * Y
sub.fileno_510
sub.fileno_450
sub.setlocale_fb0
fcn.00003a60
Y ahora una característica interesante: radare2 apoya gráfico-diffing, a la DarunGrim , con el - sol opción. Usted puede darle un
nombre de símbolo, de especificar dos desplazamientos, si la función que desea Diff es un nombre diferente en archivos
comparados. Por ejemplo, radiff2 -g principal / bin / true / bin / false | xdot - mostrará las diferencias en principal() la función de Unix cierto y falso programas.
- g principal / bin / false / bin / true ( Observe el orden de los argumentos) para obtener las dos versiones. Este es el resultado:
266
binaria diffing
Partes amarillas indican que algunas compensaciones no coinciden. La pieza gris significa una combinación perfecta. El rojo pone de manifiesto
una diferencia fuerte. Si se mira de cerca, verá que la parte izquierda de la imagen tiene
edi mov, 0x1; llamar sym.imp.exit, mientras que la derecha tiene edi xor, EDI; llamar sym.imp.exit.
Diferenciando binario es una característica importante para la ingeniería inversa. Puede ser utilizado para analizar actualizaciones de seguridad , Los binarios infectados,
Sólo hemos mostrado el análisis de código diffing funcionalidad, pero radare2 soporta otros tipos de diffing entre dos binarios: a
Tenemos planes para implementar más tipos de algoritmos bindiffing en r2, y por qué no, añadir soporte para el gráfico arte ASCII diffing y una
267
Rasm2
Rasm2
rasm2 es un ensamblador / desensamblador. Inicialmente, rasm herramienta fue diseñada para ser utilizado para parchear binarios. Su función principal es
$ Rasm2 -h
Uso: rasm2 [-ACdDehLBvw] [arco -a] [bits de -b] [-o addr] [sintaxis -s]
[-F archivo] [-F fil: ter] [skip -i] [len -l] 'código' | hexagonal | -
- b [bits de] Conjunto cpu tamaño registro (8, 16, 32, 64) (RASM2_BITS)
- do Salida en formato C
- q Modo silencioso
Si el valor '-l' es mayor que la longitud de salida, la salida se rellena con NOP Si el último argumento es '-' se lee de la entrada
Plugins para arquitecturas de destino soportadas pueden ser listados con la - L opción. Conociendo un nombre del plugin, se puede usar
268
Rasm2
$ -L rasm2 _dAe 8 16
a___ 16 32 64 arm.as LGPL3 como ARM ensamblador (uso ARM_AS medio ambiente)
_d__ 32 LM32 BSD plug-in para el desmontaje del enrejado Micro 32 ISA
_dA_ 32 TMS320 LGPLv3 familia TMS320 DSP (C54x, C55x, C55x +, C64x)
269
Rasm2
Tenga en cuenta que "ad" en la primera columna significa tanto ensamblador y desensamblador son ofrecidos por un plugin correspondiente. " d"
270
Montar
Ensamblador
Montaje es la acción a realizar una instrucción de ordenador en forma legible por humanos (uso de las sentencias) y convertir eso en un montón de
En radare2, la lógica ensamblador y desensamblador se implementa en el r asm * API, y puede ser utilizado con los comandos de PA y de
Rasm2 se puede utilizar para hexpairs que representan una instrucción de máquina dada pegado copian rápidamente. La siguiente línea es el
Como se ha visto, rasm2 puede montar una o muchas instrucciones. En línea separándolas con un punto y coma; , Pero también se puede leer que a
partir de un archivo, utilizando genérica nasm / gas / .. sintaxis y directivas. Puede comprobar la página de manual rasm2 para más detalles sobre
esto.
los Pensilvania y almohadilla son un subcomandos de impresión, lo que significa que sólo se imprimirán montaje o desmontaje. En caso de que quiera
El ensamblador comprende los siguientes idiomas de entrada y sus sabores: X 86 ( Intel y AT & T variantes), Olly ( OllyDbg sintaxis), PowerPC
( PowerPC), brazo y java. Para conocer la sintaxis de Intel, rasm2 trata de imitar NASM o gas.
Hay varios ejemplos en el directorio del código fuente rasm2. Consulte a comprender cómo se puede montar un archivo binario
271
Montar
; --pancake;
. arquitectura x86
selfstop:
empujar 0x8048000
Pusha
0x80
; La inyección llamada;
jubilado
a.rasm` [0x00000000]> PD 20
0x00000005 60 PUSHAD
61 POPAD
0x0000001c c3 jubilado
0x0000001d c3 jubilado
272
Montar
modo visual
Montaje también es accesible en modo visual radare2 mediante presión UNA clave para insertar el conjunto en el desplazamiento actual.
Lo bueno de escribir ensamblaje utilizando la interfaz ensamblador visual que los cambios se realizan en la memoria hasta que se pulsa
enter.
Para que pueda comprobar el tamaño del código y qué instrucciones se coloque por encima antes de comprometerse a los cambios.
273
Desmontar
desensamblador
Desmontan es la acción inversa de montaje. Rasm2 toma hexpair como una entrada (pero también puede tener un archivo en formato binario) y
Rasm2 también tienen la - re la bandera para mostrar el desmontaje como - re lo hace, sino que incluye offset y bytes.
En radare2 hay muchos comandos para realizar un desmontaje de un lugar específico en la memoria.
Que podría estar interesado en probar si usted quiere diversas salidas para su posterior análisis con las secuencias de comandos, o simplemente grep para
pd N
Desmontar instrucciones N
pD N
Desmontar N bytes
pda
Desmontar todas las instrucciones (en busca de 1 byte, o el tamaño mínimo de instrucciones de alineación), que pueden ser útiles para la ROP
PI, PI
274
Configuración
Configuración desensamblador
Esas configuraciones están disponibles a través de la mi mando. Aquí están los más comunes:
mostrar / ocultar
.. .
275
Ragg2
ragg2
ragg2 significa radare2 huevo, este es el bloque básico para construir fragmentos reubicables de código para ser utilizado para la inyección en los procesos
ragg2 compila los programas escritos en un simple lenguaje de alto nivel en pequeños binarios para x86, x86-64, y ARM.
Por defecto se compilará su propia ragg2 idioma, pero también se puede compilar código C usando GCC o shellcodes Clang dependiendo de la
En t principal () {
regreso 0 ; }
$ Ragg2 -a x 86 -b32 ac
e900000000488d3516000000bf01000000b80400000248c7c20d0000000f0531c0c348656c6c6f20576f726c 640a00
e900000000 JMP 5
0x00000021 1 ret c3
syscall (1);
@ mundial principal () {
de salida (2); }
$ Ragg2 -a -b x 86 64 hello.r
48c7c00200000050488b3c2448c7c0010000000f054883c408c3 0x00000000 1
48 diciembre eax
0x00000019 1 ret c3
0x00000019 1 ret c3
binarios minúsculos
277
Idioma
Sintaxis de la lengua
esto significa que usted tiene que definir el tamaño adecuado en el entorno de pila
El compilador genera código ensamblador para x86 {32,64} y el brazo. Pero su objetivo
Es posible que quiera utilizar r_egg para crear binarios independientes, posición-
huevos crudos independientes para ser inyectados en los procesos en ejecución o para parche
binarios en el disco.
El código generado aún no está optimizado, pero es seguro para ser ejecutado
preprocesador
alias
incluye
Utilizar gato (1) o el preprocesador para concatenar varios archivos para ser compilado.
278
Idioma
sys-osx.r@include (INCDIR);
Hashbang
$ Cabeza n1 hello.r
$ ./hello.r
Hola Mundo!
Principal
principal();
. . .
. . .
definición de la función
Es posible que quiera dividir el código en varios bloques de código. esos bloques
firmas de función
Tipo de nombre @ (stackframesize, staticframesize) {cuerpo}
279
Idioma
tipos de funciones
llamadas al sistema
r_egg ofrece un azúcar sintaxis para definir llamadas al sistema. La sintaxis es la siguiente:
@syscall () {
: Int 0x80
@ mundial principal () {
de salida (0);
bibliotecas
Por el momento no hay soporte para vincular los programas r_egg al sistema de
biblioteca central
280
Idioma
Variables
. arg
. arg0
. arg1
. arg2
. var0
. var2
. fijar
. pb
. ordenador personal
. sp
Atención: Todos los números después . var y . arg significar el desplazamiento con el
Las matrices
Rastreo
A veces los programas r_egg se romperán o simplemente no funcionar como se espera. Utilizar el
punteros
registros virtuales
281
Idioma
operaciones matemáticas
+ - * /Y|^
mundial (4) {
. var0; }
@ mundial principal () {
añadir (3,4); }
trampas
el programa. idioma Regg capta las llamadas a 'break ()' para ejecutar el emit_trap
ensamblado en línea
282
Idioma
Las líneas que comienzan con ':' carbón son sólo entre líneas en el conjunto de salida.
: JMP 0x8048400
: 33,44 .byte
Etiquetas
Puede definir las etiquetas mediante el: la palabra clave de la siguiente manera:
:Nombre de etiqueta:
/ * Bucle infinito * /
Goto (LABEL_NAME)
Flujo de control
while (cond)
si (cond)
comentarios
283
Rahash2
rahash2
La herramienta rahash2 se puede utilizar para calcular las sumas de comprobación de archivos, dispositivos de disco o cadenas. Por bloques o en su totalidad utilizando
Esta herramienta también es capaz de hacer algunas operaciones de codificación / decodificación como base64 y codificación XOR.
Tenga en cuenta que rahash2 también permite leer de la entrada estándar en una corriente, por lo que no es necesario 4 GB de RAM para calcular el hash de un archivo
de 4 GB.
Al hacer la medicina forense, es útil para calcular las sumas de comprobación parciales. La razón de esto es porque es posible que desee dividir un archivo grande
en pequeñas porciones que son más fáciles de identificar por su contenido o regiones en el disco.
Esto se dará el mismo hash de bloques que contienen el mismo contenido. Por ejemplo, si se llena con ceros.
Pero, además, se puede utilizar para encontrar qué bloques han cambiado entre más de un vertedero de muestra.
Esto puede ser útil en el análisis de carnero volcados desde una máquina virtual, por ejemplo. Utilice este comando para esto:
La herramienta rabin2 analiza las cabeceras binarios de los archivos, sino que también tienen la capacidad de utilizar los plugins rhash para calcular la suma de
284
Rahash2
Para calcular una suma de comprobación del bloque actual cuando se ejecuta radare2, utilice el ph mando. Pasar un nombre de algoritmo a ella como un
d2994c75adaa58392f953a448de5fba7
285
Rahash2
md4
xorpair
paridad
entropía
hamdist
PCPRINT
mod255
xxhash
Adler32 luhn
crc8smbus
crc15can
CRC16
crc16hdlc
crc16usb
crc16citt crc24
crc32 crc32c
crc32ecma267
crc32bzip2 crc32d
crc32mpeg2
crc32posix crc32q
crc32jamcrc
crc32xfer crc64
crc64ecma
crc64we crc64xz
crc64iso
los ph comando acepta un parámetro opcional para especificar la longitud del intervalo de bytes esté encriptado, en lugar de tamaño de bloque
286
Rahash2
[0x08049A80]> md5 pH 32
9b9012b00ef7a94b5824105b7aaad83b [0x08049A80]>
md5 pH 64
a71b087d8166c99869c9781e2edcf183 [0x08049A80]> ph
287
Herramienta Rahash
Ejemplos
La herramienta rahash2 puede ser utilizado para calcular las sumas de comprobación y tiene funciones de flujos de bytes, archivos, cadenas de texto.
$ Rahash2 -h
Uso: rahash2 [-rBhLkv] [-b S] [-a A] [H-c] [-E A] [-s S] [-f O] [-t O] [archivo] ...
- b bsize especificar el tamaño del bloque (en lugar del archivo completo)
- S semilla utilizar semillas dado (o hexa s: string) utiliza a ^ prefijo (clave para -E) (- sorber será la clave de la entrada
Para obtener un valor hash MD5 de una cadena de texto, utilice el - s opción:
5eb63bbbe01eeed093cb22bb8f5acdc3
Es posible calcular los valores hash para el contenido de los archivos. Pero no intente hacerlo por archivos muy grandes, porque rahash2
Para aplicar todos los algoritmos conocidos para rahash2, el uso todos como un nombre de algoritmo:
288
Herramienta Rahash
74ea05150acf311484bddd19c608aa02e6bf3332a0f0805a4
a1fcd494d46151df4117e1c62de0884cbc174c8db008ed1
fdfe7c7118a57c1ff8c88a51b16fc78c / bin / ls: xor 0x00000000-0x000268c7: 42 / bin / ls: xorpair 0x00000000-0x000268c7: ls d391 / bin /: paridad
0x00000000-0x000268c7: 00 / bin / ls: entropía 0x00000000-0x000268c7: 5.95471783 / bin / ls: hamdist 0x00000000-0x000268c7: 00 / bin / ls: PCPRINT
0x00000000-0x000268c7: 22 / bin / ls: mod255 0x00000000-0x000268c7: ef / / bin ls: xxhash 0x00000000-0x000268c7: 76554666 / bin / ls: Adler32
0x00000000-0x000268c7: 7704fe60 / bin / ls: 0x00000000-0x000268c7 luhn: 01 / bin / ls: crc8smbus 0x00000000-0x000268c7: 8d / bin / ls: 0x00000000
-0x000268c7 crc15can: 1cd5 / bin / ls: CRC16 0x00000000-0x000268c7: d940 / bin / ls: crc16hdlc 0x00000000-0x000268c7:7847 / bin / ls: crc16usb
0x00000000-0x000268c7: 17bb / bin / ls: crc16citt 0x00000000-0x000268c7: 67f7 / bin / ls: crc24 0x00000000-0x000268c7: 3e7053 / bin / ls: CRC32
0x00000000-0x000268c7: c713f78f / bin / ls: 0x00000000-0x000268c7 crc32c: 6cfba67c / bin / ls: crc32ecma267 0x00000000-0x000268c7: b4c809d6 / bin / ls:
crc32bzip2 0x00000000-0x000268c7: a1884a09 / bin / ls: crc32d 0x00000000-0x000268c7: d1a9533c / bin / ls: crc32mpeg2 0x00000000-0x000268c7: 5e77b5f6
/ / bin ls: 0x00000000-0x000268c7 crc32posix: 6ba0dec3 / bin / ls: crc32q 0x00000000-0x000268c7: 3166085c / bin / ls: crc32jamcrc 0x00000000-0x000268c7:
38ec0870 / bin / ls: crc32xfer 0x00000000-0x000268c7: ls 7504089d / bin /: 0x00000000 -0x000268c7 crc64: b6471d3093d94241 / bin / ls: crc64ecma
0x00000000-0x000268c7: b6471d3093d94241 / bin / ls: crc64we 0x00000000-0x000268c7: 8fe37d44a47157bd / bin / ls: crc64xz
289
plugins
plugins
radare2 se implementa en la parte superior de un montón de bibliotecas, casi todas de esas bibliotecas apoyar plugins para ampliar las capacidades de
Esta sección tiene como objetivo explicar lo que son los plugins, la forma de escribir y usarlos
Tipos de plugins
# plugins de análisis
io # plugins io
Añadir plugins
Algunas herramientas R2 tienen los - L bandera para listar todos los plugins asociados a la funcionalidad.
Hay más plugins en r2land, podemos enumerar desde el interior r2, y esto se hace mediante el uso de la L
sufijo.
290
plugins
ml # Lista fs plugins
análisis de la lista
notas
Tenga en cuenta que hay algunas inconsistencias que muy probablemente se solucionarán en las futuras versiones radare2.
291
plugins IO
plugins IO
Todo el acceso a los archivos, red, depurador y toda la entrada / salida, en general, está envuelto por una capa de abstracción que permite IO radare para tratar
plugins IO son las que se usan para envolver al aire libre, leer, escribir y 'sistema' en sistemas de archivos virtuales. Puede hacer radare entiende nada como un
archivo normal. Por ejemplo, una conexión de socket, una sesión radare remoto, un archivo, un proceso, un dispositivo, una sesión de GDB.
Por lo tanto, cuando radare lee un bloque de bytes, es la tarea de un plugin de IO para obtener estos bytes desde cualquier lugar y ponerlos en buffer
interno. Un plugin de IO es elegido por el URI de un archivo que se abrirá. Algunos ejemplos:
URI de depuración
/ ls
por $ r2 -
Usted puede obtener una lista de los plugins IO radare escribiendo radare2 -L:
292
plugins IO
$ R2 -L rw_ ar
depuración r_d depurador nativo (dbg: /// bin / ls dbg: // 1388 pidof: // waitfor: //) (LGPL3)
panqueque v0.2.0
rw_ predeterminado abrir archivos locales utilizando def_mmap: // (LGPL3) RWD GDB
rw_ gprobe conexión gprobe abierto usando gprobe: // (LGPL3) rw_ gzip
asignación de memoria malloc rw_ (malloc: // 1024 hex: // cd8090) (LGPL3) mmap rw_
rwd ptrace ptrace y / proc / pid / mem (si está disponible) io (LGPL3) QNX rwd
rap rw_ protocolo de red radare (rap: //: puerto de rap: // host: puerto / archivo) (LGPL3)
rw_ asignación de memoria intermedia escasa escasa (escasa: // 1.024 escasa: //) (LGPL3) tcp rw_
rwd WinDBG Adjuntar a un depurador KD (windbg: // socket) (LGPL3) rwd winedbg Wine-dbg io y debug.io Plugin
Abrir archivos ZIP [apk | IPA | zip | zipall]: // [archivo // path] (BSD)
293
plugins asm
Radare2 tiene una arquitectura modular, lo que añade soporte para una nueva arquitectura es muy fácil, si usted es fluido en C. Por varias
razones puede ser que sea más fácil de implementar fuera del árbol. Para esto necesitaremos para crear una sola fila C, llamado asm_mycpu.c y
RAsmPlugin r_asm_plugin_mycpu = {
. name = "Mycpu" ,
. licencia = "LGPL3" ,
. arco = "Mycpu" ,
. bits = 32 ,
. endian = R_SYS_ENDIAN_LITTLE,
dónde . desmontar es un puntero a la función de desmontaje, que acepta el tampón de bytes y la longitud:
Makefile
294
plugins asm
OBJS = $ (NOMBRE) .o SO_EXT = $ (Shell uname | grep -q Darwin && echo dylib || eco de modo)
todas: $ (LIB)
limpiar:
rm -f $ (LIB) $ (OBJS)
$ (LIB): $ (OBJS)
instalar:
desinstalar:
asm_mycpu.c
295
plugins asm
# incluir <stdio.h>
# incluir <string.h>
# incluir <r_types.h>
# incluir <r_lib.h>
# incluir <r_asm.h>
. instr = "" ,
. operandos = ""
};
Si (Ret> 0 ) {
RAsmPlugin r_asm_plugin_mycpu = {
. name = "Mycpu" ,
. licencia = "LGPL3" ,
. arco = "Mycpu" ,
. bits = 32 ,
. endian = R_SYS_ENDIAN_LITTLE,
# ifndef CORELIB
RLibStruct radare_plugin = {
. type = R_LIB_TYPE_ASM,
. version = R2_VERSION};
# terminara si
296
plugins asm
Empujar una nueva arquitectura en la rama principal de R2 requiere modificar varios archivos con el fin de que se ajuste a la forma en que el resto de los
plugins se construyen.
Comprueba cómo el plugin CPU desmontaje NIOS II se llevó a cabo mediante la lectura de esas confirmaciones:
https://github.com/radare/radare2/commit/933dc0ef6ddfe44c88bbb261165bf8f8b531476b
https://github.com/radare/radare2/commit/ad430f0d52fbe933e0830c49ee607e9b0e4ac8f2
297
plugins de análisis
Después de implementar el plugin desmontaje, usted puede haber notado que la producción está lejos de ser buena - sin resaltado adecuada, no
hay líneas de referencia y así sucesivamente. Esto se debe a radare2 requiere que cada arquitectura de plugins para proporcionar también
información de análisis de cada código de operación. Por el momento se separa la aplicación de desmontaje y opcodes análisis entre dos
módulos - Rasm y Rañal. Por lo tanto tenemos que escribir un plugin de análisis también. El principio es muy similar - sólo tiene que crear un
RAnalPlugin r_anal_plugin_v810 = {
. name = "Mycpu" ,
. licencia = "LGPL3" ,
. arco = "Mycpu" ,
. bits = 32 ,
. op = mycpu_op,
. Esil = cierto ,
. set_reg_profile = set_reg_profile,};
Al igual que con el plugin desmontaje no es una función clave - mycpu_op que escanea el código de operación y construye la estructura RAnalOp.
Por otro lado, en este ejemplo el análisis plugins también realiza el elevar a ESIL, que está habilitado en . esil = true declaración. Así, mycpu_op obligado
a llenar el campo RAnalOp ESIL correspondiente a los códigos de operación. La segunda cosa importante para ESIL edificante y emulación -
registro de perfil, al igual que en el depurador, que se encuentra dentro de set_reg_profile función.
Makefile
298
plugins de análisis
OBJS = $ (NOMBRE) .o SO_EXT = $ (Shell uname | grep -q Darwin && echo dylib || eco de modo)
todas: $ (LIB)
limpiar:
rm -f $ (LIB) $ (OBJS)
$ (LIB): $ (OBJS)
instalar:
desinstalar:
anal_snes.c:
299
plugins de análisis
# incluir <string.h>
# incluir <r_types.h>
# incluir <r_lib.h>
# incluir <r_asm.h>
# incluir <r_anal.h>
# incluir "Snes_op_table.h"
estático En t snes_anop (* RANAL anal, RAnalOp * op, addr ut64, const * ut8 datos, En t len) {
cambiar (datos[ 0 ]) {
caso 0xEA :
descanso ; }
. name = "SNES" ,
. licencia = "LGPL3" ,
. arco = R_SYS_ARCH_NONE,
. bits = dieciséis ,
. init = NULO ,
. Fini = NULO ,
. op = & snes_anop,
. set_reg_profile = NULO ,
. fingerprint_bb = NULO ,
. fingerprint_fcn = NULO ,
. diff_bb = NULO ,
. diff_fcn = NULO ,
. diff_eval = NULO
};
# ifndef CORELIB
. type = R_LIB_TYPE_ANAL,
. version = R2_VERSION};
# terminara si
300
plugins de análisis
snes_op_table. h: https://github.com/radare/radare2/blob/master/libr/asm/arch/snes/snes_op_table.h
Ejemplo:
6502: https://github.com/radare/radare2/commit/64636e9505f9ca8b408958d3c01ac8e3ce254a9b
SNES: https://github.com/radare/radare2/commit/60d6e5a1b9d244c7085b22ae8985d00027624b49
301
plugins bin
Crear una carpeta con el nombre del archivo en formato LiBr / bin / formato
Makefile:
OBJS = $ (NOMBRE) .o SO_EXT = $ (Shell uname | grep -q Darwin && echo dylib || eco de modo)
todas: $ (LIB)
limpiar:
rm -f $ (LIB) $ (OBJS)
$ (LIB): $ (OBJS)
instalar:
desinstalar:
bin_nes.c:
# incluir <r_bin.h>
estático vacío * load_bytes (* RBinFile arco, const ut8 * buf, SZ ut64, loadaddr ut64, SDB * sd
segundo) {
regreso R_NOTNULL; }
302
plugins bin
const ut8 \ * = bytes arco? r_buf_buffer (arch-> buf): NULO ; ut64 SZ = arco? r_buf_size (arch-> buf): 0 ;
gratis (jubilado);
regreso NULO ; }
ret-> file = strdup (arch-> file); ret-> type = strdup ( "ROM" ); ret->
regreso jubilado; }
. name = "ne" ,
. desc = "NES" ,
. licencia = "BSD" ,
. init = NULO ,
. Fini = NULO ,
. get_sdb = NULO ,
. load = NULO ,
. baddr = NULO ,
. entradas = NULO ,
. secciones = NULO ,
. info = e información,};
# ifndef CORELIB
303
plugins bin
. type = R_LIB_TYPE_BIN,
. version = R2_VERSION};
# terminara si
Algunos ejemplos
XBE - https://github.com/radare/radare2/pull/972
COFF - https://github.com/radare/radare2/pull/645
TE - https://github.com/radare/radare2/pull/61
Zimgz - https://github.com/radare/radare2/commit/d1351cf836df3e2e63043a6dc728e880316f00eb
OMF - https://github.com/radare/radare2/commit/44fd8b2555a0446ea759901a94c06f20566bbc40
304
otros complementos
Adición de los registros del depurador perfil en el SHLR / GDB / src / core.c
Adición de los registros de perfil y apoyo arquitectura en el LiBr / debug / p / debug_native.c y LiBr / debug / p /
debug_gdb.c
Agregue el código para aplicar los perfiles en la función r_debug_gdb_attach (RDebug * dbg, int pid)
Si desea agregar soporte para el BGF, se puede ver el perfil de registro en la sesión gdb usando comando activo registros de
impresión maint.
Extensa: https://github.com/radare/radare2/commit/6f1655c49160fe9a287020537afe0fb8049085d7
Malbolge: https://github.com/radare/radare2/pull/579
6502: https://github.com/radare/radare2/pull/656
h8300: https://github.com/radare/radare2/pull/664
GBA: https://github.com/radare/radare2/pull/702
SharpLH5801:
https://github.com/neuschaefer/radare2/commit/f4993cca634161ce6f82a64596fce45fe6b818e7
MSP430: https://github.com/radare/radare2/pull/1426
HP-PA-RISC:
https://github.com/radare/radare2/commit/f8384feb6ba019b91229adb8fd6e0314b0656f7b
V810: https://github.com/radare/radare2/pull/2899
TMS320: https://github.com/radare/radare2/pull/596
Este es un plugin simple para Z80 que se puede usar como ejemplo:
https://github.com/radare/radare2/commit/8ff6a92f65331cf8ad74cd0f44a60c258b137a06
305
otros complementos
306
plugins Python
plugins Python
En un primer momento, para poder escribir plugins en Python para radare2 es necesario instalar el plugin r2lang. Si vas a usar Python 2, a
regreso [ 1 , 2 , 3 , 4 ]
tratar :
[opcode] [ 1 ]
regreso [ 4 , Opstr]
excepto :
regreso [ 4 , "desconocido" ]
3. Esta estructura debe contener una punteros a estas 2 funciones - montar y desmontar
regreso {
"nombre" : "Mycpu" ,
"arco" : "Mycpu" ,
"bits" : 32 ,
"Endian" : "pequeño" ,
"licencia" : "GPL" ,
"montar" : Montar,
"desmontar" : Desmonte,}
307
plugins Python
def set_reg_profile () :
"= SP sp \ n" + \
"GPR r0 . 32 0 0 \ n" + \
"GPR r1 . 32 4 0 \ n" + \
"GPR r2 . 32 8 0 \ n" + \
"GPR R3 . 32 12 0 \ n" + \
"GPR R5 . 32 20 0 \ n" + \
"GPR sp . 32 24 0 \ n" + \
"GPR . 32
ordenador personal 28 0 \ n"
regreso perfil
analop = {
"tipo" : R.R_ANAL_OP_TYPE_NULL,
"ciclos" : 0 ,
"Stackop" : 0 ,
"Stackptr" : 0 ,
"PTR" : -1 ,
"saltar" : -1 ,
"Addr" : 0 ,
"EOB" : Falso ,
"Esil" : "" ,
tratar :
[opcode] [ 2 ]
excepto :
resultado = analop
regreso [ 4 , Resultado]
308
plugins Python
regreso {
"nombre" : "Mycpu" ,
"arco" : "Mycpu" ,
"bits" : 32 ,
"licencia" : "GPL" ,
"Esil" : 1 ,
"Set_reg_profile" : Set_reg_profile,
"Op" : Op,}
1. A continuación, registre los que utilizan r2lang.plugin ( "asm") y r2lang.plugin ( "anal") respectivamente
r2 -I some_file.bin mycpu.py
Ver también:
Javascript
Python
Nota - En los siguientes ejemplos hay funciones que faltan de la decodificación real para facilitar la lectura!
1. r2lang importación
carga
load_bytes
destruyen
309
plugins Python
check_bytes baddr
entradas secciones
importaciones
reubicaciones binsym
información
regreso [ 0 ]
tratar :
Si buf [ 0 ] == 77 y buf [ 1 ] == 90 :
regreso [ 1 ]
regreso [ 0 ]
excepto :
regreso [ 0 ]
y así. Por favor asegúrese de los parámetros de cada función y el formato de los retornos. Tenga en cuenta, que las funciones entradas, secciones,
las importaciones, las reubicaciones devuelve una lista de los diccionarios especiales formados cada uno con un tipo diferente de. Otras funciones
devuelven sólo una lista de valores numéricos, incluso si uno solo elemento. Hay una función especial, que devuelve información sobre el
archivo - Info:
regreso [{
"tipo" : "Le" ,
"Bclass" : "Le" ,
"Rclass" : "Le" ,
"subsistema" : "CLI" ,
"máquina" : "IBM" ,
"Has_va" : 0 ,
"bits" : 32 ,
"BIG_ENDIAN" : 0 ,
"Dbg_info" : 0 ,}]
310
plugins Python
3. Esta estructura debe contener una punteros a las funciones más importantes como check_bytes, carga
regreso {
"nombre" : "Le" ,
"licencia" : "GPL" ,
"carga" : carga,
"load_bytes" : load_bytes,
"destruir" : Destruir,
"check_bytes" : check_bytes,
"Baddr" : Baddr,
"entradas" : entradas,
"secciones" : secciones,
"importaciones" Importaciones,
"símbolos" : símbolos,
"reubicaciones" : reubicaciones,
"Binsym" : Binsym,
"Info" : Información,}
311
depuración
depuración
Es común tener un problemas al escribir un plugin, sobre todo si lo hace por primera vez. Esta es la razón por la depuración de ellos es muy
importante. El primer paso para la depuración es establecer una variable de entorno cuando se ejecuta ejemplo radare2:
= sí ls / bin / R_DEBUG r2
Cargando /usr/local/lib/radare2/2.2.0-git//bin_xtr_dyldcache.so
0x7f298de08762
Cargando /home/user/.config/radare2/plugins/core_yara.so
0x7f298de08762
0x7f298de08692
Cargando /usr/local/lib/radare2/2.2.0-git/bin_xtr_dyldcache.so
Directory No se puede abrir el directorio '/ usr / / lib / radare2-bindings / 2.2.0-git' usuario local de configuración
cargadas de /home/user/.config/radare2/radare2rc
- - En el modo visual de prensa 'c' para cambiar el modo de cursor. Utilice la pestaña para navegar [0x00005520]>
312
Pruebas
Probando el plugin
Este plugin es utilizado por rasm2 y r2. Puede verificar que el complemento se carga correctamente con este comando:
Vamos a abrir un archivo vacío usando el arco 'mycpu' y escribir un código aleatorio allí.
$ R2 -
- - Canje I endians
WOR [0x00000000]> PD 10
313
embalaje
Como se acuerde radare2 tiene su propio gestor de envases y podemos añadir fácilmente plug-in recién escrito para todos el acceso.
Todos los paquetes se encuentran en radare2-pm repositorio, y tienen formato de texto muy simple.
R2PM_BEGIN
R2PM_GIT "https://github.com/user/mycpu"
R2PM_INSTALL () {
$ {} MAKE limpia
R2PM_UNINSTALL () {
R2PM_PLUGDIR / anal_mycpu." *}
R2PM_END
A continuación, añadir que en el / db directorio de radare2-pm repositorio y enviar una solicitud de extracción a la línea principal.
314
Crackmes
Crackmes
Crackmes (de "Agriéteme" desafío) son el campo de entrenamiento para la gente de ingeniería inversa. Esta sección repasará tutoriales
315
IOLI
IOLI CrackMes
El crackme IOLI es un buen punto de partida para el aprendizaje r2. Se trata de un conjunto de tutoriales basados en el tutorial dustri
316
IOLI 0x00
IOLI 0x00
$ ./crackme0x00
El primero que hay que comprobar es si la contraseña es sólo texto plano dentro del archivo. En este caso, no es necesario hacer ningún desmontaje, y
sólo podemos utilizar rabin2 con la bandera -z para buscar cadenas en el binario.
$ Rabin2 -z ./crackme0x00
vaddr = 0x08048568 PADDR = 0x00000568 ordinal = 000 sz = 25 len = 24 sección = tipo .rodata = una cadena = IOLI Crackme Nivel 0x00 \ n
vaddr = 0x08048581 0x00000581 = PADDR ordinal = 001 SZ = 11 len = 10 = sección tipo .rodata = una cadena = Contraseña:
vaddr = 0x0804858f PADDR = 0x0000058f ordinal = 002 sz = 7 len = 6 sección = tipo .rodata = una cadena = 2 50 382
vaddr = 0x08048596 0x00000596 = PADDR ordinal = 003 SZ = 19 len = 18 = sección tipo .rodata = una cadena = Contraseña no válida! \ n
vaddr = 0x080485a9 PADDR = 0x000005a9 ordinal = 004 SZ = 16 len = 15 = sección tipo .rodata = una cadena = Contraseña OK:) \ n
Así que sabemos lo que la siguiente sección es, esta sección es la cabecera se muestra cuando se ejecuta la aplicación.
vaddr = 0x08048568 PADDR = 0x00000568 ordinal = 000 sz = 25 len = 24 sección = tipo .rodata = una cadena = IOLI Crackme Nivel 0x00 \ n
vaddr = 0x08048581 0x00000581 = PADDR ordinal = 001 SZ = 11 len = 10 = sección tipo .rodata = una cadena = Contraseña:
vaddr = 0x08048596 0x00000596 = PADDR ordinal = 003 SZ = 19 len = 18 = sección tipo .rodata = una cadena = Contraseña no válida! \ n
317
IOLI 0x00
vaddr = 0x080485a9 PADDR = 0x000005a9 ordinal = 004 SZ = 16 len = 15 = sección tipo .rodata = una cadena = Contraseña OK:) \ n
¿Pero qué es esto? Es una cadena, pero no lo hemos visto en el funcionamiento de la aplicación todavía.
vaddr = 0x0804858f PADDR = 0x0000058f ordinal = 002 sz = 7 len = 6 sección = tipo .rodata = una cadena = 2 50 382
$ ./crackme0x00
250382 Contraseña OK :)
Así que ahora sabemos que 250.382 es la contraseña, y hemos completado este crackme.
318
IOLI 0x01
IOLI 0x01
$ ./crackme0x01
$ Rabin2 -z ./crackme0x01
vaddr = 0x08048528 PADDR = 0x00000528 ordinal = 000 sz = 25 len = 24 sección = tipo .rodata = una cadena = IOLI Crackme Nivel 0x01 \ n
vaddr = 0x08048541 0x00000541 = PADDR ordinal = 001 SZ = 11 len = 10 = sección tipo .rodata = una cadena = Contraseña:
vaddr = 0x0804854f PADDR = 0x0000054f = 002 ordinal SZ = 19 len = 18 = sección tipo .rodata = una cadena = Contraseña no válida! \ n
vaddr = 0x08048562 0x00000562 = PADDR ordinal = 003 SZ = 16 len = 15 = sección tipo .rodata = una cadena = Contraseña OK:) \ n
Esto no va a ser tan fácil como 0x00. Vamos a tratar de desmontaje con R2.
319
IOLI 0x01
$ R2 ./crackme0x01
- - Use `zoom.byte = printable` en el modo de zoom ( 'z' en el modo visual) para buscar cadenas [0x08048330]> a bis [0x08048330]> pdf @
| sym.imp.printf (unk)
| sym.imp.printf ()
| sym.imp.scanf ()
| | sym.imp.printf ()
| | sym.imp.printf ()
| 0x08048453 C9 salir
\ 0x08048454 c3 jubilado
"Aa" dice r2 analizar todo el binario, que le consigue los nombres de símbolos, entre las cosas.
320
IOLI 0x01
"Pdf" significa
Impresión
Desmontar
Función
Esto imprimirá el desmontaje de la función principal, o el principal() que todo el mundo sabe. Se puede ver varias cosas así: nombres
"diablillo." siglas de las importaciones. Esos símbolos son importados, como printf ()
Si se mira con cuidado, verá una cmp instrucción, con una constante, 0x149a. cmp es un x86 comparar la instrucción, y el 0x delante de
[0x08048330]>? 0x149a
5274 012232 0x149a 5.2k 0000: 049a 5274 10011010 5.274,0 0.000000
Así que ahora sabemos que es 0x149a 5274 en decimal. Vamos a tratar esto como una contraseña.
$ ./crackme0x01
5274 Contraseña OK :)
Bingo, la contraseña era 5274. En este caso, la función de contraseña en 0x0804842b estaba comparando la entrada contra el valor, 0x149a en hexadecimal.
Desde la entrada del usuario suele ser decimal, que era una apuesta segura que la entrada estaba destinado a ser en decimal o 5274. Ahora, ya que somos los
piratas informáticos, y la curiosidad que nos mueve, vamos a ver lo que sucede cuando la entrada en hexadecimal.
$ ./crackme0x01
321
IOLI 0x01
Era digno de un tiro, pero no funciona. Eso es porque scanf () tomará el 0 en 0x149a sea un cero, en lugar de aceptar la entrada
322
IOLI 0x01
. Introducción
Después de algunos años de dejar de lado los juegos de guerra en Hacktivity , Este año por fin he encontrado el momento de empezar, y
casi terminar (sí, estoy muy avergonzado de que webhack sin terminar :)) uno de ellos. Hubo 3 juegos diferentes en el conf, y he elegido
el que fue proporcionada por avatao . Consistía en 8 desafíos, la mayoría de ellos web básico piratería cosas, una caja de arena de
escape, una sencilla desbordamiento del búfer de la explotación, y había dos ejercicios de ingeniería inversa también. Puede encontrar
323
IOLI 0x01
.radare2
Me he decidido a resolver los retos de marcha atrás utilizando radare2 , Una fuente libre y abierto, con el sistema de ingeniería. He aprendido primero
sobre r2 terminada en 2011 durante un proyecto enorme, donde tenía que revertir una 11MB enlazado estáticamente ELF masiva,. Simplemente
necesitaba algo que podría fácilmente parchear ELF Linux con. Por supuesto, en ese entonces he utilizado R2 junto con la AIF, y sólo para tareas más
pequeñas, pero me encantó el concepto a primera vista. Desde entonces, radare2 evolucionado mucho, y yo estaba planeando desde hace algún
tiempo para resolver algunos crackmes con el marco, y escribir los relatos acerca de ellos. Pues bien, este CTF me dio la oportunidad perfecta :)
Debido a que esta valoración crítica pretende mostrar algunas de las características de r2, además de cómo se pueden resolver los crackmes, voy a explicar todos los
Si conoces a r2, y sólo está interesado en el crackme, puede saltarse las partes! También hay que tener en cuenta por favor, que a causa de este
estilo tutorial voy a hacer un montón de cosas que simplemente no se hace durante un CTF, porque no hay tiempo para llevar la contabilidad
adecuada (por ejemplo, la bandera de cada área de memoria en función de su propósito), y con tan pequeños ejecutables que puede tener éxito sin
Algunos consejos si usted está interesado en aprender radare2 (y francamente, si usted está en el RE, usted debe estar interesado en aprender r2
:)):
El marco tiene una gran cantidad de ejecutables suplementarios y una gran cantidad de funcionalidad - y ellos están muy bien
documentados. Me animo a leer los documentos disponibles, y utilizar la ayuda integrada (si se añade un? A cualquier comando)
ampliamente! P.ej:
324
IOLI 0x01
[0x00000000]>?
[.]: Uso [veces] [cmd] [~ grep] [! @ [@ Iter] addr tamaño] [|> tubería]; ... Adjuntar '?' a cualquier comando de
carbón para obtener ayuda detallada Prefijo con el número de veces para repetir comandos N (f.ex: 3x) |% var =
| . [- |! (M) | f | sh | cmd] Definir macro o de carga R2, cparse o archivo rlang | = [Cmd]
. . .
[0x00000000]> a?
| Automóvil club británico analizar todos (fcns + bbs) (AA0 para evitar sub cambio de nombre)
. . .
Además, el proyecto está en fuerte desarrollo, no hay día sin que se compromete con el repositorio GitHub. Así que, como dice el readme, se
Radare2 Wiki
325
IOLI 0x01
. primeros pasos
OK, suficiente de alabar r2, vamos a empezar a revertir esto. En primer lugar, usted tiene que conocer al enemigo:
falso
canario cierto nx
cierto
VA falsa cripto
cierto
ELF64
lang do
arco x86
los bits 64
Linux
lsyms verdaderos
falso
NINGUNA
binsz 8620
punta r2: rabin2 es una de las herramientas útiles que viene con radare2. Se puede utilizar para extraer información (importaciones,
símbolos, bibliotecas, etc.) sobre binarios ejecutables. Como siempre, verifique la ayuda (-h rabin2)!
Por lo tanto, es una forma dinámica ligada, despojado, Linux de 64 bits ejecutable - nada especial aquí. Vamos a tratar de ejecutarlo:
pamparam incorrecto!
[0x00 avatao] $ "\ x01 \ x00 \ x00 \ x00" | Tamaño ./reverse4 de datos: 1
326
IOLI 0x01
Aceptar, por lo que se lee un número como el tamaño de la entrada estándar en primer lugar, que lee más, probablemente bytes "tamaño" /
caracteres, procesa esta entrada y salidas, ya sea "incorrecto!", Nada o algo más, presumiblemente nuestra bandera. Pero no perder más
- - Heisenbug: Un error que desaparece o altera su comportamiento cuando se intenta sondear o aislarlo. [0x00400720]>
punta r2: El parámetro -A corre aaa comando en principio a analizar todo el código de referencia, por lo que tendrá funciones, cuerdas, referencias
externas, etc. justo al principio. Como de costumbre, puede obtener ayuda con?.
Es una buena práctica para crear un proyecto, por lo que puede salvar nuestro progreso, y que puede volver en un momento posterior:
[0x00400720]>
punta r2: Puede guardar un proyecto utilizando Sal [Archivo], y cargar uno usando Po [Archivo]. Con la opción -p, se puede cargar un
0x00400e98 7 str.Wrong_
str.Your_getting_closer_ [0x00400720]>
punta r2: R2 pone llamados banderas en las compensaciones importantes / interesantes, y organiza estas banderas en flagspaces (cadenas,
funciones, símbolos, etc.) Puede enumerar todos los flagspaces usando fs, y cambiar el actual usando fs [flagspace] ( el valor predeterminado es
327
IOLI 0x01
OK, las cuerdas se ve interesante, sobre todo el de 0x00400f92. Parece dar a entender que este crackme se basa en una máquina
Estas cadenas pueden ser un buen punto de partida si estábamos hablando de una aplicación en la vida real con características manymany.
Pero estamos hablando de un crackme, y tienden a ser pequeños y simples, y se centró alrededor del problema a resolver. Así que por lo
general sólo echar un vistazo en el punto (s) de entrada y ver si puedo averiguar algo de allí. Sin embargo, te voy a mostrar cómo encontrar
str.Your_getting_closer_
punta r2: Podemos enumerar referencias cruzadas a las direcciones utilizando el axt [addr] comando (de manera similar, podemos utilizar axf para listar las
referencias de la dirección). El @@ es un iterador, que sólo se ejecuta el comando una vez para cada argumentos mencionados.
La lista de argumentos en este caso proviene de la orden f ~ [0]. En él se enumeran las cuerdas desde el ejecutable con F, y utiliza el
comando interno grep ~ para seleccionar sólo la primera columna ([ 0]) que contiene las direcciones de las cuerdas.
328
IOLI 0x01
. principal
A lo que iba, por lo general a echar un vistazo en el punto de entrada, así que vamos a hacer lo siguiente:
[0x00400720]> s principal
[0x00400c63]>
punta r2: Usted puede ir a cualquier desplazamiento, bandera, expresión, etc., en el ejecutable mediante el s comando (buscar). Puede utilizar
referencias, como $$ (offset actual), puede deshacer ( s-) o rehacer ( s +) busca, cadenas de búsqueda ( s / [cadena]) o valores hexadecimales ( s /
Ahora que estamos al inicio de la función principal, podríamos utilizar pag para mostrar un desmontaje ( pd, pdf),
pero R2 puede hacer algo mucho más fresco: tiene un modo visual, y puede mostrar gráficos similares a la AIF, pero mucho más frías, ya que son los
punta r2: La familia de comandos pag se utiliza para imprimir cosas. Por ejemplo, puede mostrar desmontaje ( pd),
desmontaje de la función actual ( pdf), (cadenas de impresión PD), hexdump ( px), base64 codificar / decodificar datos ( p6e, P6D), o imprimir
bytes primas ( PR) por lo que puede, por ejemplo, volcar partes del binario a otros archivos. Hay muchas más funcionalidades, comprobar?!
R2 también tiene una vista minimapa que es increíblemente útil para obtener una visión general de una función:
329
IOLI 0x01
330
IOLI 0x01
punta r2: con el comando V puede introducir el llamado modo visual, que tiene varios puntos de vista. Se puede cambiar entre ellos
utilizando pag y pag. La vista gráfica puede visualizarse pulsando V en el modo visual (o usando VV en el indicador).
golpear pag en la vista gráfica se abre el minimapa. Muestra los elementos básicos y las conexiones entre ellos en la función
actual, y también muestra el desmontaje del bloque actualmente seleccionado (marcado con @@@@@ en el minimapa).
Puede seleccionar el siguiente o el bloque anterior utilizando el * \ * y las teclas * \\ * respectivamente. También puede
Es posible que aparezca el símbolo en modo visual utilizando la llave, y se puede utilizar o buscar.
Podemos ver que el programa lee una palabra (2 bytes) en la variable local llamada local_10_6, y que lo compara con 0xbb8. Eso es
[0x00400c63]>? 0xbb8
3000 0xbb8 05670 2.9k 0000: 3000 10111000 0bb8 3000.0 0.000000f 0.000000
331
IOLI 0x01
En primer lugar, el "Tamaño de datos:" mensaje que vio cuando se corre el programa está impreso. Así que ahora sabemos que la variable local local_10_6 es el
tamaño de los datos de entrada - por lo que permite nombrar en consecuencia: (recuerde, usted puede abrir la concha r2 desde el modo visual utilizando la
tecla:!)
332
IOLI 0x01
punta r2: los af familia comando se utiliza para analizar funciones. Esto incluye la manipulación de argumentos y variables locales también, que es
accesible a través de la AFV comandos. Puede enumerar los argumentos de funciones ( afa), (variables locales AFV), o incluso se puede cambiar el
nombre de ellos ( afan, AFVN). Por supuesto que hay muchas otras características también - como de costumbre: utilizar el, Lucas "?"!
Después de esto una input_size bytes trozo largo memoria se asigna, y se llena con datos de la entrada estándar. La dirección de este trozo de
Casi hemos terminado con este bloque, sólo hay dos cosas se mantuvieron. En primer lugar, un 512 (0x200) bytes trozo de memoria se pone a cero a
cabo en 0x00602120 offset. Un rápido vistazo a las referencias externas a esta dirección revela que esta memoria se utiliza de hecho en algún lugar de la
aplicación:
punta r2: Las banderas pueden ser gestionados mediante el F familia de órdenes. Acabamos de agregar el sym.memory bandera a una zona
de memoria a largo bytes 0x200 en 0x602120. También es posible eliminar ( fname), renombrar ( fr [de edad] [nuevo]), agregar comentario ( fC
Mientras estamos aquí, también debe declarar ese pedazo de memoria como datos, por lo que se mostrará como un hexdump en vista de desmontaje:
punta r2: La familia de comandos do se utiliza para gestionar los metadatos. Puede configurar ( CC) o editar ( CC)
comentarios, declaran áreas de memoria como datos ( Discos compactos), (cuerdas Cs), etc. Estos comandos también se pueden emitir a través de un menú en
333
IOLI 0x01
Lo único que queda en este bloque es una llamada a la función 0x400a45 con los datos de entrada como un argumento. valor de retorno de
la función se compara con "*", y un salto condicional está ejecutado en función del resultado.
Antes he dicho que este crackme se basa probablemente en una máquina virtual. Pues bien, con esta información en mente, se puede adivinar que
esta función será bucle principal de la máquina virtual, y los datos de entrada es las instrucciones de la máquina virtual se ejecutará. En base a este
datos de entrada a código de bytes y input_size a bytecode_length. Esto no es realmente necesario en un pequeño proyecto como este, pero es una buena práctica
para nombrar las cosas de acuerdo a su propósito (al igual que cuando usted está escribiendo programas).
código de bytes
punta r2: los af comando se utiliza para analizar una función con un nombre dado en la dirección indicada. Los otros dos comandos deben
Después de cambiar el nombre de las variables locales, marcar esa área de memoria, y cambiar el nombre de la función de bucle VM el desmontaje se ve
así:
334
IOLI 0x01
Así, de nuevo a ese salto condicional. Si vmloop devuelve cualquier otra cosa que no sea "*", el programa simplemente sale sin darnos nuestra
Ahora vemos que una cadena en esa área de memoria de 512 bytes ( sym.memory) obtiene en comparación con "Tal VM! reV3rse tanto!". Si no
Aceptar, por lo que ahora sabemos que tenemos que proporcionar un código de bytes que generará esa cadena cuando es ejecutado. Como podemos ver en
el minimapa, todavía hay unas cuantas más ramificaciones por delante, lo que probablemente significa más condiciones a cumplir. Vamos a investigar antes de
profundizar en vmloop!
Si se echa un vistazo en el minimapa de toda la función, es probable que pueda reconocer que hay una especie de bucle empieza por el
[ 0d34]
[ 0d65]
[ 0d3d]
[ 0d61]
Estas son las fichas de montaje de los bloques. El primero pone 0 en la variable local local_10_4:
335
IOLI 0x01
Es bastante obvio que local_10_4 es el contador del bucle, por lo que permite nombrarlo en consecuencia:
336
IOLI 0x01
El área de memoria en 0x6020e0 es tratada como una matriz de dwords (4 valores de bytes), y se comprueba si el valor i-ésimo de ella es cero. Si no es
337
IOLI 0x01
Se imprime el siguiente mensaje: Utilice todo "Como hemos establecido anteriormente, se trata de una máquina virtual En ese contexto, este
mensaje probablemente significa que tenemos que utilizar cada instrucciones disponibles Ya sea que ejecuta una instrucción o no es!.. almacenado
Suponiendo que no rompemos y el bucle se completa, nos estamos moviendo encendido a más comprobaciones:
Esta pieza de código puede parecer un poco extraño si no está familiarizado con la materia específica x86_64. En particular, estamos hablando de
RIP-direccionamiento relativo, donde se describen los desplazamientos como desplazamientos desde el puntero de instrucción en curso, lo que hace que la
implementación de PIE más fácil. De todas formas, r2 es lo suficientemente bueno para mostrar la dirección real (0x602104). Consiguió la dirección, bandera él!
Tenga en cuenta, sin embargo, que si se utiliza RIP-direccionamiento relativo, banderas no aparecerán directamente en el desmontaje, pero r2 los
338
IOLI 0x01
Si sym.good_if_ne_zero es cero, obtenemos un mensaje ( "Su cada vez más cerca!"), y el programa se cierra. Si es distinto de cero, se pasa a la
última comprobación:
Aquí, el programa compara un valor DWORD en 0x6020f0 (de nuevo, RIP-direccionamiento relativo) a 9. Si su mayor que 9, se obtiene la misma
"Su cada vez más cerca!" mensaje, pero si es menor o igual a 9, por fin llegamos a nuestro destino, y conseguir la bandera:
339
IOLI 0x01
Pues bien, parece que hemos invertido completamente la función principal. Para resumir: el programa lee un código de bytes de la entrada estándar,
y la alimenta a una máquina virtual. Después de la ejecución de VM, el estado del programa tienen que satisfacer estas condiciones con el fin de
sym.memory tiene que contener la cadena "Tal VM! CUÁNTO reV3rse!" los 9 elementos de sym.instr_dirty array no debe ser cero (probablemente
significa que todas las instrucciones se tuvieron que utilizar al menos una vez)
Con esto concluye nuestro análisis de la función principal, podemos ahora pasar a la propia máquina virtual.
340
IOLI 0x01
.vmloop
[Desplazamiento]> fcn.vmloop
Bueno, eso parece decepcionantemente corta, pero no se preocupe, sin embargo, tenemos un montón de revertir. El caso es que esta función utiliza una tabla
de saltos en 0x00400a74,
y R2 no puede reconocer tablas de salto ( Edición 3201 ), Por lo que el análisis de esta función es un poco incompleta. Esto significa que en realidad no
podemos usar la vista de gráfico ahora, para que ya sea que sólo tiene que utilizar el modo visual, o fijar esos bloques básicos. La función entera está a
sólo 542 bytes de longitud, por lo que sin duda podría revertir sin la ayuda del modo gráfico, pero ya que esta valoración crítica pretende incluir tanta
sabiduría r2 como sea posible, voy a mostrar cómo definir bloques básicos.
341
IOLI 0x01
Pero primero, vamos a analizar lo que ya tenemos! Primero, RDI se pone en local_3. Dado que la aplicación es un ejecutable de Linux de 64
bits, sabemos que RDI es el primer argumento de la función (como puede haber reconocido, el análisis automático de los argumentos y variables
vmloop' s primer argumento es el código de bytes. Por lo que permite cambiar el nombre de local_3:
Siguiente, sym.memory se pone en otra variable local en RBP-8 R2 que no reconoció. Así que vamos a definir él!
punta r2: los afv [idx] [nombre] [tipo] comando se utiliza para definir la variable local en [idx puntero de marco] con el nombre de
[nombre] y escriba [tipo]. También puede eliminar las variables locales utilizando el afv [idx] mando.
En el siguiente bloque, el programa comprueba un byte de código de bytes, y si es 0, la función devuelve con 1.
Si ese byte no es cero, el programa resta 0x41 de ella, y compara el resultado con 0x17. Si es superior a 0x17, obtenemos el temido
"mal!" mensaje, y la función devuelve con 0. Esto significa básicamente que bytecodes válidos son caracteres ASCII en el rango de
"A" (0x41) a través de "X" (0x41 + 0x17). Si el código de bytes es válida, se llega a la pieza de código que utiliza la tabla de saltos:
La base de la tabla de saltos está en 0x400ec0, por lo que permite definir esa área de memoria como una serie de QWords:
342
IOLI 0x01
[0x00400a74]> s 0x00400ec0
[0x00400ec0]> Cd 8 @@ = `? S $$ $$ + 8 * 0x17 8`
punta r2: Excepto por el ? s, todas las partes de este comando deben estar familiarizados ahora, pero vamos a recapitular él! Discos compactos
define un área de memoria como datos, y 8 es el tamaño de esa área de memoria. @@ es un iterador que hacen la carrera comando
anterior para cada elemento que tiene @@. En este ejemplo se lleva a cabo una serie generada utilizando el? s mando. ? s simplemente
genera una serie de la corriente de buscar ($$) para buscar la actual + 8 0x17 ($$ + 8 0x17) con un paso de 8.
[0x00400ec0]> pd 0x18
0x0000000000400c04 0x00400f70.
Como podemos ver, la 0x400c04 dirección se usa mucho, y además de eso hay 9 direcciones diferentes. Vamos a ver que 0x400c04 primero!
343
IOLI 0x01
Obtenemos el mensaje "Wrong!", Y la función sólo devuelve 0. Esto significa que los que no son válidos (instrucciones de código de bytes que son
válidas sin embargo, pueden ser, por ejemplo parámetros!) Bandera Debemos 0x400c04 en consecuencia:
En cuanto a las otras compensaciones, todos parecen estar haciendo algo significativo, por lo que podemos suponer que pertenecen a las instrucciones
Ok, por lo que estos desplazamientos no estaban en el gráfico, por lo que es el momento de definir los bloques básicos para ellos!
punta r2: Se pueden definir bloques básicos utilizando el AFB + mando. Usted tiene que suministrar lo que la función pertenece el
bloque a, ¿de dónde empezar, y cuál es su tamaño. Si el bloque termina en un salto, tiene que especificar dónde saltar también. Si
el salto es un salto condicional, dirección de destino de la falsa rama debe especificarse también.
Podemos obtener las direcciones de inicio y final de estos bloques básicos de la disasm llena de vmloop.
344
IOLI 0x01
345
IOLI 0x01
Como he mencionado anteriormente, la función en sí es bastante corto y fácil de leer, especialmente con nuestras anotaciones. Pero una promesa es
una promesa, por lo que aquí es cómo podemos crear los bloques Bačić que faltan para las instrucciones:
También es evidente desde el desmontaje que además de las instrucciones que hay tres bloques básicos. Vamos a crear ellos también!
[0x00400ec0]> AFB + 0x00400a45 0x00400c15 0x00400c2d-0x00400c15 0x400c3c 0x00400c2d [0x00400ec0]> AFB + 0x00400a45 0x00400c2d
Tenga en cuenta que los elementos básicos a partir de las 0x00400c15 y 0x00400c2d que termina en un salto condicional, así que tuvimos que establecer el destino de
Y aquí está el gráfico en todo su esplendor después de un poco de la reestructuración del manual:
346
IOLI 0x01
Creo que vale la pena, ¿verdad? :) (Bueno, la reestructuración realmente no vale la pena, ya que al parecer no se guarda cuando se guarda
el proyecto.)
punta r2: Se puede mover el nodo seleccionado en torno a la vista gráfico usando las teclas hjkl.
Por cierto, aquí es cómo gráfica de esta misma función de la AIF se ve como para la comparación:
347
IOLI 0x01
A medida que navega por el desmontaje de la instr_LETTER elementos básicos, que deben darse cuenta de algunas cosas. La primera: todas las
Se hizo evidente ahora que las 9 en dwords sym.instr_dirty No son simplemente indicadores que consiguió una instrucción se ejecuta, sino que
se utilizan para contar cuántas veces una instrucción fue llamado. También me he dado cuenta de que antes sym.good_if_le_9 ( 0x6020f0) es
parte de esta matriz 9 DWORD, pero sí, bueno, yo no, tengo que vivir con ello ... De todas formas, lo que la condición " sym.good_if_le_9 tiene
que ser menor o igual 9" realmente significa es que instr_P no puede ser ejecutado a más de 9 veces:
Otra similitud de las instrucciones es que 7 de ellos llama a una función, ya sea con uno o dos parámetros, donde los parámetros son
348
IOLI 0x01
También debemos darnos cuenta de que estos bloques indican que el número de bytes que se comen del código de bytes (1 byte de instrucción + 1 o 2
bytes argumentos = 2 ó 3) en una variable local en 0xc. R2 no reconoció este var, por lo que permite hacerlo de forma manual!
Si nos fijamos en instr_J podemos ver que esto es una excepción a la regla anterior, ya que pone el valor de retorno de la función de llamada en instr_ptr_step
Y hablando de excepciones, aquí están las dos instrucciones que no invocan funciones:
349
IOLI 0x01
Éste simplemente pone el siguiente código de bytes (el primer argumento) en eax, y salta hasta el final de
vmloop. Así que este es el VM jubilado instrucción, y sabemos que vmloop tiene que volver "*", por lo que "R *" deben ser los dos últimos bytes de nuestro
código de bytes.
Esta es una instrucción de un argumento, y pone a su argumento 0x6020c0. Bandera esa dirección!
Ah, y por cierto, yo tengo el presentimiento de que instr_C También tenía una llamada de función en el código original, pero quedó inlined por el compilador. De
instr_I
instr_D
instr_P
instr_X
instr_J
instr_A
instr_S
Lo que queda es la reversión de las siete funciones que son llamadas por las instrucciones, y, finalmente, la construcción de un código de bytes
instr_A
350
IOLI 0x01
La función de esta instrucción es llama en el desplazamiento 0x40080d, por lo que permite buscar allí!
[Desplazamiento]> 0x40080d
punta r2: En el modo visual puede simplemente presionar \ cuando la línea actual es un salto o una llamada, y r2 se tratará de la dirección de
destino.
Si buscamos a esa dirección desde el modo gráfico, se nos presenta con un mensaje que dice "No de una función. Tipo 'df' para definir aquí.
Esto es debido a que la función se llama desde un r2 bloque básico no reconoció, así que R2 no pudo encontrar la función tampoco. Vamos a
obedecer, y el tipo df! Una función se crea de hecho, pero queremos un nombre significativo para él. Así prensa Dr mientras que aún en modo
instr_A!
punta r2: Usted debe darse cuenta de que estos comandos son parte del mismo sistema de menú en el modo visual que estaba hablando cuando se utilizó
Ok, ahora tenemos nuestro nuevo y brillante fcn.instr_A, vamos a invertirlo! Podemos ver en la forma del minimapa que probablemente hay algún tipo
de conexión en cascada si-entonces-elif, o una declaración switch de los casos implicados en esta función. Esta es una de las razones que el
351
IOLI 0x01
vista, lo que le puede ayudar en su análisis (recordemos el fácilmente reconocible para el bucle de unos pocos párrafos antes?) Por lo tanto, el minimapa
es fresco y útil, pero yo sólo he dado cuenta de que yo no todavía a mostrar el modo gráfico completo, así que voy a hacer esto utilizando el gráfico
Los dos argumentos de la función ( RDI y RSI) se almacenan en las variables locales, y la primera se compara con 0. Si es así, la función devuelve
(se puede ver en el minimapa), de lo contrario la misma comprobación se ejecuta en el segundo argumento. La función devuelve desde aquí
también, si el argumento es cero. Aunque esta función es muy pequeño, voy a seguir con mi metodología, y cambiar el nombre de los VARs
locales:
local_2 arg2
Y hemos llegado a la sentencia switch de los casos se predijo, y podemos ver que arg1' valor s se comprueba con "M", "P", y "C".
352
IOLI 0x01
Básicamente, se carga una dirección de desplazamiento y suma 0x602088 arg2 al byte en esa dirección. Como r2 nos muestra amablemente en un
comentario, 0x602088 inicialmente contiene la dirección de sym.memory, la zona en la que tenemos que construir la "Tal VM! reV3rse tanto!" cuerda.
Es seguro asumir que de alguna manera seremos capaces de modificar el valor almacenado en 0x602088, por lo que esta rama "M" será capaz de
modificar otros bytes que el primero. Sobre la base de este supuesto, voy a marcar como 0x602088 sym.current_memory_ptr:
353
IOLI 0x01
Sí, esta es la pieza de código que nos permite modificar sym.current_memory_ptr: se añade arg2 lo.
Bueno, resultó que instr_C no es la única instrucción que modifica sym.written_by_instr_C: esta pieza de código añade arg2 lo.
Y eso fue instr_A, vamos a resumir ella! Dependiendo del primer argumento, esta instrucción hace lo siguiente:
arg1 == " M ": agrega arg2 para el byte en sym.current_memory_ptr. arg1 == " P ":
instr_S
Esta función no está reconocido, ya sea, por lo que tenemos que definir manualmente como lo hicimos con instr_A. Después de que hacemos, y echar un
vistazo al minimapa, desplazarse a través de los elementos básicos, es bastante obvio que estas dos funciones son muy-muy similar. Nosotros podemos usar radiff2
354
IOLI 0x01
punta r2: radiff2 se utiliza para comparar los archivos binarios. Hay algunas opciones que podemos controlar el tipo de diffing binario Utilidad de la
herramienta, y en qué tipo de formato de salida que desee. Una de las características interesantes es que puede generar DarumGrim al estilo de
Desde ahora queremos diferencia de dos funciones del mismo binario, especificamos las compensaciones con - sol, y utilizar reverse4 tanto
para los binarios. Además, creamos los gráficos para comparar instr_A a instr_S y para comparar instr_S a instr_A.
355
IOLI 0x01
Una triste verdad se revela después de un rápido vistazo a estos gráficos: radiff2 es un mentiroso! En teoría, las cajas grises deben ser idénticos, los amarillos
deben sólo se diferencian en algunos desplazamientos, y los rojos deben diferir en serio. Bueno, esto es obviamente no es el caso aquí - por ejemplo, las cajas
grises más grandes no son claramente idénticos. Esto es algo que definitivamente voy a echar un vistazo más profundo a después de que haya terminado esta
valoración crítica.
De todas formas, después de recibir el impacto de ser mentido, podemos reconocer fácilmente que instr_S es básicamente una inversa instr_A: cuando
este último hace Además, el primero hace resta. Para resumir esta:
arg1 == " M ": Resta arg2 desde el byte en sym.current_memory_ptr. arg1 == " P ": pasos sym.current_memory_ptr
instr_I
356
IOLI 0x01
Éste es simple, sólo llama instr_A (arg1, 1). Como se habrán dado cuenta de la llamada a la función se parece
llamar fcn.0040080d en lugar de llamar fcn.instr_A. Esto se debe a que al guardar y abrir un proyecto, nombres de funciones se pierden -
instr_D
instr_P
357
IOLI 0x01
Esta función también es bastante sencillo, pero hay una rareza: const_M nunca se utiliza. No sé por qué está allí - tal vez se supone que
debe haber algún tipo de distracción? De todas formas, esta función escribe simplemente arg1 a sym.current_memory_ptr, y que las llamadas instr_I
( "P"). Esto significa básicamente que instr_P se utiliza para escribir un byte, y poner el puntero al siguiente byte. Hasta ahora esto parecería
la instrucción ideal para construir la mayor parte del "Tal VM! ReV3rse tanto!" cadena, pero recuerda, esto también es el que puede ser
instr_X
358
IOLI 0x01
instr_J
Éste no es tan simple como los anteriores, pero no es tan complicado tampoco. Desde Obviamente estoy obsesionado con el cambio de nombre de
variable:
Después de que el resultado de arg1 y 0x3f se pone en una variable local, arg1 y 0x40 se compara con 0. Si no es cero, arg1_and_0x3f es
negado:
359
IOLI 0x01
360
IOLI 0x01
361
IOLI 0x01
. conjunto de instrucciones
Ahora hemos invertido todas las instrucciones de máquina virtual, y tener un conocimiento completo acerca de cómo funciona. Aquí es el conjunto de instrucciones de la
máquina virtual:
+ + * sym.good_if_ne_zero; volver
arg1_and_0x3f; } Else return 2;
362
IOLI 0x01
. código de bytes
Bueno, lo hicimos la parte de ingeniería inversa, ahora tenemos que escribir un programa para la máquina virtual con el conjunto de instrucciones se
sym.memory tiene que contener la cadena "Tal VM! CUÁNTO reV3rse!" después de la ejecución en los 9 instrucciones tienen que
Desde este documento se trata de invertir, voy a dejar la parte de programación para el lector compañero :) Pero no voy a dejar con las manos
vacías, te voy a dar un consejo: A excepción de "J", la totalidad de la las instrucciones son simples, fáciles de usar, y que no debería ser un
problema para la construcción del "Tal VM! reV3rse tanto!" utilizarlos. "J", sin embargo es un poco complicado en comparación con los otros. Uno
debe darse cuenta de que su único propósito es hacer sym.good_if_ne_zero mayor que cero, lo cual es un requisito para acceder a la bandera.
sym.written_by_instr_C no debe ser 0 cuando "J" se llama. Esto significa que "C", las instrucciones de "SC" "AC", o se debe utilizar
arg1_and_0x3f debe ser negativo en caso de control. Desde bit de signo de 0x3f es cero, no importa qué
arg1 es decir, el resultado de arg1 y 0x3f será siempre no negativo. Pero recuerde que niega "J"
arg1_and_0x3f Si arg1 y 0x40 no es cero. Esto significa básicamente que arg1' s sexto bit debe ser 1 (0x40 = 01000000b).
También porque arg1_and_0x3f no puede ser 0 o bien, al menos uno de arg1' s 0 ª, 1º, 2º, 3º, 4º o 5º trozos deben ser 1 (0x3f =
00111111b).
Creo que esto es suficiente información, puede ir ahora y escribir ese programa. O, usted podría alterar el diseño del quick'n'dirty
\ X90 \ x00PSAMuAP \ x01AMcAP \ x01AMhAP \ x01AM AP \ x01AMVAP \ x01AMMAP \ x01AM! AP \ x01AM AP \ x01AMMAP \ x01AMuAP \ x01AMCAP \
x01AMHAP \ x01AM AP \ x01AMrAP \ x01AMeAP \ x01AMVAP \ x01AM3AP \ x01AMrAP \ x01AMsA P \ x01AMeIPAM! X \ x00CAJ \ xc1SC \ x00DCR *
Tenga en cuenta, sin embargo, que fue escrito en la marcha, paralelo a la fase de marcha atrás - por ejemplo, hay partes que se escriben
sin el conocimiento de todas las instrucciones posibles. Esto significa que el código es feo y ineficiente.
363
IOLI 0x01
364
IOLI 0x01
.outro
¿Bien, qué puedo decir? Dicha máquina virtual, mucho más atrás! :)
Lo que comenzó como una valoración crítica simple para una sencilla crackme, se convirtió en algo muy largo writeup / r2 tutorial, así que
felicitaciones si usted ha leído a través de él. Espero que te haya gustado (Sé que lo hice), y tal vez incluso hayan aprendido algo de ella. he aquí yo
he aprendido mucho sobre R2 durante el proceso, e incluso he aportado algunos pequeños parches, y tengo algunas ideas de más mejoras posibles.
365
Tarjeta de referencia
En este capítulo se basa en la tarjeta de referencia Radare 2 por Thanat0s, que está bajo la GNU GPL. licencia original es el
siguiente:
Esta tarjeta puede ser distribuido libremente bajo los términos de la licencia GNU público en general - Copyright
de Thanat0s - v0.1 -
Guía de supervivencia
Esos son los comandos básicos que se quieren conocer y utilizar para moverse por un binario y obtener información al respecto.
Mando Descripción
banderas
Las banderas son como marcadores, pero llevan alguna información extra, como el tamaño, las etiquetas o flagspace asociado. Utilizar el F comando a la lista,
conjunto, conseguirlos.
366
Tarjeta de referencia
Mando Descripción
F Lista de banderas
fd $$ Describir un desplazamiento
Flagspaces
Banderas se crean en un flagspace, por defecto se selecciona ninguno, y una lista de banderas aparecerá una lista de todos ellos. Para mostrar un subconjunto de
Mando Descripción
fs flagspaces de visualización
Información
Los archivos binarios tienen información almacenada dentro de las cabeceras. los yo comando utiliza el API RBin y nos permite las mismas cosas
367
Tarjeta de referencia
Mando Descripción
es secciones de visualización
IR reubicaciones de visualización
cadena de impresión
Hay diferentes maneras de representar una cadena en la memoria. los PD comando nos permite imprimir en UTF
Mando Descripción
modo visual
Para entrar en el modo de utilizar el visual v o V del sistema y te es suficiente con pulsar las teclas para obtener las acciones suceden en lugar de
comandos.
Mando Descripción
368
Tarjeta de referencia
i/a/A (I) nsert hex, (a) código ssemble, visual (A) ssembler
369
Tarjeta de referencia
buscando
Hay muchas situaciones en las que tenemos que encontrar un valor dentro de una binaria o en algunas regiones específicas. Utilizar el e
search.in =? de control para elegir donde el / comando puede buscar el valor dado.
370
Tarjeta de referencia
Mando Descripción
Ahorro
371
Tarjeta de referencia
Por defecto, cuando se abre un archivo en modo escritura ( r2 -w) todos los cambios serán escritos directamente en el archivo. No hay historial de deshacer se
Utilizar e io.cache.write = true y el baño programa para manejar la caché de escritura la historia cambia. Para deshacer, rehacer, comprometerse a
Pero, si queremos guardar los datos de análisis, comentarios, banderas y otros metadatos creados por el usuario, es posible que desee
Mando Descripción
los PS comando mostrará las variables que se pueden utilizar en cualquier operación matemática dentro de la cáscara r2. Por ejemplo,
Todos los comandos en R2 que aceptan una serie apoya el uso de esas variables.
Mando Descripción
$b tamaño de bloque
$ FB comenzar de la función
372
Tarjeta de referencia
$ FE final de la función
$ FS tamaño de la función
$ FI instrucciones de función
$m opcode referencia de memoria (por ejemplo, mov eax, [0x10] => 0x10)
$p getpid ()
$S sección desplazada
$ SS tamaño de la sección
373
Tarjeta de referencia
374
Expresiones de gratitud
Autores y Colaboradores
Este libro no sería posible sin la ayuda de una larga lista de colaboradores que han estado revisando, escritura y presentación de informes
El libro radare2
Este libro fue iniciado por Maijin como una nueva versión del libro original escrito por radare panqueque.
Muchas gracias a todos los que han estado involucrados con el gitbook:
Adrian Studer, Ahmed Mohamed Abd El-MAwgood, Akshay Krishnan R, Andrew Hoog, Anton Kochkov, Antonio Sánchez,
Austin Hartzheim, Bob131, DZ_ruyk, David Tomaschik, Eric, Fangrui Song, Francesco Tamagni, FreeArtMan, Gerardo García
Peña, Giuseppe, Grigory Rechistov, Hui Peng, ITAYC0HEN, Itay Cohen, Jeffrey Crowell, John, Juez Dredd (6E23685A clave),
Júpiter, Kevin GRANDEMANGE, Kevin Laeufer, Luca Di Bartolomeo, Lukas Dresel, Maijin, Michael Scherer, Mike, Nikita
Abdullin, Paul, Paweł Łukasik, Peter C, RandomLive, Ren Kimura, Reto Schneider, SchumBlubBlub, SkUaTeR, Solomon,
Srimanta Barua, Sushant Dinesh, TDKPS, Thanat0s, Vanellope, Vex Woo, Vorlent, XYlearn, Yuri Slobodyanyuk, ali, aoighost,
condret, hdznrrd, izhuer , jvoisin, kij, madblobfish, muzlightbeer, crepe, Polym (Tim), puddl3glum, radare, sghctoma, shakreiner,
375