
asadbg is a framework of tools to aid in automating live debugging of Cisco ASA devices
Nota preliminar: recomendamos utilizarlo como parte de asatools, aunque también puede usarse de forma independiente.
asadbg es un framework de herramientas para ayudar a automatizar la depuración en vivo de dispositivos Cisco ASA, así como automatizar la interacción con la CLI de Cisco mediante serial/ssh para realizar rápidamente tareas repetitivas.

asadbg.cfg para habilitar la depuración de diferentes
versiones fácilmenteLa herramienta principal es asadbg.py y ejecutará la mayoría de los otros scripts
auxiliares. Ten en cuenta que puede que necesites usar inicialmente
asafw para desempaquetar el firmware y obtener la mejor
variante de asadbg.
asadbg.py: herramienta principal utilizada para depurar ASAsasdbg_hunt.py/asadbg_rename.py: script de IDA Python para usar con idahunt para importar símbolos para nuevos objetivosLos siguientes son importados automáticamente por asadbg.py, pero te damos algo de
información sobre para qué sirven:
asa_lib*.py: scripts de gdb en Python para usar
libdlmalloc,
libptmalloc y
libmempool.asa_sync.py: script de gdb en Python para usar
ret-synccomm.py: conjunto de funciones para comunicarse por serial, SSH, telnet.find_lina_pid.py: encuentra el PID de lina usando comandos SSHtemplate_gdbinit: plantilla gdbinit parcheada por asadbg.py para cada objetivo
que depuramosInicialmente necesitas modificar asadbg/env.sh para ajustarlo a tu entorno. Te
permitirá definir rutas a las herramientas utilizadas por todos los scripts, así como algunas
variables acordes a tu entorno ASA. Ten en cuenta que existe un
asafw/env.sh similar, pero solo se necesita que uno sea utilizado para ambos proyectos. Nosotros
recomendamos que lo añadas a tu ~/.bashrc:```
source /path/to/asadbg/env.sh
# Depuración automatizada
Una de las principales ventajas de usar asadbg es que puedes automatizar el uso tanto
de dispositivos Cisco ASA emulados (GNS3) como reales. Esto puede incluir simplemente
automatizar el arranque y la ejecución de varios firmwares y configuraciones, o
específicamente automatizar el proceso de depuración de `lina` usando gdb. Esto se hace
principalmente mediante el script `asadbg.py`. La idea principal es precargar algo de flash en
el dispositivo ASA con archivos de firmware y configuración que quieras usar en
el dispositivo. Para cada firmware que quieras depurar, puedes usar una herramienta
como `asafw` para extraer diferentes símbolos y luego puedes generar
automáticamente archivos gdbinit usando esos símbolos. Por defecto, `asadbg.py` usará un
archivo `template_gdbinit` para automatizar la construcción de un archivo gdbinit específico de la versión en
tiempo de ejecución usando los símbolos que estén presentes en la base de datos.
## Arrancar rápidamente un dispositivo real (sin depuración)
Puedes arrancar rápidamente una versión determinada especificando el firmware y los archivos de configuración
que ya deben estar en la tarjeta CF.```
asadbg$ ./asadbg.py --firmware-type normal --serial-port /dev/ttyUSB0 --firmware asa802-k8.bin --config config-802
El siguiente ejemplo muestra cómo puedes configurar los archivos de configuración para depurar
un dispositivo GNS3. Primero definimos un archivo de configuración asadbg.cfg similar al
siguiente. Contiene la IP/puerto de GNS3 para el firewall configurado que obtenemos
del propio GNS3.```ini
[GLOBAL]
gns3_host=192.168.5.1
asadb_file=asadb.json
[asav941200] version=941200 arch=gns3 rootfs_path= /home/user/_asav941-200.qcow2.extracted/rootfs gns3_port=12005 attach_gdb=yes
También apunta al archivo de base de datos ASA `asadb.json` que contiene las direcciones requeridas. Lo importante aquí es que `version=941200` y `arch=gns3` especificados en `asadbg.cfg` permiten hacer coincidir el firmware en `asadb.json` a continuación. También indicamos que queremos adjuntar gdb.```json
{
"ASLR": false,
"addresses": {
"clock_interval": 59514112,
"socks_proxy_server_start": 22139744,
"aaa_admin_authenticate": 418288
},
"fw": "asav941-200.qcow2",
"lina_imagebase": 4194304,
"version": "9.4.1.200",
"arch": 64
}
Ahora comenzamos la depuración y clock_interval se parcheará automáticamente:```
asadbg$ ./asadbg.py --name asav941200 --asadbg-config asadbg.cfg
[asadbg] Using config file: asadbg.cfg
[asadbg] Found section: 'asav941200' in config
[asadbg] Using gdb: '/usr/bin/gdb'
[asadbg] Using architecture: gns3
[asadbg] Trying lina: /home/user/_asav941-200.qcow2.extracted/rootfs/asa/bin/lina
[asadbg] Going to debug...
[asadbg] Using GNS3 emulator 192.168.5.1:12005
[asadbg] Starting gdb now...
[gdbinit_941200] Configuring paths...
[gdbinit_941200] Disabling pagination...
[gdbinit_941200] Connecting over TCP/IP...
0x0000003655201190 in ?? () from /home/user/_asav941-200.qcow2.extracted/rootfs/lib64/ld-linux-x86-64.so.2
[gdbinit_941200] Connected.
[gdbinit_941200] Watchdog disabled
[gdbinit_941200] heap debugging plugins loaded
[gdbinit_941200] Additional gdb scripts loaded
[gdbinit_941200] Done.
(gdb) c
Continuing.
## Depuración de un dispositivo real con archivo de configuración
El siguiente ejemplo muestra cómo puede configurar los archivos de configuración para depurar
un dispositivo Cisco ASA real a través de una consola serie.```ini
[GLOBAL]
serial_port=/dev/ttyUSB0
asadb_file=asadb.json
[asa924-gdb]
version=924
arch=32
rootfs_path=/home/user/_asa924-k8.bin.extracted/rootfs
firmware=asa924-k8-debugshell-gdbserver.bin
config=config-924
firmware_type=gdb
attach_gdb=yes
Tenga en cuenta también que necesitamos especificar un firmware_type que indique si el
firmware está sin modificar, rooteado, tiene un shell serie habilitado o si gdb se ha
habilitado al arrancar. Esto es
porque haremos cosas diferentes en el arranque dependiendo del formato. Aquí
podemos ver que usamos un firmware modificado asa924-k8-debugshell-gdbserver.bin
que tiene gdbserver habilitado al arrancar y contiene un shell de depuración.
Vemos a continuación que cuando el bootrom se inicia, asadbg automáticamente
interrumpe la secuencia para cargar el firmware y los archivos de configuración ya
presentes en la tarjeta CF.```
asadbg$ ./asadbg.py --name asa924-gdb --asadbg-config asadbg.cfg
[asadbg] Using config file: asadbg.cfg
[asadbg] Found section: 'asa924-gdb' in config
[asadbg] Using gdb: '/usr/bin/gdb'
[asadbg] Using architecture: 32
[asadbg] Trying lina: /home/user/_asa924-k8.bin.extracted/rootfs/asa/bin/lina
[asadbg] Going to debug...
[asadbg] Using serial port: /dev/ttyUSB0
[asadbg] Loading 'asa924-k8-debugshell-gdbserver.bin' with 'config-924'...
[comm] Waiting boot...
[SNIP]
Platform ASA5505
Use BREAK or ESC to interrupt boot. Use SPACE to begin boot immediately. Boot interrupted.
[SNIP] rommon #0> boot asa924-k8-debugshell-gdbserver.bin cfg=config-924 Launching BootLoader... Boot configuration file contains 1 entry.
Loading asa924-k8-debugshell-gdbserver.bin........ Booting... Platform ASA5505 [SNIP] SMFW PID: 514, Starting /asa/bin/lina under gdbserver /dev/ttyS0 SMFW PID: 512, started gdbserver on member: 514//asa/bin/lina SMFW PID: 512, created member ASA BLOB, PID=514 Process /asa/bin/lina created; pid = 517 Remote debugging using /dev/ttyS0 [comm] gdb detected - boot finished. [comm] Boot should be finished now? [asadbg] Starting gdb now... [gdbinit_924] Configuring paths... [gdbinit_924] Disabling pagination... [gdbinit_924] Connecting over USB... 0xdc7e2820 in ?? () from /home/user/_asa924-k8.bin.extracted/rootfs/lib/ld-linux.so.2 [gdbinit_924] Connected. [gdbinit_924] Watchdog disabled [gdbinit_924] heap debugging plugins loaded [gdbinit_924] Additional gdb scripts loaded [gdbinit_924] Done. (gdb) c Continuing.
# Importación de símbolos adicionales
Numerosas partes de asadbg dependen de una base de datos `asadbg/asadb.json` que
contiene símbolos para varias versiones de firmware. Hemos incluido un pequeño
número de símbolos existentes; sin embargo, puedes añadir otros manualmente o usar
[idahunt](https://github.com/nccgroup/idahunt)
para añadir nuevos objetivos automáticamente. Esta sección detalla cómo hacerlo.
## Requisitos
Los scripts de IDA Python en asadbg asumen que `filelock.py/ida_helper.py` están
disponibles. Dado que se ejecutan directamente desde IDA Python, la forma en que lo
hemos hecho hasta ahora es creando enlaces simbólicos en `asadbg/`. Realmente no podemos crearlos
en el repositorio porque los enlaces simbólicos en Windows son diferentes a los de Linux. Por lo tanto,
es necesario hacerlo manualmente.
En Linux:```
asadbg$ ln -s ../idahunt/ida_helper.py ida_helper.py
asadbg$ ln -s ../idahunt/filelock.py filelock.py
En Windows, con permisos de administrador:``` C:\asadbg> mklink filelock.py ..\idahunt\filelock.py C:\asadbg> mklink ida_helper.py ..\idahunt\ida_helper.py
También necesitamos establecer la ruta a la base de datos (hecho automáticamente por `env.sh`):```
C:\idahunt>set ASADBG_DB=C:\asadbg\asadb.json
Suponemos que has extraído todo el firmware en un directorio usando, p. ej.,
asafw o que has
extraído solo los archivos lina y los has colocado en una jerarquía que indique
de qué firmware provienen:```
C:\temp>tree /F
Folder PATH listing
Volume serial number is XXXX-XXX
C:.
├───asa924-k8.bin
│ lina
│
├───asa924-smp-k8.bin
│ lina
│
└───asav941-200.qcow2
lina
Primero necesitas hacer el análisis inicial en IDA. Podemos usar `--list-only` con
cualquier comando para comprobar cuál sería el resultado del comando.
Ten en cuenta que filtramos versiones específicas de ASA (9.2.4) y arquitectura (32 bits):```
C:\idahunt>idahunt.py --verbose --inputdir "C:\temp" --analyse --scripts C:\asadbg\asadbg_rename.py --filter "filters\ciscoasa.py -m 924 -M 924 -v -a 32"
[idahunt] IDA32 = C:\Program Files (x86)\IDA 6.95\idaq.exe
[idahunt] IDA64 = C:\Program Files (x86)\IDA 6.95\idaq64.exe
[idahunt] ANALYSING FILES
[idahunt] Analysing C:\temp\asa924-k8.bin\lina
[idahunt] C:\Program Files (x86)\IDA 6.95\idaq.exe -B -LC:\temp\asa924-k8.bin\lina.log C:\temp\asa924-k8.bin\lina
[ciscoasa] Skipping non 32-bit: C:\temp\asa924-smp-k8.bin\lina
[ciscoasa] Skipping version too high: C:\temp\asav941-200.qcow2\lina
[idahunt] Waiting on remaining 1 IDA instances
[idahunt] EXECUTE SCRIPTS
[idahunt] Executing script C:\asadbg\asadbg_rename.py for C:\temp\asa924-k8.bin\lina
[idahunt] C:\Program Files (x86)\IDA 6.95\idaq.exe -A -SC:\asadbg\asadbg_rename.py -LC:\temp\asa924-k8.bin\lina.log C:\temp\asa924-k8.bin\lina.idb
[ciscoasa] Skipping non 32-bit: C:\temp\asa924-smp-k8.bin\lina
[ciscoasa] Skipping version too high: C:\temp\asav941-200.qcow2\lina
[idahunt] Waiting on remaining 0 IDA instances
Once the analysis is done, you should have a lina.i64 or lina.idb near lina
in the respective folders.
We use idahunt to add symbols to the database:``` C:\idahunt>idahunt.py --verbose --inputdir "C:\temp" --scripts C:\asadbg\asadbg_hunt.py --filter "filters\ciscoasa.py -v" [idahunt] IDA32 = C:\Program Files (x86)\IDA 6.95\idaq.exe [idahunt] IDA64 = C:\Program Files (x86)\IDA 6.95\idaq64.exe [idahunt] EXECUTE SCRIPTS [idahunt] Executing script C:\asadbg\asadbg_hunt.py for C:\temp\asa924-k8.bin\lina [idahunt] C:\Program Files (x86)\IDA 6.95\idaq.exe -A -SC:\asadbg\asadbg_hunt.py -LC:\temp\asa924-k8.bin\lina.log C:\temp\asa924-k8.bin\lina.idb [idahunt] Executing script C:\asadbg\asadbg_hunt.py for C:\temp\asa924-smp-k8.bin\lina [idahunt] C:\Program Files (x86)\IDA 6.95\idaq64.exe -A -SC:\asadbg\asadbg_hunt.py -LC:\temp\asa924-smp-k8.bin\lina.log C:\temp\asa924-smp-k8.bin\lina.i64 [idahunt] Executing script C:\asadbg\asadbg_hunt.py for C:\temp\asav941-200.qcow2\lina [idahunt] C:\Program Files (x86)\IDA 6.95\idaq64.exe -A -SC:\asadbg\asadbg_hunt.py -LC:\temp\asav941-200.qcow2\lina.log C:\temp\asav941-200.qcow2\lina.i64 [idahunt] Executing script C:\asadbg\asadbg_hunt.py for C:\temp\asav962-7.qcow2\lina [idahunt] C:\Program Files (x86)\IDA 6.95\idaq64.exe -A -SC:\asadbg\asadbg_hunt.py -LC:\temp\asav962-7.qcow2\lina.log C:\temp\asav962-7.qcow2\lina.i64 [idahunt] Waiting on remaining 0 IDA instances
# Automatizando la ejecución de comandos en la CLI
Admitimos ejecutar algunos comandos útiles automáticamente mediante SSH, el puerto serie
y, en teoría, también admitimos telnet, aunque no se ha probado a fondo.```
$ comm.py -h
usage: comm.py [-h] [--comm COMM_TYPE] [--port TARGET_PORT] [--ip TARGET_IP]
[--user USER] [--pass PASSWORD] [--reboot] [--version]
[--disable-checkheaps] [--upload] [--force] [--download]
[--delete-ike-sa] [--delete-webvpn-sessions] [--md5]
[--input [INPUT [INPUT ...]]] [--oldssh] [--cmd CMD]
[-C CFG_FILE]
optional arguments:
-h, --help show this help message and exit
--comm COMM_TYPE Communication type {serial(default), telnet, ssh}
--port TARGET_PORT Specify a custom serial (e.g. "/dev/ttyUSB0")/telnet
(e.g. 5000) port)
--ip TARGET_IP Cisco ASA/GNS3 IP address
--user USER User for SSH
--pass PASSWORD Password for SSH
--reboot Reboot router (serial, SSH)
--version Get the version (serial, SSH)
--disable-checkheaps Disable checkheaps default timeout (60 sec)
--upload Upload over SSH
--force Overwrite existing files
--download Download over SSH
--delete-ike-sa Delete IKE SAs (serial, SSH)
--delete-webvpn-sessions
Delete WebVPN sessions (serial, SSH)
--md5 Compute MD5 for files (serial, SSH)
--input [INPUT [INPUT ...]]
List of input files for other commands (eg: file1
file2 file3) (e.g.: --upload, --download, --md5)
--oldssh Specify an old version of SSH (do not know specific
command lines options and do not need them because
unsecure :))
--cmd CMD Command to run on the CLI (debugging)
-C CFG_FILE File containing commands to use (e.g.
config/setup_ssh.cfg)
Usamos --version y podemos ejecutarlo por serial o SSH:```
$ comm.py --comm serial --port /dev/ttyUSB0 --version
[comm] Retrieving version now...
[comm] Serial: /dev/ttyUSB0
[comm] Detected version: 9.2(4)
$ comm.py --comm ssh --ip 192.168.210.77 --port 22 --user user --pass user --version
[comm] Retrieving version now...
[comm] SSH: 192.168.210.77:22
[comm] Detected version: 9.2(4)
## Reiniciando la ASA
Usamos `--reboot`:```
$ comm.py --comm ssh --reboot
[comm] Rebooting router now...
[comm] SSH: 192.168.210.77:22
si tienes una CLI en ejecución, deberías ver que se reinicia automáticamente:``` ciscoasa#
*** --- START GRACEFUL SHUTDOWN --- Shutting down isakmp Shutting down License Controller Shutting down File system
*** --- SHUTDOWN NOW --- Process shutdown finished
## Subir archivos a la memoria flash
Podemos subir varios archivos a la vez a través de SSH:```
$ comm.py --upload --comm ssh --oldssh --pass user --input fw/*
[comm] Warning: using forced SSH
[comm] Uploading file...
[comm] SSH: 192.168.210.77:22
[comm] Uploading: asa924-5-k8.bin...
[comm] Executing 'sshpass -p user scp fw/asa924-5-k8.bin [email protected]:asa924-5-k8.bin'...
Connection to 192.168.210.77 closed by remote host.
[comm] Uploading file...
[comm] SSH: 192.168.210.77:22
[comm] Uploading: asa924-k8.bin...
[comm] Executing 'sshpass -p user scp fw/asa924-k8.bin [email protected]:asa924-k8.bin'...
Connection to 192.168.210.77 closed by remote host.
[comm] Finished all tasks.
Ten en cuenta que --oldssh es útil si estás usando un cliente ssh antiguo.
A veces es útil comprobar el MD5 de los archivos en la flash para asegurarse de que los archivos se han subido correctamente.``` $ comm.py --md5 --input asa924-k8.bin asa924-5-k8.bin --comm ssh --oldssh --ip 192.168.210.77 Calculating MD5. Will take 20 seconds... asa924-k8.bin = 4558b27d0dd7ba1751e43b0ba33593a3 Calculating MD5. Will take 20 seconds... asa924-5-k8.bin = 74765d62abb2c4a5e677ed9ca49ebf87
# Determinación del PID/mapeo de memoria de lina en gdb
Por defecto, gdb no conoce el PID de lina.```
(gdb) info proc mappings
Can't determine the current process's PID: you must name one.
Usamos find_lina_pid.py para encontrar el PID de lina.
Luego usamos info proc mappings <pid> para obtener el mapeo.```
(gdb) source find_lina_pid.py
Finding lina PID:
516
You can use the following to see the lina mapping: info proc mappings
(gdb) info proc mappings 516
process 516
Mapped address spaces:
Start Addr End Addr Size Offset objfile
0x8048000 0xa388000 0x2340000 0x0 /asa/bin/lina
0xa388000 0xa38a000 0x2000 0x233f000 /asa/bin/lina
0xa38a000 0xa9aa000 0x620000 0x2341000 /asa/bin/lina
0xa9aa000 0xb74b000 0xda1000 0xa9aa000 [heap]
0xa5ad9000 0xa5bda000 0x101000 0xa5ad9000
0xa5bda000 0xa5bde000 0x4000 0x0 /dev/zero (deleted)
0xa5bde000 0xa5de1000 0x203000 0xa5bde000
0xa5de1000 0xa5de5000 0x4000 0x50004000 /dev/mem
0xa5de5000 0xa5fe7000 0x202000 0xa5de5000
0xa5fe7000 0xa5fe8000 0x1000 0xffb00000 /dev/mem
0xa5fe8000 0xa5ff8000 0x10000 0xfff00000 /dev/mem
0xa5ff8000 0xa6000000 0x8000 0xd8000 /dev/mem
0xa6000000 0xa8724000 0x2724000 0x0 /dev/udma0
0xa8800000 0xab400000 0x2c00000 0x0 /SYSV00000002 (deleted)
0xab400000 0xab800000 0x400000 0x2c00000 /SYSV00000002 (deleted)
0xab800000 0xabc00000 0x400000 0x3000000 /SYSV00000002 (deleted)
0xabc00000 0xac000000 0x400000 0x3400000 /SYSV00000002 (deleted)
0xac000000 0xac400000 0x400000 0x3800000 /SYSV00000002 (deleted)
0xac400000 0xdbc00000 0x2f800000 0x3c00000 /SYSV00000002 (deleted)
0xdbf55000 0xdbf58000 0x3000 0xdbf55000
0xdbf58000 0xdc091000 0x139000 0x0 /lib/libc-2.9.so
0xdc091000 0xdc092000 0x1000 0x139000 /lib/libc-2.9.so
0xdc092000 0xdc094000 0x2000 0x139000 /lib/libc-2.9.so
0xdc094000 0xdc095000 0x1000 0x13b000 /lib/libc-2.9.so
0xdc095000 0xdc098000 0x3000 0xdc095000
0xdc098000 0xdc0a2000 0xa000 0x0 /lib/libgcc_s.so.1
0xdc0a2000 0xdc0a3000 0x1000 0x9000 /lib/libgcc_s.so.1
0xdc0a3000 0xdc0a4000 0x1000 0xa000 /lib/libgcc_s.so.1
0xdc0a4000 0xdc0c8000 0x24000 0x0 /lib/libm-2.9.so
0xdc0c8000 0xdc0c9000 0x1000 0x23000 /lib/libm-2.9.so
0xdc0c9000 0xdc0ca000 0x1000 0x24000 /lib/libm-2.9.so
0xdc0ca000 0xdc0d3000 0x9000 0x0 /lib/libudev.so.0.5.0
0xdc0d3000 0xdc0d4000 0x1000 0x8000 /lib/libudev.so.0.5.0
0xdcfeb000 0xdd000000 0x15000 0xdcfeb000 [stack]
0xffffe000 0xfffff000 0x1000 0x0 [vdso]
0xdc0e0000 0xdc0e1000 0x1000 0xa000 /usr/lib/libcgroup.so.1.0.34
0xdc0e1000 0xdc0e2000 0x1000 0xb000 /usr/lib/libcgroup.so.1.0.34
0xdc0e2000 0xdc6dc000 0x5fa000 0xdc0e2000
0xdc6dc000 0xdc6e3000 0x7000 0x0 /lib/librt-2.9.so
0xdc6e3000 0xdc6e4000 0x1000 0x6000 /lib/librt-2.9.so
0xdc6e4000 0xdc6e5000 0x1000 0x7000 /lib/librt-2.9.so
0xdc6e5000 0xdc6e7000 0x2000 0x0 /lib/libdl-2.9.so
0xdc6e7000 0xdc6e8000 0x1000 0x1000 /lib/libdl-2.9.so
0xdc6e8000 0xdc6e9000 0x1000 0x2000 /lib/libdl-2.9.so
0xdc6e9000 0xdc6fd000 0x14000 0x0 /lib/libpthread-2.9.so
0xdc6fd000 0xdc6fe000 0x1000 0x13000 /lib/libpthread-2.9.so
0xdc6fe000 0xdc6ff000 0x1000 0x14000 /lib/libpthread-2.9.so
0xdc6ff000 0xdc701000 0x2000 0xdc6ff000
0xdc701000 0xdc71c000 0x1b000 0x0 /usr/lib/libexpat.so.1.6.0
0xdc71c000 0xdc71e000 0x2000 0x1a000 /usr/lib/libexpat.so.1.6.0
0xdc71e000 0xdc71f000 0x1000 0x1c000 /usr/lib/libexpat.so.1.6.0
0xdc71f000 0xdc7cd000 0xae000 0x0 /lib/libstdc++.so.6.0.10
0xdc7cd000 0xdc7d1000 0x4000 0xad000 /lib/libstdc++.so.6.0.10
0xdc7d1000 0xdc7d2000 0x1000 0xb1000 /lib/libstdc++.so.6.0.10
0xdc7d2000 0xdc7d8000 0x6000 0xdc7d2000
0xdc7d8000 0xdc7dd000 0x5000 0x0 /usr/lib/libnuma.so.1
0xdc7dd000 0xdc7de000 0x1000 0x4000 /usr/lib/libnuma.so.1
0xdc7de000 0xdc7df000 0x1000 0x5000 /usr/lib/libnuma.so.1
0xdc7df000 0xdc7e0000 0x1000 0xdc7df000
0xdc7e1000 0xdc7e2000 0x1000 0xdc7e1000
0xdc7e2000 0xdc7fe000 0x1c000 0x0 /lib/ld-2.9.so
0xdc7fe000 0xdc7ff000 0x1000 0x1b000 /lib/ld-2.9.so
0xdc7ff000 0xdc800000 0x1000 0x1c000 /lib/ld-2.9.so
0xdcfeb000 0xdd000000 0x15000 0xdcfeb000 [stack]
0xffffe000 0xfffff000 0x1000 0x0 [vdso]