
الفائز في مسابقة إضافات IDA 2016! Symbolic Execution بنقرة واحدة فقط!
Ponce (تُنطق [ 'poN θe ] بون-ثي) هو إضافة لـ IDA Pro تتيح للمستخدمين إمكانية إجراء تحليل التلوث والتنفيذ الرمزي على الثنائيات بطريقة سهلة وبديهية. مع Ponce أنت على بُعد نقرة واحدة من الحصول على كل قوة التنفيذ الرمزي المتطور. كُتب بالكامل بلغة C/C++.
التنفيذ الرمزي ليس مفهومًا جديدًا في مجتمع الأمن السيبراني. لقد كان موجودًا لسنوات عديدة، ولكن لم يتم إنشاء مشاريع مفتوحة المصدر مثل [Triton] (https://github.com/JonathanSalwan/Triton) و [Angr] (http://angr.io/) لمعالجة هذه الحاجة إلا حوالي عام 2015. على الرغم من توفر هذه المشاريع، غالبًا ما يُترك المستخدمون النهائيون لتنفيذ حالات استخدام محددة بأنفسهم.
لقد عالجنا هذه الاحتياجات بإنشاء Ponce، وهي إضافة لـ IDA تنفذ التنفيذ الرمزي وتحليل التلوث داخل أقوى مفكك/مصحح أخطاء لمهندسي الهندسة العكسية.
يعمل Ponce مع الثنائيات x86 و x64 في أي إصدار IDA >= 7.0. تثبيت الإضافة بسيط مثل نسخ الملفات المناسبة من [أحدث الإصدارات] (https://github.com/illera88/Ponce/releases/latest) إلى مجلد plugins\ في دليل تثبيت IDA الخاص بك.
تأكد من استخدام ثنائي Ponce المُجمَّع لإصدار IDA الخاص بك لتجنب أي تعارضات.
يعمل Ponce على ويندوز ولينكس و macOS بشكل أصلي!
سيتم تشغيل الإضافة تلقائيًا، وسيرشدك خلال التكوين الأولي عند تشغيلها لأول مرة. سيتم حفظ التكوين في ملف تهيئة حتى لا تضطر إلى القلق بشأن نافذة التهيئة مرة أخرى.
في الصورة المتحركة التالية نرى استخدام التلوث التلقائي وكيف يمكننا نفي شرط وحقنه في الذاكرة أثناء التصحيح:
argv.elite الذي تم حقنه في الذاكرة وبالتالي نصل إلى كود Win.يمكن العثور على الكود المصدري للـ crackme [هنا] (https://github.com/illera88/Ponce/blob/master/examples/crackme_xor.cpp)
![crackmexor_negate_and_inject] (https://cloud.githubusercontent.com/assets/5193128/18558282/5dd1cbca-7b27-11e6-81d7-13044bfc0b59.gif)
في هذا المثال نرى استخدام محرك التلوث مع cmake. نقوم بما يلي:
fread() من الملف.![cmake_tainting_fread] (https://cloud.githubusercontent.com/assets/5193128/18558313/7aaa6d88-7b27-11e6-9c63-9870720d14e3.gif)
في المثال التالي نستخدم محرك اللقطات:
fread() من الملف.![fread_test_negate_restore_inject] (https://github.com/illera88/Ponce/tree/780e1992a935d310f5a956e6ece6b8f630a853a7/media/x64_fread_test_negate_restore_inject.gif?raw=true) يمكن العثور على الكود المصدري للمثال [هنا] (https://github.com/illera88/Ponce/blob/master/examples/fread_SAGE.cpp)
في هذا القسم سنقوم بإدراج خيارات Ponce المختلفة بالإضافة إلى اختصارات لوحة المفاتيح:
![2016-09-15 11_39_08-configuracion] (https://cloud.githubusercontent.com/assets/5193128/18563366/44a8c698-7b3c-11e6-8802-efb3fe4a5a2d.png)
![2016-09-15 11_31_34-] (https://cloud.githubusercontent.com/assets/5193128/18563294/fd2cf992-7b3b-11e6-911f-c91c76804b5a.png)
![2016-09-15 11_32_32-] (https://cloud.githubusercontent.com/assets/5193128/18563447/7e4db840-7b3c-11e6-813b-868bdae515bc.png)
![2016-09-15 11_32_52-ida - testproject idb testproject exe c__users_default default-pc_documents_vi] (https://cloud.githubusercontent.com/assets/5193128/18563458/88c5bb7e-7b3c-11e6-8b4e-f4a694cad5a8.png) ![2016-09-15 11_33_10-taint _ symbolize memory range] (https://cloud.githubusercontent.com/assets/5193128/18563460/8adbb8f0-7b3c-11e6-886f-02441bff63a4.png)
![2016-09-15 12_09_11-inicio] (https://cloud.githubusercontent.com/assets/5193128/18563642/45860a7a-7b3d-11e6-9f95-e7aed529cc85.png)
![2016-09-15 11_35_11-] (https://cloud.githubusercontent.com/assets/5193128/18563556/e093f0c8-7b3c-11e6-9b37-b3b2c7111d57.png)
![2016-09-15 11_34_44-] (https://cloud.githubusercontent.com/assets/5193128/18563423/6db81160-7b3c-11e6-94a2-698ff334c024.png)
![2016-09-15 11_47_19-] (https://cloud.githubusercontent.com/assets/5193128/18563350/34e0fd20-7b3c-11e6-8040-7e5899fc200f.png)
![2016-09-15 11_37_40-] (https://cloud.githubusercontent.com/assets/5193128/18563529/cfc599c2-7b3c-11e6-84e1-5dd5c7b27537.png)
![2016-09-15 11_38_10-] (https://cloud.githubusercontent.com/assets/5193128/18563411/63cfeb50-7b3c-11e6-8f56-255bb27bc8f2.png)
![2016-09-15 11_38_23-] (https://cloud.githubusercontent.com/assets/5193128/18563385/53df1d42-7b3c-11e6-8c2f-f1bd16369f79.png)
![2016-09-15 12_07_10-] (https://cloud.githubusercontent.com/assets/5193128/18563579/fc95339a-7b3c-11e6-9947-971e0510eba4.png)
يعتمد Ponce على [إطار عمل Triton] (https://github.com/JonathanSalwan/Triton) لتوفير الدلالات وتحليل التلوث والتنفيذ الرمزي. Triton هو مشروع مفتوح المصدر رائع برعاية Quarkslab ويتم صيانته بشكل أساسي بواسطة [Jonathan Salwan] (http://shell-storm.org/) بمكتبة غنية. نود أن نشكر ونثني على عمل Jonathan مع Triton. أنت رائع! :)
منذ Ponce الإصدار v0.3، قمنا بنقل عملية بناء التجميع لاستخدام CMake. من خلال القيام بذلك، نقوم بتوحيد طريقة حدوث التكوين والبناء لأنظمة لينكس وويندوز و macOS. نحن ندعم الآن تقديم ملاحظات حول الكود الزائف حول تعليمات الرمزية أو التلوث. لكي تعمل هذه الميزة، تحتاج إلى إضافة hexrays.hpp إلى مجلد include الخاص بـ IDA SDK الخاص بك. يمكن العثور على hexrays.hpp في plugins/hexrays_sdk/ في مسار تثبيت IDA الخاص بك. إذا لم تكن قد اشتريت مفكك hex-rays، فلا يزال بإمكانك بناء Ponce باستخدام -DBUILD_HEXRAYS_SUPPORT=OFF. نحن نستخدم Github actions كبيئة CI الخاصة بنا. تحقق من [ملفات الإجراءات] (https://github.com/illera88/Ponce/tree/master/.github/workflows) إذا كنت تريد فهم كيفية حدوث عملية البناء.
كان خوان بونس دي ليون (1474 – يوليو 1521) مستكشفًا وكونكيستادور إسبانيًا. اكتشف فلوريدا في الولايات المتحدة. ستساعدك إضافة IDA على اكتشاف واستكشاف، ونأمل، التغلب على المسارات المختلفة في الثنائي.
نعم، يمكنك استخدام Ponce بشكل أصلي في IDA لويندوز أو الاتصال عن بُعد بجهاز لينكس أو macOS واستخدامه. في إصدار Ponce التالي، سندعم Ponce بشكل أصلي لإصدارات IDA الخاصة بلينكس و macOS.
في اختباراتنا وصلنا إلى معالجة 3000 تعليمة في الثانية. نخطط لاستخدام متتبع PIN الذي توفره IDA لزيادة السرعة.
افتح [مشكلة] (https://github.com/illera88/Ponce/issues)، سنقوم بحلها في أقرب وقت ممكن ;)
بالتأكيد! يرجى عمل طلبات سحب والعمل على المشكلات المفتوحة. سندفع لك بالبيرة مقابل المساعدة ;)
التنفيذ التزامني (concolic) و Ponce لديهما بعض المشاكل:
تحميل/كتابة ذاكرة رمزية: عندما يكون الفهرس المستخدم لقراءة قيمة ذاكرة رمزيًا مثل x = aray[symbolic_index]، تنشأ بعض المشاكل التي قد تؤدي إلى فقدان تتبع الإدخال المتحكم به من المستخدم الملوث/المرمز.
Triton لا يعمل بشكل جيد مع [تعليمات الفاصلة العائمة] (https://github.com/illera88/Ponce/issues/59).
التنفيذ التزامني يحلل فقط التعليمات المنفذة. وهذا يعني أن التتبع الرمزي يُفقد في حالات مثل التالية:
int check(char myinput) // Input is symbolic/tainted
{
int flag = 0;
if (myinput == 'A') //This condition is symbolic/tainted
flag = 1
else
flag =- 1;
return flag; // flag is not symbolic/tainted!
}