
ग्रेबॉक्स सिंथेसाइज़र जो असेंबली निर्देशों के डीऑबफस्केशन के लिए तैयार किया गया है।
QSynthesis एक Python3 API है जो बिटवेक्टर एक्सप्रेशनों के I/O आधारित प्रोग्राम सिंथेसिस को करने के लिए है। इसका उद्देश्य कोड डीऑबफस्केशन को सुविधाजनक बनाना है। यह एल्गोरिद्म एक ग्रेबॉक्स दृष्टिकोण है जो ब्लैकबॉक्स I/O आधारित सिंथेसिस और व्हाइटबॉक्स AST सर्च दोनों को मिलाकर सब-एक्सप्रेशनों को सिंथेसाइज़ करता है (यदि रूट नोड को सिंथेसाइज़ नहीं किया जा सकता)।
यह एल्गोरिद्म मूल रूप से BAR अकादमिक कार्यशाला में वर्णित किया गया था:
यह कोड निम्नलिखित Black Hat टॉक के भाग के रूप में जारी किया गया है:
अस्वीकरण: यह फ्रेमवर्क प्रायोगिक है, और इसका उपयोग केवल प्रयोगात्मक उद्देश्यों के लिए किया जाना चाहिए। इसका मुख्य उद्देश्य इस क्षेत्र में शोध को प्रोत्साहित करना है।
इंस्टॉलेशन, उदाहरण, और API दस्तावेज़ीकरण समर्पित दस्तावेज़ीकरण पर उपलब्ध है: Documentation
मुख्य सिंथेसिस Triton सिंबॉलिक इंजन पर आधारित है जिस पर पूरा फ्रेमवर्क बनाया गया है। यह निम्नलिखित कार्यक्षमताएँ प्रदान करता है:
काम करने के लिए पहले Triton इंस्टॉल करना होगा: इंस्टॉल दस्तावेज़ीकरण। Triton स्वयं को स्वचालित रूप से virtualenv में इंस्टॉल नहीं करता, इसे अपने venv में कॉपी करें या अपने venv को कॉन्फ़िगर करते समय --system-site-packages का उपयोग करें।
फिर:
$ git clone https://github.com/quarkslab/qsynthesis.git
$ cd qsynthesis
$ pip3 install '.[all]'
[all] सभी निर्भरताओं को इंस्टॉल करेगा (हल्के इंस्टॉल के लिए दस्तावेज़ीकरण देखें)।
सिंथेसिस एल्गोरिद्म के लिए एक व्याकरण (चर और ऑपरेटरों का एक सेट) से प्राप्त ओरेकल तालिकाओं को उत्पन्न करने की आवश्यकता होती है। Qsynthesis इंस्टॉलेशन उपयोगिता qsynthesis-table-manager प्रदान करता है जो तालिकाओं में हेरफेर करने में सक्षम बनाता है। निम्नलिखित कमांड 64 बिट के 3 चरों, 5 ऑपरेटरों और 16 इनपुट के वेक्टर का उपयोग करके एक तालिका उत्पन्न करता है। हम जनरेशन को 5 मिलियन प्रविष्टियों तक सीमित करते हैं।
$ qsynthesis-table-manager generate -bs 64 --var-num 3 --input-num 16 --random-level 5 --ops AND,NEG,MUL,XOR,NOT --watchdog 80 --limit 5000000 my_oracle_table
Generate Table
Watchdog value: 80.0
Depth 2 (size:3) (Time:0m0.23120s)
Depth 3 (size:21) (Time:0m0.23198s)
Depth 4 (size:574) (Time:0m0.26068s)
Depth 5 (size:400858) (Time:0m21.23231s)
Threshold reached, generation interrupted
Stop required
Depth 5 (size:5000002) (Time:4m52.56009s) [RAM:9.52Gb]
नोट: जनरेशन प्रक्रिया RAM का उपभोग करती है, --watchdog एक प्रतिशत सेट करने में सक्षम बनाता है जिसके ऊपर जनरेशन बाधित हो जाता है।
फिर हम एक प्रतीयमान ऑबफस्केटेड एक्सप्रेशन को सरल बनाने का प्रयास कर सकते हैं:
from qsynthesis import SimpleSymExec, TopDownSynthesizer, InputOutputOracleLevelDB
blob = b'UH\x89\xe5H\x89}\xf8H\x89u\xf0H\x89U\xe8H\x89M\xe0L\x89E\xd8H\x8bE' \
b'\xe0H\xf7\xd0H\x0bE\xf8H\x89\xc2H\x8bE\xe0H\x01\xd0H\x8dH\x01H\x8b' \
b'E\xf8H+E\xe8H\x8bU\xe8H\xf7\xd2H\x0bU\xf8H\x01\xd2H)\xd0H\x83\xe8' \
b'\x02H!\xc1H\x8bE\xe0H\xf7\xd0H\x0bE\xf8H\x89\xc2H\x8bE\xe0H\x01\xd0' \
b'H\x8dp\x01H\x8bE\xf8H+E\xe8H\x8bU\xe8H\xf7\xd2H\x0bU\xf8H\x01\xd2' \
b'H)\xd0H\x83\xe8\x02H\t\xf0H)\xc1H\x89\xc8H\x83\xe8\x01]\xc3'
# Perform symbolic execution of the instructions
symexec = SimpleSymExec("x86_64")
symexec.initialize_register('rip', 0x40B160) # arbitrary address
symexec.initialize_register('rsp', 0x800000) # arbitrary stack
symexec.execute_blob(blob, 0x40B160)
rax = symexec.get_register_ast("rax") # retrieve rax register expressions
# Load lookup tables
ltm = InputOutputOracleLevelDB.load("my_oracle_table")
# Perform Synthesis of the expression
synthesizer = TopDownSynthesizer(ltm)
synt_rax, simp = synthesizer.synthesize(rax)
print(f"expression: {rax.pp_str}")
print(f"synthesized expression: {synt_rax.pp_str} [{simp}]")
इस शोध में योगदानकर्ताओं को बहुत धन्यवाद: