
jemalloc हीप शोषण फ्रेमवर्क
shadow एक jemalloc हीप शोषण फ्रेमवर्क है। इसे jemalloc को अपने हीप आवंटक के रूप में उपयोग करने वाले लक्ष्य एप्लिकेशन (चाहे वह Android का libc हो, Firefox, FreeBSD का libc, स्वतंत्र jemalloc, या और कुछ भी) से स्वतंत्र होने के लिए डिज़ाइन किया गया है। वर्तमान संस्करण (2.0) का निम्नलिखित लक्ष्यों के साथ व्यापक परीक्षण किया गया है:
टूल के स्रोत कोड के अलावा, इस रिपॉजिटरी में shadow का उपयोग करने के लिए Android उपयोगकर्ता-स्थान डीबगिंग वातावरण स्थापित करने पर दस्तावेज़ीकरण, shadow का उपयोग करके Android के jemalloc संरचनाओं का एक त्वरित अवलोकन, और double, unaligned और arbitrary free() बग Android के jemalloc पर कैसे व्यवहार करते हैं पर कुछ नोट्स शामिल हैं।
जब आप पहली बार कोई jemalloc-विशिष्ट कमांड जारी करते हैं, shadow सभी jemalloc मेटाडेटा को पार्स करता है जो इसे जानता है और उन्हें Python पिकल फ़ाइल में सहेजता है। बाद के कमांड तेजी से काम करने के लिए मेमोरी से मेटाडेटा को फिर से पार्स करने के बजाय इस पिकल फ़ाइल का उपयोग करते हैं।
जब आप जानते हैं कि jemalloc मेटाडेटा की स्थिति बदल गई है (उदाहरण के लिए जब आपने कुछ आवंटन किए हैं या कचरा संग्रह ट्रिगर किया है), तो मेटाडेटा को फिर से पार्स करने और पिकल फ़ाइल को फिर से बनाने के लिए jeparse कमांड का उपयोग करें।
पहला कदम अपने होस्ट मशीन पर pyrsistence स्थापित करना है।
रूटेड डिवाइस पर निम्नलिखित करें:
host$ adb shell
phone$ su root
phone# ps -e
ps के आउटपुट से एक प्रक्रिया चुनें, उदाहरण के लिए com.google.process.gapps:
...
u0_a19 4679 3214 1668980 69216 SyS_epoll_ 7fa5f41430 S com.google.process.gapps
...
phone$ cd /data/local/tmp
phone$ ./gdbserver64 :5039 --attach 4679
आप "bin" निर्देशिका में ARM32 और ARM64 के लिए GDB सर्वर बाइनरी पा सकते हैं। या, यदि आप हम पर भरोसा नहीं करते हैं, तो करें:
host$ git clone http://android.googlesource.com/toolchain/gdb
host$ cd ./gdb/gdb-7.11
host$ mkdir build64; cd build64
host$ ../configure --program-prefix=aarch64-eabi-linux- --target=aarch64-eabi-linux --disable-werror
host$ make
host$ sudo make install
फिर होस्ट मशीन पर करें:
host$ adb forward tcp:5039 tcp:5039
host$ aarch64-eabi-linux-gdb
(gdb) target remote :5039
(gdb) source /dir/with/shadow/gdb_driver.py
(gdb) jeparse -c /dir/with/shadow/cfg/android7_64.cfg
(gdb) jeruns -c
कभी-कभी GDB सर्वर सुनना बंद कर देता है यदि आप target remote :5039 कमांड जारी करने में बहुत अधिक समय लेते हैं। इसलिए यदि आप jeparse कमांड जारी करते समय अजीब त्रुटियां देखते हैं, तो शुरुआत से शुरू करें।
shadow Windows/Firefox के लिए निम्नलिखित के साथ परीक्षण किया गया है:
नोट: यदि आप Firefox संस्करण 36.0 से पुराने के साथ काम करते हैं तो mozjs शाखा का उपयोग करें!
पहले आपको WinDBG को Mozilla के प्रतीक सर्वर के साथ सेटअप करना होगा। आपको pykd भी स्थापित करना होगा। फिर GitHub से क्लोन किए गए shadow निर्देशिका को किसी पथ पर कॉपी करें (जैसे C:\tmp\)।
आप फ़ाइल "windbg-init.cmd" में एक उदाहरण WinDBG प्रारंभिककरण स्क्रिप्ट भी पा सकते हैं। इसे C:\tmp\ पर रखें और WinDBG को windbg.exe -c "$$>< C:\tmp\windbg-init.cmd" से प्रारंभ करें।
अंत में, WinDBG के अंदर निम्नलिखित कमांड जारी करें:
!load pykd.pyd
!py c:\\tmp\\shadow\\pykd_driver help
[shadow] De Mysteriis Dom jemalloc
[shadow] shadow v2.0
[shadow] Firefox v56.0a1 (x86-64)
[shadow] jemalloc-विशिष्ट कमांड:
[shadow] jechunks : सभी उपलब्ध चंकों पर जानकारी डंप करें
[shadow] jearenas : jemalloc एरेनास पर जानकारी डंप करें
[shadow] jerun [-m] <address> : एकल रन पर जानकारी डंप करें
[shadow] -m : मैप कंटेंट पूर्वावलोकन मेटाडेटा पर
[shadow] jeruns [-cs] : jemalloc रन पर जानकारी डंप करें
[shadow] -c : केवल वर्तमान रन
[shadow] -s <size class> : केवल दिए गए आकार वर्ग के लिए रन
[shadow] jebins : jemalloc बिन्स पर जानकारी डंप करें
[shadow] jebininfo : बिन आकारों पर जानकारी डंप करें
[shadow] jesize2bin : आकार को बिन इंडेक्स में बदलें
[shadow] jeregions <size class> : उन सभी रनों को डंप करें जो दिए गए आकार वर्ग के क्षेत्रों को होस्ट करते हैं
[shadow] jesearch [-cs] <hex> : दिए गए हेक्स डीवर्ड के लिए हीप खोजें
[shadow] -c : केवल वर्तमान रन
[shadow] -s <size class> : केवल दिए गए आकार के क्षेत्र
[shadow] jeinfo <address> : एक पते के लिए सभी उपलब्ध विवरण प्रदर्शित करें
[shadow] jedump [path] : हीप स्नैपशॉट को वर्तमान कार्यशील निर्देशिका या निर्दिष्ट पथ पर संग्रहीत करें
[shadow] jestore [path] : jedump उपनाम
[shadow] jetcaches : सभी tcache पर जानकारी डंप करें
[shadow] jetcache [-bs] <tid> : एकल tcache पर जानकारी डंप करें
[shadow] -b <bin index> : केवल दिए गए बिन इंडेक्स के लिए जानकारी
[shadow] -s <size class> : केवल दिए गए आकार वर्ग के लिए जानकारी
[shadow] jeparse [-crv] : मेमोरी से jemalloc संरचनाओं को पार्स करें
[shadow] -c <config file> : jemalloc लक्ष्य कॉन्फ़िग फ़ाइल
[shadow] -r : कंटेंट पूर्वावलोकन पढ़ें
[shadow] -v : debug.log उत्पन्न करें
[shadow] Firefox-विशिष्ट (केवल pykd) कमांड:
[shadow] nursery : SpiderMonkey GC नर्सरी पर जानकारी प्रदर्शित करें
[shadow] symbol [-vjdx] <size> : दिए गए आकार के सभी Firefox प्रतीक प्रदर्शित करें
[shadow] -v : केवल vtable वाले वर्ग प्रतीक
[shadow] -j : केवल SpiderMonkey से प्रतीक
[shadow] -d : केवल DOM प्रतीक
[shadow] -x : केवल non-SpiderMonkey प्रतीक
[shadow] pa <address> [<length>] : ArrayObject की लंबाई संशोधित करें (डिफ़ॉल्ट नई लंबाई 0x666)
[shadow] Android-विशिष्ट कमांड:
[shadow] jefreecheck [-bm] : उन पतों को प्रदर्शित करें जिन्हें free() पर पास किया जा सकता है
[shadow] -b <bin index> : उन पतों को प्रदर्शित करें जो <bin index> के tcache बिन में मुक्त किए जाएंगे
[shadow] -m <name> : केवल इस विशिष्ट मॉड्यूल में खोजें
[shadow] सामान्य कमांड:
[shadow] jeversion : संस्करण संख्या आउटपुट करें
[shadow] jehelp : यह सहायता संदेश
यदि आप उपरोक्त सहायता संदेश नहीं देखते हैं तो आपने कुछ गलत किया है ;)
नोट: यह सुविधा वर्तमान में केवल Firefox/Windows के लिए है!
symbol कमांड आपको विशिष्ट आकारों के SpiderMonkey और DOM वर्गों (और संरचनाओं) की खोज करने की अनुमति देता है। यह तब उपयोगी होता है जब आप उपयोग-पश्चात-मुक्त बग का शोषण करने का प्रयास कर रहे होते हैं, या जब आप अधिलेखित/भ्रष्ट करने के लिए दिलचस्प पीड़ित वस्तुओं को स्थापित करना चाहते हैं।
shadow की मुख्य निर्देशिका में आप दो छोटी PDB पार्सिंग उपयोगिताएँ पा सकते हैं, symhex.py और pdbdy.py (तेज़)। उन्हें "xul.pdb" पर चलाएं ताकि Python पिकल फ़ाइल उत्पन्न हो जो shadow "pdb" निर्देशिका में ("pdb/xul-VERSION.pdb.pkl" के रूप में) अपेक्षा करता है। उन्हें चलाने से पहले सुनिश्चित करें कि आपने "msdia90.dll" पंजीकृत किया है; उदाहरण के लिए Windows 8.1 x86-64 पर आप ऐसा कर सकते हैं:
regsvr32 "c:\Program Files (x86)\Common Files\Microsoft Shared\VC\msdia90.dll"
एडमिनिस्ट्रेटर प्रॉम्प्ट से। आपको "comtypes" Python मॉड्यूल की भी आवश्यकता है; pip स्थापित करें और फिर pip install comtypes करें।
"xul.pdb" प्राप्त करने के लिए आपको WinDBG को Mozilla के प्रतीक सर्वर के साथ सेटअप करना होगा।
unmask_jemalloc को शुरू में सभी तीन मुख्य डीबगर्स और प्लेटफार्मों (WinDBG, GDB और LLDB) का समर्थन करने के लिए एक मॉड्यूलर डिज़ाइन के साथ पुनः डिज़ाइन किया गया था। जब Firefox/Windows/WinDBG-विशिष्ट सुविधाएँ जोड़ी गईं तो टूल का नाम बदलकर shadow कर दिया गया।
नए डिज़ाइन का एक अवलोकन निम्नलिखित है (तीरों को "आयात" के रूप में पढ़ें)। लक्ष्य, स्पष्ट रूप से, सभी डीबगर-निर्भर कोड को *_driver और *_engine मॉड्यूल में रखना है।
---------------------------------------------------------------------------------------
डीबगर-आवश्यक फ्रंटएंड (गोंद)
+------------+ +-------------+ +-------------+
| gdb_driver | | lldb_driver | | pykd_driver |
+------------+ +-------------+ +-------------+
^ ^ ^
| | |
------+-------------------+-------------------+----------------------------------------
| | |
| +--------+ |
+------------------------ | +-----+ कोर लॉजिक (डीबगर-अज्ञेय)
| | |
| | |
+-----------------+
+------+ | |
| |---------------> | shadow |<-----+
| util | +------> | | |
| | | +-----------------+ |
+------+ | ^ ^ ^ ^ |
| | | | | | | | | +--------+
| | | +-----+----------+ | +----+--------+---| symbol |
| | | | | | | | +--------+
+-+ | | | +----------+ | | | +---------+
| | | | | jemalloc | | +--------+---| nursery |
| | | | +----------+ | | +---------+
| | | | ^ ^ ^ | |
| | | | | | | | |
| | | | | | +------+--------+ |
| | | | | | | | |
| | +---+---+----+----------+--------+-----+ |
| | | | | | | | |
| +-----+---+----+----+ | | | |
| | | | | | | | |
--+---------+---+----+----+-----+--------+-----+----+----------------------------------
| | | | | | | | |
| | | | | | | | | डीबगर-निर्भर API
| | | | | | | | |
| | | | | | | | |
| | | | v | | v |
| +------------+ | +-------------+ | +-------------+
+->| gdb_engine | +--| lldb_engine | +--| pykd_engine |
+------------+ +-------------+ +-------------+
^ ^ ^
| | |
+---+ +---------+ +---------------+
| | |
| | |
-------+-------------+-------------+---------------------------------------------------
| | |
| | | डीबगर-प्रदत्त बैकएंड
| | |
| | |
+-----+ +------+ +------+
| gdb | | lldb | | pykd |
+-----+ +------+ +------+
---------------------------------------------------------------------------------------