Retrowrite هو إعادة كتابة ثنائية ثابتة لـ X64 و AARCH64. إنه يعمل بدون استدلال ، ولا يقدم النفقات العامة ويستخدم تقنية التصوير (المعروفة أيضًا باسم التجميع القابل لإعادة التقييم ) لإدراج الأجهزة إلى الثنائيات دون الحاجة إلى رمز المصدر.
يرجى ملاحظة أن إصدار X64 وإصدار ARM64 يستخدمان خوارزميات إعادة كتابة مختلفة ودعم مجموعة مختلفة من الميزات.
للحصول على التفاصيل الفنية ، يمكنك قراءة الورقة (في IEEE S&P'20 ) لإصدار X64 وهذه الأطروحة لإصدار ARM64.
Kretrowrite هو متغير من إصدار X64 الذي يدعم إعادة كتابة وحدات Kernel Linux.
يتم تنفيذ Retrowrite في Python3 (3.6). ذلك يعتمد على pyelftools و capstone . لتثبيت التبعيات ، يرجى التشغيل:
pip install - r requirements . txtلا ينصح بتثبيت التبعيات من مديري حزم Distro الخاص بك ، حيث قد تكون قديمة.
| Retrowrite-X64 | Retrowrite-AARCH64 | |
|---|---|---|
| ثنائيات جردت | (WIP) | ✅ |
| ثنائيات غير مسببة | ✅ | |
| المترجمين غير القياسيين | ✅ | |
| الصفر العلوي | ✅ | ✅ |
| وحدات kernel دعم | ✅ | |
| أجهزة AFL-COVERAGE | ✅ | ✅ |
| أجهزة أسان | ✅ | ✅ |
| دعم C ++ | (WIP) | (WIP) |
(retro) $ retrowrite --help
usage: retrowrite [-h] [-a] [-A] [-m MODULE] [-k] [--kcov] [-c] [--ignore-no-pie] [--ignore-stripped] [-v] bin outfile
positional arguments:
bin Input binary to load
outfile Symbolized ASM output
optional arguments:
-h, --help show this help message and exit
-a, --assemble Assemble instrumented assembly file into instrumented binary
-A, --asan Add binary address sanitizer instrumentation
-m MODULE, --module MODULE
Use specified instrumentation pass/module in rwtools directory
-k, --kernel Instrument a kernel module
--kcov Instrument the kernel module with kcov
-c, --cache Save/load register analysis cache (only used with --asan)
--ignore-no-pie Ignore position-independent-executable check (use with caution)
--ignore-stripped Ignore stripped executable check (use with caution)
-v, --verbose Verbose output حدد تمريرة الأجهزة التي ترغب في تطبيقها باستخدام retrowrite -m <pass> يمكنك العثور على ممرات الأجهزة المتوفرة في المجلدات rwtools_x64 و rwtools_arm64 .
تمريرات الأجهزة المتاحة لـ X64: - AdviceSanitizer - معلومات AFL -Coverage
تمريرات الأجهزة المتاحة لـ AARCH64: - AdviceSanitizer - AFL -Coverage معلومات + Forkerver - سلامة تدفق التحكم في الحبيبات الخشنة على إدخالات الوظائف
retrowrite --asan </path/to/binary/> </path/to/output/binary>
ملاحظة: إذا كان على X64 ، فتأكد من أن الثنائي مستقل عن الموضع ولا يتم تجريده. يمكن التحقق من ذلك باستخدام أمر file (يجب أن يقول الإخراج ELF shared object ).
على سبيل المثال ، قم بإنشاء نسخة مخصصة من /bin/ls :
retrowrite --asan /bin/ls ls-basan-instrumented.s
هذا سوف يولد ملف التجميع ( .s ). لإعادة ترجمة التجميع إلى ثنائي ، يعتمد ذلك على الهندسة المعمارية:
يمكن تجميع التجميع الذي تم إنشاؤه وربطه باستخدام أي مترجم ، مثل:
gcc ls-basan-instrumented.s -lasan -o ls-basan-instrumented
تصحيح الأخطاء في حالة حصولك على undefined reference to `__asan_init_v4' ، استبدل" asan_init_v4 "بواسطة" asan_init "في ملف التجميع ، يمكن أن يساعدك الأمر التالي في فعل ذلك: sed -i 's/asan_init_v4/asan_init/g' ls-basan-instrumented.s
في AARCH64 ، نعتمد أيضًا على المترجمين القياسيين لتجميع وربط ، لكن مجموعة من أعلام المترجم أكثر مشاركة قليلاً ، لذلك نحن نقدم مفتاح -a على retrowrite الرئيسية القابلة للتنفيذ للقيام بذلك من أجلك:
retrowrite -a ls-basan-instrumented.s -lasan -o ls-basan-instrumented
لإنشاء ثنائي موثوق به AFL ، قم أولاً بإنشاء التجميع الرمزي كما هو موضح أعلاه. بعد ذلك ، إعادة ترجمة التجميع المربح مع afl-gcc من AFL ++ مثل هذا:
$ AFL_AS_FORCE_INSTRUMENT=1 afl-gcc foo.s -o foo
أو afl-clang .
لأدوات ثنائية مع معلومات التغطية ، استخدم تمريرة أدوات التغطية مع retrowrite -m coverage <input file> <output asm> . أعد تجميع الثنائي مع retrowrite -a <output asm> <new binary> .
يمكن الآن أن يكون الثنائي مغرورًا بـ:
afl-fuzz -i < seed folder > -o < out folder > < new binary > يحاول Retrowrite أيضًا إضافة أجهزة لتكون بمثابة forkerver لـ AFL ؛ في حالة حدوث مشكلات ، يمكنك تعطيل هذا السلوك باستخدام export AFL_NO_FORKSERVER=1
لإنشاء تجميع ترمز يمكن تعديله باليد أو بعد معالجته بواسطة الأدوات الحالية ، فقط لا تحدد أي تمريرة للأجهزة:
retrowrite </path/to/binary> <path/to/output/asm/files>
يمكن تحرير ملفات الإخراج ASM بحرية باليد أو عن طريق أدوات أخرى. بعد التعديل ، قد يتم تجميع ملفات ASM على ثنائيات العمل كما هو موضح أعلاه.
على الرغم من أن إعادة التشغيل قابلة للتشغيل مع الأدوات الأخرى ، فإننا نشجع الباحثين بشدة على استخدام API Retrowrite لتلبية احتياجاتهم الثنائية / التعديل! هذا يحفظ الجهد الإضافي المتمثل في الاضطرار إلى تحميل وحوض الثنائيات أو ملفات التجميع.
تشغيل setup.sh :
./setup.sh kernelتفعيل الافتراضية (من جذر المستودع):
source retro/bin/activate(مكافأة) للخروج من VirtualEnv عند الانتهاء من إعادة التعديل:
deactivateretrowrite --asan --kernel </path/to/module.ko> </path/to/output/module_asan.ko>retrowrite </path/to/module.ko> <path/to/output/asm/files> للحملة الغامضة ، يرجى الاطلاع على المجلد.
بشكل عام ، يحتوي librw/ على رمز التحميل والتفكيك وترمز الثنائيات ويشكل جوهر جميع التحولات. يمر التحول الفردي الذي يبني على أعلى إطار إعادة الكتابة هذا ، مثل معقم العنوان الثنائي فقط (Basan) كأدوات فردية في rwtools/ .
يتم ربط الملفات والمجلد الذي يبدأ بـ k بإصدار kernel reledrite.
في المجلد التجريبي/المجلد ، ستجد أمثلة لمستخدم المستخدمين و kernel recrowrite (demos/user_demo و demos/kernel_demo على التوالي).
تغطي المنشورات التالية أجزاء مختلفة من مشروع Retrowrite:
Retrowrite: تعمل ثنائيات الأهلية الثابتة لدعم وتطهير Sushant Dinesh و Nathan Burow و Dongyan Xu و Mathias Payer. في أوكلاند 20: ندوة IEEE الدولية حول الأمن والخصوصية ، 2020
لا مصدر ، لا مشكلة! عالي السرعة الثنائية الثنائية اللطيفة Matteo Rizzo ، و Mathias دافع. في 36C3'19: مؤتمر Climى Chaos ، 2019
ترخيص معهد ماساتشوستس للتكنولوجيا
حقوق الطبع والنشر (C) 2019 Hexhive Group ، Sushant Dinesh [email protected] ، Luca Di Bartolomeo [email protected] ، Antony Vennard [email protected] ، matteo rizzo matteizzo.personal.com ، mathias payerdayer@nebelwelt.
يتم منح الإذن بموجب هذا ، مجانًا ، لأي شخص يحصل على نسخة من هذا البرنامج وملفات الوثائق المرتبطة به ("البرنامج") ، للتعامل في البرنامج دون تقييد ، بما في ذلك على سبيل المثال لا الحصر حقوق استخدام الأشخاص ونسخها ودمجها ودمجها وتوزيعها وتوزيعها على ما يلي:
يجب إدراج إشعار حقوق الطبع والنشر أعلاه وإشعار الإذن هذا في جميع النسخ أو الأجزاء الكبيرة من البرنامج.
يتم توفير البرنامج "كما هو" ، دون أي ضمان من أي نوع ، صريح أو ضمني ، بما في ذلك على سبيل المثال لا الحصر ضمانات القابلية للتسويق واللياقة لغرض معين وعدم الانفجار. لا يجوز بأي حال من الأحوال أن يكون المؤلفون أو حاملي حقوق الطبع والنشر مسؤولاً عن أي مطالبة أو أضرار أو مسؤولية أخرى ، سواء في إجراء عقد أو ضرر أو غير ذلك ، ناشئة عن أو خارج البرنامج أو الاستخدام أو غيرها من المعاملات في البرنامج.