
مُركّب Greybox مُوجَّه لفكّ تشويش تعليمات لغة التجميع.
QSynthesis هي واجهة برمجة تطبيقات Python3 لتنفيذ تخليق البرامج القائم على الإدخال/الإخراج لتعبيرات المتجهات البتية. تهدف إلى تسهيل إزالة تشويش الشيفرة. تعتمد الخوارزمية على نهج الصندوق الرمادي الذي يجمع بين التخليق القائم على الإدخال/الإخراج كصندوق أسود والبحث في شجرة التركيب المجردة (AST) كصندوق أبيض لتخليق التعبيرات الفرعية (إذا تعذّر تخليق العقدة الجذرية).
وُصفت هذه الخوارزمية أصلاً في ورشة BAR الأكاديمية:
تم إصدار الشيفرة كجزء من محاضرة Black Hat التالية:
إخلاء مسؤولية: هذا الإطار تجريبي، ويجب استخدامه لأغراض التجريب فقط. يهدف بشكل أساسي إلى تحفيز البحث في هذا المجال.
التثبيت والأمثلة وتوثيق واجهة برمجة التطبيقات متاحة في التوثيق المخصص: Documentation
يعتمد التخليق الأساسي على محرك Triton الرمزي الذي بُني عليه الإطار بأكمله. يوفر الوظائف التالية:
لكي يعمل، يجب أولاً تثبيت Triton: install documentation. لا يثبّت Triton نفسه تلقائياً في virtualenv، انسخه إلى venv الخاص بك أو استخدم --system-site-packages عند تهيئة venv.
ثم:
$ git clone https://github.com/quarkslab/qsynthesis.git
$ cd qsynthesis
$ pip3 install '.[all]'
سيقوم [all] بتثبيت جميع التبعيات (راجع التوثيق للتثبيت الخفيف).
تتطلب خوارزمية التخليق توليد جداول oracle مشتقة من قواعد نحوية (مجموعة
من المتغيرات والعوامل). يوفر تثبيت Qsynthesis أداة qsynthesis-table-manager
التي تتيح التعامل مع الجداول. يقوم الأمر التالي بتوليد جدول بثلاثة متغيرات من 64 بت،
و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}]")
شكر كبير للمساهمين في هذا البحث: