
Une mémoire interactive pour le pwning / l'exploitation
En tant qu’amateurs de pwn, lors de CTF avec exploitation du tas, nous avons toujours besoin d’un débogueur (ex. gdb) pour suivre la disposition mémoire. Mais nous n’avons pas vraiment besoin de gdb si nous voulons voir si la disposition du tas correspond à notre imagination ou non. Espérons que ce petit outil nous aide à exploiter plus facilement ;).
HeapInfo est très utile lorsque le binaire a des limitations anti-débogueur, par exemple être ptracé. HeapInfo fonctionne toujours car il n'utilise pas ptrace.
Implémenté en Ruby parce que j'aime Ruby :P. Mais pourrait être implémenté en Python (si personne d'autre ne le fait) à l'avenir.
Si vous préférez pwntools pour exploiter, vous pouvez toujours utiliser HeapInfo dans irb/pry comme un petit débogueur.
Toute suggestion de fonctionnalités ou signalement de bogues est la bienvenue.
HeapInfo est encore en développement pour plus de fonctionnalités, donc la version peut changer fréquemment :p
$ gem install heapinfo
victim est tracé ! c'est-à-dire que vous pouvez utiliser ltrace/strace/gdb et HeapInfo simultanément !dump - Vider la mémoire à une adresse arbitraire.layouts - Afficher la disposition actuelle des bins, très utile pour l'exploitation du tas.offset - Afficher le décalage entre une adresse donnée et un segment. Très utile pour calculer le décalage relatif.canary - Récupérer la valeur du stack guard !x - Commandes de style GDB.s - Commandes de style GDB.find - Commandes de style 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"
ATTENTION : Lorsque le processus n'est pas trouvé, la plupart des méthodes renverront nil. Une façon d'éviter certaines erreurs est d'encapsuler les méthodes dans debug, le bloc sera ignoré lors de l'exploitation à distance.
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 }
Interroger le contenu d'une adresse spécifique.
ATTENTION : Vous DEVEZ avoir la permission d'attacher un programme, sinon le dump échouera.
c'est-à-dire /proc/sys/kernel/yama/ptrace_scope défini sur 0 ou exécuté en tant que 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

Provide a searcher of memory, easier to use than in (naive) gdb.
Support search integer, string, and even regular expression.
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
HeapInfo n'exécute actuellement des tests que sur Ubuntu, voici les versions glibc testées :