
Información interactiva de la memoria para pwning / explotación
Como amantes del pwn, mientras jugamos CTF con explotación de heap, siempre necesitamos un depurador (por ejemplo, gdb) para rastrear el diseño de la memoria. Pero realmente no necesitamos gdb si queremos ver si el diseño del heap coincide con nuestra imaginación o no. ¡Espero que esta pequeña herramienta nos ayude a explotar más fácilmente ;).
HeapInfo es muy útil cuando el binario tiene limitaciones anti-depurador, como estar siendo ptraceado. HeapInfo sigue funcionando porque no usa ptrace.
Implementado en Ruby porque amo Ruby :P. Pero podría implementarse en Python (si nadie más lo hace) en el futuro.
Si prefieres pwntools para explotar, aún puedes usar HeapInfo en irb/pry como un pequeño depurador.
Cualquier sugerencia de funcionalidades o informes de errores son bienvenidos.
HeapInfo aún está en desarrollo para más funcionalidades, por lo que la versión puede cambiar frecuentemente :p
$ gem install heapinfo
víctima está siendo trazada! Es decir, puedes usar ltrace/strace/gdb y HeapInfo simultáneamente.dump - Volcar memoria de una dirección arbitraria.layouts - Mostrar el diseño actual de los bins, muy útil para explotación de heap.offset - Mostrar el desplazamiento entre una dirección dada y un segmento. Muy útil para calcular desplazamientos relativos.canary - Obtener el valor del stack guard.x - Comandos estilo GDB.s - Comandos estilo GDB.find - Comandos estilo GDB.require 'heapinfo'
# ./victim is running
h = heapinfo('victim')
# or use h = heapinfo(20568) to specify a pid
# will present simple info when loading:
# Program: /home/heapinfo/victim PID: 20568
# victim base @ 0x400000
# [heap] base @ 0x11cc000
# [stack] base @ 0x7fff2b244000
# libc-2.19.so base @ 0x7f892a63a000
# ld-2.19.so base @ 0x7f892bee6000
# canary value: 0x84b742f03d94c100
# query segments' info
"%#x" % h.libc.base
#=> "0x7f892a63a000"
h.libc.name
#=> "/lib/x86_64-linux-gnu/libc-2.19.so"
"%#x" % h.elf.base
#=> "0x400000"
"%#x" % h.heap.base
#=> "0x11cc000"
NOTA: Cuando el proceso no se encuentra, la mayoría de los métodos devolverán nil. Una forma de evitar errores es envolver los métodos dentro de debug; el bloque se ignorará durante la explotación remota.
h = heapinfo('remote')
# Process not found
h.pid # nil
# wrapper with `debug` so that no error will be raised when pwning remote service
h.debug { fail unless leak_libc_base == h.libc.base }
Consultar el contenido de una dirección específica.
NOTA: Debes tener permiso para adjuntar un programa, de lo contrario dump fallará.
Es decir, /proc/sys/kernel/yama/ptrace_scope configurado en 0 o ejecutar como root.
h.debug do
p h.dump(:libc, 8)
#=> "\x7FELF\x02\x01\x01\x00"
p h.dump(:heap, 16)
#=> "\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\x00\x00\x00\x00\x00\x00"
p h.dump('heap+0x30', 16) # support offset!
#=> "\x00\x00\x00\x00\x00\x00\x00\x00\x81\x00\x00\x00\x00\x00\x00\x00"
p h.dump('heap+0x30 * 3 + 0x8', 16) # and even complex formula!
#=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
p h.dump(:program, 8)
#=> "\x7FELF\x02\x01\x01\x00"
p h.dump(0x400000, 8) # or simply give address
#=> "\x7FELF\x02\x01\x01\x00"
end
# invalid example:
# h.dump('meow') # no such segment
h.layouts :fast

h.layouts :unsorted, :small

h.layouts :tcache

h.offset(0x7fda86fe8670)
# 0xf6670 after libc
h.offset(0x1839cd0, :heap) # specific segment name
# 0x20cd0 after heap
h.offset(0x1839cd0)
# 0x20cd0 after heap

h.canary.to_s(16)
#=> '84b742f03d94c100'
h.x 8, :heap

Proporciona un buscador de memoria, más fácil de usar que en (ingenuo) gdb.
Soporta búsqueda de enteros, cadenas e incluso expresiones regulares.
h.find(0xdeadbeef, 'heap+0x10', 0x1000)
#=> 6299664 # 0x602010
h.find(/E.F/, 0x400000, 4)
#=> 4194305 # 0x400001
h.find(/E.F/, 0x400000, 3)
#=> nil
# Get relative offset of searching result
h.find('/bin/sh', :libc, rel: true)
#=> 1622391 # 0x18c177
h.offset(h.find('/bin/sh', :libc))
# 0x18c177 after libc
Actualmente HeapInfo solo ejecuta pruebas en Ubuntu, las siguientes son versiones de glibc probadas: