
معلومات ذاكرة تفاعلية لـ pwning / exploiting
كمحبين لـ pwn، أثناء اللعب في مسابقات CTF مع استغلال الكومة (heap)، نحتاج دائمًا إلى مصحح (مثل gdb) لتتبع تخطيط الذاكرة. لكننا لا نحتاج فعليًا إلى gdb إذا أردنا معرفة ما إذا كان تخطيط الكومة مطابقًا لتخيلنا أم لا. آمل أن تساعدنا هذه الأداة الصغيرة في تسهيل الاستغلال ;).
HeapInfo مفيدة جدًا عندما يكون للبرنامج الثنائي قيود مضادة للمصحح، مثل كونه تحت ptrace. HeapInfo لا تزال تعمل لأنها لا تستخدم ptrace.
مطوّرة بلغة Ruby لأنني أحب Ruby :P. ولكن قد أقوم بتطويرها بلغة Python (إذا لم يقم أحد بذلك) في المستقبل.
إذا كنت تفضل pwntools للاستغلال، فلا يزال بإمكانك استخدام HeapInfo في irb/pry كمصحح صغير.
أي اقتراح لميزات أو تقارير عن أخطاء مرحب به.
HeapInfo لا تزال قيد التطوير لإضافة المزيد من الميزات، لذلك قد يتغير الإصدار بشكل متكرر :p
$ gem install heapinfo
victim تحت التتبع! أي يمكنك استخدام ltrace/strace/gdb وHeapInfo في وقت واحد!dump - تفريغ الذاكرة من أي عنوان.layouts - عرض تخطيطات الصناديق (bins) الحالية، مفيد جدًا لاستغلال الكومة.offset - عرض الإزاحة بين عنوان معين ومقطع. مفيد جدًا لحساب الإزاحة النسبية.canary - جلب قيمة حارس المكدس!x - أوامر على غرار GDB.s - أوامر على غرار GDB.find - أوامر على غرار 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"
ملاحظة: عندما لا يتم العثور على العملية، ستعيد معظم الطرق nil. إحدى طرق منع حدوث خطأ هي تغليف الطرق داخل debug، سيتم تجاهل الكتلة عند القيام بالاستغلال عن بُعد.
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 }
الاستعلام عن محتوى عنوان معين.
ملاحظة: يجب أن يكون لديك صلاحية إرفاق برنامج، وإلا سيفشل التفريغ.
أي: /proc/sys/kernel/yama/ptrace_scope مضبوط على 0 أو التشغيل كجذر.
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

يوفر أداة بحث في الذاكرة، أسهل في الاستخدام من (gdb الساذج).
يدعم البحث عن الأعداد الصحيحة، السلاسل النصية، وحتى التعبيرات النمطية.
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 حاليًا تُجرى الاختبارات فقط على Ubuntu، فيما يلي إصدارات glibc المختبرة: