
LLEF (pronunciado ɬɛf - "Hlyeff") es un complemento LLDB para hacerlo más utilizable para RE y VR de bajo nivel. Similar a GEF, pero para LLDB.
Utiliza la API de Python de LLDB para agregar salida de estado adicional y algunos comandos nuevos, para que los investigadores de seguridad puedan usar más fácilmente LLDB para analizar el software mientras se está ejecutando.
Las instrucciones a continuación instalarán LLEF para que LLDB lo utilice de forma predeterminada.
cd <repo>./install.sh~/.lldbinit ) o manual.LLDB utiliza la sintaxis de desmontaje AT&T para binarios X86 de forma predeterminada. El instalador proporciona una opción para anular esto.
lldb-15 < optional binary to debug >Varios comandos para configurar, guardar, cargar y enumerar los comandos específicos de LLEF:
(lldb) llefsettings --help
list list all settings
save Save settings to config file
reload Reload settings from config file (retain session values)
reset Reload settings from config file (purge session values)
set Set LLEF settings
Las configuraciones se almacenan en un archivo .llef ubicado en su directorio de inicio formateado de la siguiente manera:
[LLEF]
<llefsettings> = <value>
| Configuración | Tipo | Descripción |
|---|---|---|
| color_output | Booleano | Habilitar/deshabilitar la salida del terminal de color |
| Register_coloring | Booleano | Habilitar/deshabilitar el colorante de registro |
| show_legend | Booleano | Habilitar/deshabilitar la salida de leyenda |
| show_registers | Booleano | Activar/deshabilitar la salida de registros |
| show_stack | Booleano | Habilitar/deshabilitar la salida de la pila |
| show_code | Booleano | Habilitar/deshabilitar la salida del código |
| show_threads | Booleano | Habilitar/deshabilitar la salida de subprocesos |
| show_trace | Booleano | Habilitar/deshabilitar la salida de rastreo |
| Force_arch | Cadena | Arquitectura de pantalla de registro de fuerza (experimental) |
| rebase_addresses | Booleano | Habilitar/deshabilitar la dirección de Rebase Salida |
| rebase_offset | Intencionalmente | Establezca el desplazamiento de Rebase (predeterminado 0x100000) |
| show_all_registers | Booleano | Habilitar/deshabilitar la salida de registro extendido |
Permite configurar los colores LLEF GUI:
(lldb) llefcolorsettings --help
list list all color settings
save Save settings to config file
reload Reload settings from config file (retain session values)
reset Reload settings from config file (purge session values)
set Set LLEF color settings
Colores soportados: azul, verde, amarillo, rojo, rosa, cian, gris
| Color |
|---|
| Register_Color |
| modificado_register_color |
| code_color |
| montaña |
| stack_color |
| string_color |
| stack_address_color |
| function_name_color |
| Instruction_Color |
| destacado_instruction_color |
| line_color |
| rebasado_address_color |
| section_header_color |
| destacado_index_color |
| index_color |
| derferenced_value_color |
| derferenced_register_color |
| Frame_argument_name_color |
| read_memory_address_color |
Ver contenido de memoria con:
(lldb) hexdump type address [--size SIZE] [--reverse]
p.ej
(lldb) hexdump byte 0x7fffffffecc8 --size 0x38
0x7fffffffecc8 3d 2f 75 73 72 2f 6c 6f 63 61 6c 2f 73 62 69 6e =/usr/local/sbin
0x7fffffffecd8 3a 2f 75 73 72 2f 6c 6f 63 61 6c 2f 62 69 6e 3a :/usr/local/bin:
0x7fffffffece8 2f 75 73 72 2f 73 62 69 6e 3a 2f 75 73 72 2f 62 /usr/sbin:/usr/b
0x7fffffffecf8 69 6e 3a 2f 73 62 69 6e in:/sbin
(lldb) hexdump word 0x7fffffffecc8 --reverse
0x7fffffffece6│+001e: 0x4654
0x7fffffffece4│+001c: 0x4361
0x7fffffffece2│+001a: 0x746f
0x7fffffffece0│+0018: 0x4e23
0x7fffffffecde│+0016: 0x3f73
0x7fffffffecdc│+0014: 0x6968
0x7fffffffecda│+0012: 0x742d
0x7fffffffecd8│+0010: 0x6564
0x7fffffffecd6│+000e: 0x6f63
0x7fffffffecd4│+000c: 0x6564
0x7fffffffecd2│+000a: 0x2d75
0x7fffffffecd0│+0008: 0x6f79
0x7fffffffecce│+0006: 0x2d64
0x7fffffffeccc│+0004: 0x6964
0x7fffffffecca│+0002: 0x2d79
0x7fffffffecc8│+0000: 0x6857
Actualiza la GUI LLEF con:
(lldb) context
Actualizar componentes de la GUI LLEF con:
(lldb) context [{registers,stack,code,threads,trace,all} ...]
(lldb) pattern create 10
[+] Generating a pattern of 10 bytes (n=4)
aaaabaaaca
[+] Pattern saved in variable: $8
(lldb) pattern create 100 -n 2
[+] Generating a pattern of 100 bytes (n=2)
aabacadaea
[+] Pattern saved in variable: $9
(lldb) pattern search $rdx
[+] Found in $10 at index 45 (big endian)
(lldb) pattern search $8
[+] Found in $10 at index 0 (little endian)
(lldb) pattern search aaaabaaac
[+] Found in $8 at index 0 (little endian)
(lldb) pattern search 0x61616161626161616361
[+] Found in $8 at index 0 (little endian)
Esto es automático e imprime toda la información implementada actualmente en un punto de quiebre.
Configurable con la configuración de rebase_addresses , la función de rebase de dirección realiza una búsqueda para cada dirección de código presentada en la salida para mostrar la dirección binaria y relativa asociada. Esta dirección relativa se ve compensada por el valor definido en la configuración de rebase_offset , que es predeterminado a la dirección base de Ghidra de 0x100000 . El resultado es una salida de dirección que se puede copiar y pegar fácilmente en una característica IDE "Ir a abordar" sin tener que hacer las matemáticas para convertir desde la dirección de tiempo de ejecución.
Las direcciones recuperadas se muestran entre paréntesis después de la dirección de tiempo de ejecución: 
LLDB viene incluido con módulos Python que se requieren para que LLEF se ejecute. Si al lanzar LLDB con LLEF se encuentra con los mensajes ModuleNotFoundError , es probable que tenga que agregar manualmente los módulos LLDB Python en su ruta Python.
Para hacer esto, ejecute lo siguiente para establecer su ubicación de paquetes de sitio:
python3 -m site --user-site Luego localice la ubicación de los módulos LLDB Python. Esto suele estar en una ubicación como /usr/lib/llvm-15/lib/python3.10/dist-packages pero depende de su versión de Python.
Finalmente, modifique y ejecute lo siguiente para agregar la ruta del módulo LLDB anterior en un nuevo archivo lldb.pth en la ubicación de los paquetes de sitio descubiertos anteriormente.
echo " /usr/lib/llvm-15/lib/python3.10/dist-packages " > ~ /.local/lib/python3.10/site-packages/lldb.pth Se ha observado que la salida de LLE en cada punto de interrupción es lenta en algunas plataformas. La causa raíz de esto se remonta a la llamada de la API LLDB subyacente GetMemoryRegions . Afortunadamente, esto solo se usa para identificar si los valores de registro apuntan a las direcciones de código, pila o almacenamiento.
Para deshabilitar el colorante de registro y potencialmente mejorar significativamente el rendimiento de LLEF, deshabilite la función register_coloring utilizando el siguiente comando llefsettings .
llefsettings set register_coloring False
Obviamente, estamos parados sobre los hombros de los gigantes aquí: ¡nos gustaría acreditar a Hugsy por GFF en particular, de la cual esta herramienta extrae una gran inspiración! ¿Considere esta imitación como adulación?
Si desea leer un poco más sobre LLEF, podría visitar nuestra publicación de blog de lanzamiento.