
पेनिंग/एक्सप्लॉइटिंग के लिए एक इंटरैक्टिव मेमोरी जानकारी
pwn प्रेमियों के रूप में, जब CTF में heap शोषण के साथ खेलते हैं, तो हमें मेमोरी लेआउट को ट्रैक करने के लिए हमेशा एक डीबगर (जैसे gdb) की आवश्यकता होती है। लेकिन अगर हम यह देखना चाहते हैं कि heap लेआउट हमारी कल्पना के अनुसार है या नहीं, तो हमें वास्तव में gdb की आवश्यकता नहीं है। उम्मीद है कि यह छोटा उपकरण हमें आसानी से शोषण करने में मदद करेगा ;)।
HeapInfo तब बहुत सहायक होता है जब बाइनरी में किसी तरह की एंटी-डीबगर सीमाएँ हों, उदाहरण के लिए ptraced होना। HeapInfo फिर भी काम करता है क्योंकि यह ptrace का उपयोग नहीं करता।
Ruby में लागू किया गया क्योंकि मुझे Ruby पसंद है :P। लेकिन भविष्य में Python में भी लागू किया जा सकता है (यदि कोई और नहीं करता)।
यदि आप शोषण के लिए pwntools पसंद करते हैं, तब भी आप HeapInfo को irb/pry में एक छोटे डीबगर के रूप में उपयोग कर सकते हैं।
सुविधाओं के बारे में कोई सुझाव या बग की समस्याएँ स्वागत हैं।
HeapInfo अभी भी अधिक सुविधाओं के लिए विकास के अधीन है, इसलिए संस्करण बार-बार बदल सकता है :p
$ gem install heapinfo
victim को trace किया जा रहा हो! अर्थात आप ltrace/strace/gdb और HeapInfo एक साथ उपयोग कर सकते हैं!dump - किसी भी पते की मेमोरी डंप करें।layouts - वर्तमान bin लेआउट दिखाएँ, heap शोषण के लिए बहुत उपयोगी।offset - दिए गए पते और सेगमेंट के बीच ऑफ़सेट दिखाएँ। सापेक्ष ऑफ़सेट की गणना के लिए बहुत उपयोगी।canary - स्टैक गार्ड का मान प्राप्त करें!x - GDB-शैली के आदेश।s - GDB-शैली के आदेश।find - GDB-शैली के आदेश।require 'heapinfo'
# ./victim चल रहा है
h = heapinfo('victim')
# या pid निर्दिष्ट करने के लिए h = heapinfo(20568) का उपयोग करें
# लोड करने पर सरल जानकारी प्रस्तुत करेगा:
# 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
# सेगमेंट्स की जानकारी प्रश्न करें
"%#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')
# प्रक्रिया नहीं मिली
h.pid # nil
# `debug` के साथ रैप करें ताकि दूरस्थ सेवा पर हमला करते समय कोई त्रुटि न उत्पन्न हो
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) # ऑफ़सेट समर्थन!
#=> "\x00\x00\x00\x00\x00\x00\x00\x00\x81\x00\x00\x00\x00\x00\x00\x00"
p h.dump('heap+0x30 * 3 + 0x8', 16) # और जटिल सूत्र भी!
#=> "\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) # या सीधे पता दें
#=> "\x7FELF\x02\x01\x01\x00"
end
# अमान्य उदाहरण:
# h.dump('meow') # ऐसा कोई सेगमेंट नहीं
h.layouts :fast

h.layouts :unsorted, :small

h.layouts :tcache

h.offset(0x7fda86fe8670)
# 0xf6670 after libc
h.offset(0x1839cd0, :heap) # विशिष्ट सेगमेंट नाम
# 0x20cd0 after heap
h.offset(0x1839cd0)
# 0x20cd0 after heap

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

मेमोरी का एक खोजक प्रदान करें, (naive) gdb की तुलना में उपयोग करना आसान।
पूर्णांक, स्ट्रिंग और यहाँ तक कि नियमित अभिव्यक्ति की खोज का समर्थन करता है।
h.find(0xdeadbeef, 'heap+0x10', 0x1000)
#=> 6299664 # 0x602010
h.find(/E.F/, 0x400000, 4)
#=> 4194305 # 0x400001
h.find(/E.F/, 0x400000, 3)
#=> nil
# खोज परिणाम का सापेक्ष ऑफ़सेट प्राप्त करें
h.find('/bin/sh', :libc, rel: true)
#=> 1622391 # 0x18c177
h.offset(h.find('/bin/sh', :libc))
# 0x18c177 after libc
HeapInfo वर्तमान में केवल Ubuntu पर परीक्षण चलाता है, निम्नलिखित परीक्षण की गई glibc संस्करण हैं: