Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
collisions — تصادمات التجزئة واستغلالاتها | Kitploit
أدوات/GitHubGitHub/decalage2/collisions
الاستغلالتحليل التجزئةالتشفيرتحليل الملفات الثنائيةالتعلم والتعليم
GitHubdecalage2/collisions

collisions

تصادمات التجزئة واستغلالاتها

عرض المستودع
916منذ 4 سنواتلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

TL;DR getting an MD5 collision of these two images is now(*) سهلًا وفوريًا.

صفحة MD5 على ويكيبيديا ⟷ <a href=http://gunshowcomic.com/648>

لا تعبث بالنار، لا تعتمد على MD5.

(*) كان من الممكن منذ سنوات عديدة إحداث تصادم بين أي ملفين، لكن الأمر يستغرق عدة ساعات في كل مرة، دون اختصار. توفر هذه الصفحة حيلًا خاصة بتنسيقات الملفات وبادئات تصادم محسوبة مسبقًا لجعل التصادم فوريًا. git clone. شغّل السكربت. انتهى.

تصادمات الهاش واستغلالاتها

بقلم Ange Albertini وMarc Stevens.

  • مقدمة
  • الحالة
  • الهجمات
    • بادئة متطابقة
      • FastColl (MD5)
      • UniColl (MD5)
      • Shattered (SHA1)
    • تصادمات البادئة المختارة
      • HashClash (MD5)
      • Shambles (SHA1)
    • ملخص الهجمات
  • الاستغلالات
    • الاستراتيجية القياسية
      • JPG
        • مسحات مخصصة
PNG
  • عدم التوافق
  • GIF
  • GZIP
  • الملف القابل للتنفيذ المحمول
  • MP4 وغيرها
    • JPEG2000
  • PDF
    • JPG داخل PDF
  • ZIP
    • الصيغ المعتمدة على ZIP
  • استراتيجيات غير شائعة
    • MultiColls: سلسلة تصادمات متعددة
    • الصلاحية
    • PolyColls: تصادمات لأنواع ملفات مختلفة
      • PE - JPG
      • PDF - PE
      • PDF - PNG
    • PileUps (تصادم متعدد)
      • PE - PNG - MP4 - PDF
  • حالات الاستخدام
    • اجعلها كلها تتصادم!
    • ملفات الإدانة
  • الإخفاقات
    • ELF
    • Mach-O
    • Java Class
    • TAR
  • ملخص الاستغلالات
  • ملفات الاختبار
  • المراجع
  • الاعتمادات
  • الخلاصة
  • مقدمة

    الهدف هو استكشاف الهجمات الحالية بشكل موسّع - وإظهار على طول الطريق مدى ضعف MD5 (تصادمات فورية لأي JPG أو PNG أو PDF أو MP4 أو PE...) - وكذلك استكشاف تنسيقات الملفات الشائعة بالتفصيل لتحديد كيف يمكن استغلالها بهجمات حالية أو مستقبلية.

    في الواقع، يمكن استخدام نفس حيلة تنسيق الملف على عدة هاشات (استُخدمت نفس حيل JPG لـ MD5، و malicious SHA-1 و SHA1)، طالما أن التصادمات تتبع نفس أنماط البايتات.

    هذه الوثيقة ليست عن هجمات جديدة (أحدثها وُثّق في 2012)، بل عن أشكال جديدة لاستغلال الهجمات القائمة.

    الحالة

    الحالة الحالية - كما في ديسمبر 2018 - للهجمات المعروفة:

    • الحصول على ملف لهاش ملف آخر أو هاش معيّن: مستحيل

      • لا يزال حتى غير عملي مع MD2.
      • يعمل مع هاشات أبسط(*)
    • الحصول على ملفين مختلفين لهما نفس MD5: فوري

      • أمثلة: 1 ⟷ 2
    • جعل ملفين عشوائيين يحصلان على نفس MD5: بضع ساعات (72 hours.core)

      • أمثلة: 1 ⟷ 2
    • جعل ملفين عشوائيين من تنسيقات ملفات محددة (PNG, JPG, PE...) يحصلان على نفس MD5: فوري

      • اقرأ أدناه
    • الحصول على ملفين مختلفين لهما نفس SHA1: 6500 years.core

      • الحصول على ملفين PDF مختلفين لهما نفس SHA-1 لإظهار صورة مختلفة: فوري (البادئات محسوبة مسبقًا)

    (*) مثال مع crypt - بفضل Sven!```

    import crypt crypt.crypt("5dUD&66", "br") 'brokenOz4KxMc' crypt.crypt("O!>',%$", "br") 'brokenOz4KxMc'

    root@kitploit:~
    # الهجمات
    
    تعمل MD5 وSHA1 مع كتل من 64 بايت.
    
    إذا كان لمحتويين A وB نفس التجزئة، فإن إلحاق نفس المحتوى C بكليهما سيحافظ على نفس التجزئة.``` text
    hash(A) = hash(B) -> hash(A + C) = hash(B + C)
    

    تعمل التصادمات عن طريق إدراج عدد من كتل التصادم المحسوبة عند حد كتلة يعتمد على ما سبق في الملف. تبدو كتل التصادم هذه عشوائية للغاية مع بعض الاختلافات الطفيفة (تتبع نمطًا محددًا لكل هجوم) وستُحدث اختلافات صغيرة بينما تؤدي في النهاية إلى جعل قيم التجزئة متطابقة بعد هذه الكتل.

    تُستغل هذه الاختلافات لصنع ملفات صالحة بخصائص محددة.

    تعمل تنسيقات الملفات أيضًا من الأعلى إلى الأسفل، ومعظمها يعمل عبر أجزاء على مستوى البايت.

    يمكن إدراج بعض أجزاء 'التعليق' لمحاذاة أجزاء الملف مع حدود الكتل، ولمحاذاة هياكل محددة مع اختلافات كتل التصادم، ولإخفاء ما تبقى من عشوائية كتل التصادم عن محللات الملف، ولإخفاء محتوى صالح آخر عن المحلل (بحيث يرى محتوى آخر).

    غالبًا ما لا تكون أجزاء 'التعليق' هذه تعليقات حقيقية رسميًا: تُستخدم فقط كحاويات بيانات يتجاهلها المحلل (على سبيل المثال، أجزاء PNG ذات معرّف يبدأ بحرف صغير هي ثانوية، وليست حرجة).

    في معظم الأحيان، يُستخدم اختلاف في كتل التصادم لتعديل طول جزء تعليق، والذي يُعلن عادةً قبل بيانات هذا الجزء مباشرة: في الفجوة بين النسخة الأقصر والأطول من هذا الجزء، يُعلن جزء تعليق آخر لتجاوز محتوى ملف A. بعد محتوى الملف هذا A، ألحق فقط محتوى ملف آخر B.

    نظرًا لأن تنسيقات الملفات عادةً ما تعرّف مُنهيًا يجعل المحللات تتوقف عنده، فإن A سينهي التحليل، مما يجعل المحتوى الملحق B مهملاً.

    لذا عادةً ما يلزم تعليقان على الأقل - وغالبًا ثلاثة:

    1. المحاذاة
    2. إخفاء كتل التصادم
    3. إخفاء محتوى ملف واحد (لتصادمات قابلة لإعادة الاستخدام)

    خصائص تنسيقات الملفات الشائعة هذه تجعل ذلك ممكنًا - لا تُرى عادةً على أنها نقاط ضعف، لكن يمكن اكتشافها أو تطبيعها:

    • أجزاء وهمية - تُستخدم كتعليقات
    • أكثر من تعليق واحد
    • تعليقات ضخمة (الأطوال: 64b لـ MP4، 32b لـ PNG -> تصادمات تافهة. 16b لـ JPG، 8b لـ GIF -> لا يوجد تصادم عام لـ GIF، محدود لـ JPG)
    • تخزين أي بيانات في تعليق (يمكن فرض ASCII أو UTF8)
    • تخزين أي شيء بعد المُنهي (يُستخدم عادةً لأغراض خبيثة فقط) - يمكن تجنبه باستخدام تعليقين ينتهيان عند نفس الإزاحات.
    • لا يوجد فحص تكامل. عادةً ما يتم تجاهل CRC32 في PNG. ومع ذلك يمكن أن تكون جميعها صحيحة لأن كتل التصادم تُعلن أجزاءً بأطوال مختلفة - لذلك حتى إذا كانت بيانات الجزء تبدأ بشكل مختلف، فإن أطوال الأجزاء مختلفة
    • بنية مسطحة: ASN.1 يعرّف بنية أب مع طول جميع البنى الفرعية المضمنة، مما يمنع هذه الإنشاءات: ستحتاج إلى إساءة استخدام طول، وكذلك طول الأصل.
    • وضع تعليق قبل الترويسة - وهذا يجعل التصادمات العامة القابلة لإعادة الاستخدام ممكنة.

    البادئة المتطابقة

    1. حدد بادئة عشوائية - لا يهم محتواها أو طولها.
    2. تُحشى البادئة حتى كتلة 64 بايت التالية.
    3. تُحسب كتلة (كتل) التصادم بناءً على البادئة وتُلحق. كلا الجانبين عشوائيان للغاية. الاختلافات محددة مسبقًا بواسطة الهجوم.
    4. بعد هذه الكتلة (الكتل)، تكون قيمة التجزئة هي نفسها رغم اختلافات الملف.
    5. يمكن إضافة أي لاحقة متطابقة عشوائية.
    البادئة=البادئة
    التصادم A≠التصادم B
    اللاحقة=اللاحقة

    كلا الملفين متطابقان تقريبًا (يحتوي محتواهما على بضع بتات فقط من الاختلافات)

    الاستغلال:

    اجمع محتويين، ثم إما:

    • استغلال البيانات: تشغيل كود يفحص الاختلافات ويعرض أحدهما أو الآخر (عادةً ما يكون تافهًا لأن الاختلافات معروفة مسبقًا).
    • استغلال البنية: استغلال بنية الملف (عادةً، طول تعليق) لإخفاء محتوى أو إظهار الآخر (يعتمد على تنسيق الملف ومحللاته).

    ملفان بهذه البنية:

    البادئة=البادئة
    التصادم A≠التصادم B
    A=A
    B=B

    سيعرضان إما A أو B.

    FastColl (MD5)

    النسخة النهائية في 2009.

    • الوقت: بضع ثوانٍ من الحساب
    • المساحة: كتلتان
    • الاختلافات: لا سيطرة قبل، لا سيطرة بعد. قناع اختلاف FastColl:
      root@kitploit:~
      .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
      .. .. .. X. .. .. .. .. .. .. .. .. .. .. .. ..
      .. .. .. .. .. .. .. .. .. .. .. .. .. X. .X ..
      .. .. .. .. .. .. .. .. .. .. .. X. .. .. .. ..
      
    • الاستغلال: صعب

    الاختلافات ليست قريبة من بداية/نهاية الكتل، لذا يصعب جدًا استغلالها لأنك لا تتحكم في أي بايت مجاور. الحل المحتمل هو تخمين البايتات المحيطة بالقوة الغاشمة - راجع PoCGTFO 14:10.

    أمثلة:

    مع بادئة فارغة:``` MD5: fe6c446ee3a831ee010f33ac9c1b602c SHA256: c5dd2ef7c74cd2e80a0fd16f1dd6955c626b59def888be734219d48da6b9dbdd

    00: 37 75 C1 F1-C4 A7 5A E7-9C E0 DE 7A-5B 10 80 26 7u┴±─ºZτ£α▐z[►Ç& 10: 02 AB D9 39-C9 6C 5F 02-12 C2 7F DA-CD 0D A3 B0 ☻½┘9╔l_☻↕┬⌂┌═♪ú░ 20: 8C ED FA F3-E1 A3 FD B4-EF 09 E7 FB-B1 C3 99 1D îφ·≤ßú²┤∩○τ√▒├Ö↔ 30: CD 91 C8 45-E6 6E FD 3D-C7 BB 61 52-3E F4 E0 38 ═æ╚Eµn²=╟╗aR>⌠α8
    40: 49 11 85 69-EB CC 17 9C-93 4F 40 EB-33 02 AD 20 I◄àiδ╠↨£ôO@δ3☻¡ 50: A4 09 2D FB-15 FA 20 1D-D1 DB 17 CD-DD 29 59 1E ñ○-√§· ↔╤█↨═▌)Y▲ ................ 60: 39 89 9E F6-79 46 9F E6-8B 85 C5 EF-DE 42 4F 46 9ë₧÷yFƒµïà┼∩▐BOF ...X............ 70: C2 78 75 9D-8B 65 F4 50-EA 21 C5 59-18 62 FF 7B ┬xu¥ïe⌠PΩ!┼Y↑b { .............XX. ...........X.... ................ 00: 37 75 C1 F1-C4 A7 5A E7-9C E0 DE 7A-5B 10 80 26 7u┴±─ºZτ£α▐z[►Ç& ...X............ 10: 02 AB D9 B9-C9 6C 5F 02-12 C2 7F DA-CD 0D A3 B0 ☻½┘╣╔l_☻↕┬⌂┌═♪ú░ .............XX. 20: 8C ED FA F3-E1 A3 FD B4-EF 09 E7 FB-B1 43 9A 1D îφ·≤ßú²┤∩○τ√▒CÜ↔ ...........X.... 30: CD 91 C8 45-E6 6E FD 3D-C7 BB 61 D2-3E F4 E0 38 ═æ╚Eµn²=╟╗a╥>⌠α8 40: 49 11 85 69-EB CC 17 9C-93 4F 40 EB-33 02 AD 20 I◄àiδ╠↨£ôO@δ3☻¡ / 50: A4 09 2D 7B-15 FA 20 1D-D1 DB 17 CD-DD 29 59 1E ñ○-{§· ↔╤█↨═▌)Y▲ 60: 39 89 9E F6-79 46 9F E6-8B 85 C5 EF-DE C2 4E 46 9ë₧÷yFƒµïà┼∩▐┬NF 70: C2 78 75 9D-8B 65 F4 50-EA 21 C5 D9-18 62 FF 7B ┬xu¥ïe⌠PΩ!┼┘↑b {

    MD5: fe6c446ee3a831ee010f33ac9c1b602c SHA256: e27cf3073c704d0665da42d597d4d20131013204eecb6372a5bd60aeddd5d670

    root@kitploit:~
    أمثلة أخرى ببادئة متطابقة: [1](https://github.com/decalage2/collisions/blob/master/examples/fastcoll1.bin) ⟷ [2](https://github.com/decalage2/collisions/blob/master/examples/fastcoll2.bin)
    
    **البديل**: هناك [تصادم MD5 من كتلة واحدة](https://marc-stevens.nl/research/md5-1block-collision/) لكنه يستغرق خمسة أسابيع من الحساب.
    
    إليك [تسجيلاً](https://github.com/decalage2/collisions/blob/master/examples/fastcoll.svg) لعملية حساب FastColl دون أي بادئة
    و[آخر](https://github.com/decalage2/collisions/blob/master/examples/fastcoll-prefix.svg) مع بادئة.
    
    
    ### [UniColl](https://github.com/decalage2/collisions/blob/master/unicoll.md) (MD5)
    
    موثّق في [2012](https://www.cwi.nl/system/files/PhD-Thesis-Marc-Stevens-Attacks-on-Hash-Functions-and-Applications.pdf#page=199)، ومُنفَّذ في [2017](https://github.com/cr-marcstevens/hashclash/blob/95c2619a8078990056beb7aaa59104021714ee3c/scripts/poc_no.sh)
    
    [UniColl](https://github.com/cr-marcstevens/hashclash#create-you-own-identical-prefix-collision) يتيح لك التحكم في بضعة بايتات داخل كتل التصادم،
    قبل وبعد أول اختلاف، مما يجعله تصادمًا ببادئة متطابقة مع بعض الاختلافات القابلة للتحكم، تقريبًا مثل تصادم بادئة مُختارة.
    هذا مفيد جدًا، والأفضل من ذلك أن الاختلاف يمكن أن يكون متوقعًا جدًا:
    في حالة `m2+= 2^8` (المعروف أيضًا باسم `N=1` / `m2 9` في سكربت HashClash [poc_no.sh](https://github.com/cr-marcstevens/hashclash/blob/master/scripts/poc_no.sh#L30))،
    الاختلاف هو +1 على البايت التاسع، مما يجعله قابلاً للاستغلال بسهولة،
    حتى إنه يمكنك التفكير في التصادم في رأسك:
    الحرف التاسع من تلك الجملة سيُستبدل بالحرف التالي: `0` تُستبدل بـ `1`، و`a` تُستبدل بـ `b`..
    
    - الوقت: بضع دقائق (يعتمد على عدد البايتات التي تريد التحكم فيها )
    - المساحة: كتلتان
    - الاختلافات:   ```
       .. .. .. .. DD .. .. .. ..
       .. .. .. .. +1 .. .. .. ..
    
    • الاستغلال: سهل جدًا - بايتات متحكم بها قبل الاختلاف وبعده، والاختلاف قابل للتنبؤ. القيود الوحيدة هي المحاذاة وأنك تتحكم 'فقط' في 10 بايتات بعد الاختلاف.

    أمثلة مع N=1 و20 بايتًا من النص المحدد في كتل التصادم:``` 00: 55 6E 69 43-6F 6C 6C 20-31 20 70 72-65 66 69 78 UniColl 1 prefix 10: 20 32 30 62-F5 48 34 B9-3B 1C 01 9F-C8 6B E6 44 20b⌡H4╣;∟☺ƒ╚kµD 20: FE F6 31 3A-63 DB 99 3E-77 4D C7 5A-6E B0 A6 88 ■÷1:c█Ö>wM╟Zn░ªê 30: 04 05 FB 39-33 21 64 BF-0D A4 FE E2-A6 9D 83 36 ♦♣√93!d┐♪ñ■Γª¥â6
    40: 4B 14 D7 F2-47 53 84 BA-12 2D 4F BB-83 78 6C 70 K¶╫≥GSä║↕-O╗âxlp 50: C6 EB 21 F2-F6 59 9A 85-14 73 04 DD-57 5F 40 3C ╞δ!≥÷YÜà¶s♦▌W_@< .........X...... 60: E1 3F B0 DB-E8 B4 AA B0-D5 56 22 AF-B9 04 26 FC ß?░█Φ┤¬░╒V"»╣♦&ⁿ ................ 70: 9F D2 0C 00-86 C8 ED DE-85 7F 03 7B-05 28 D7 0F ƒ╥♀ å╚φ▐à⌂♥{♣(╫☼ ................ ................ .........X...... 00: 55 6E 69 43-6F 6C 6C 20-31 21 70 72-65 66 69 78 UniColl 1!prefix ................ 10: 20 32 30 62-F5 48 34 B9-3B 1C 01 9F-C8 6B E6 44 20b⌡H4╣;∟☺ƒ╚kµD ................ 20: FE F6 31 3A-63 DB 99 3E-77 4D C7 5A-6E B0 A6 88 ■÷1:c█Ö>wM╟Zn░ªê ................ 30: 04 05 FB 39-33 21 64 BF-0D A4 FE E2-A6 9D 83 36 ♦♣√93!d┐♪ñ■Γª¥â6 40: 4B 14 D7 F2-47 53 84 BA-12 2C 4F BB-83 78 6C 70 K¶╫≥GSä║↕,O╗âxlp / 50: C6 EB 21 F2-F6 59 9A 85-14 73 04 DD-57 5F 40 3C ╞δ!≥÷YÜà¶s♦▌W_@< 60: E1 3F B0 DB-E8 B4 AA B0-D5 56 22 AF-B9 04 26 FC ß?░█Φ┤¬░╒V"»╣♦&ⁿ 70: 9F D2 0C 00-86 C8 ED DE-85 7F 03 7B-05 28 D7 0F ƒ╥♀ å╚φ▐à⌂♥{♣(╫☼

    root@kitploit:~
    UniColl يتمتع بتحكم أقل من تصادم البادئة المختارة الحقيقي،
    لكنه أسرع بكثير، خاصةً أنه يتطلب كتلتين فقط.
    
    إليك [تسجيل](https://github.com/decalage2/collisions/blob/master/examples/unicoll.svg) لحساب UniColl.
    
    
    ### [Shattered](http://shattered.io) (SHA1)
    
    تم توثيقه في [2013](https://marc-stevens.nl/research/papers/EC13-S.pdf)، وحُسب في [2017](http://shattered.io).
    
    - الوقت: 6500 سنة.CPU و110 سنة.GPU
    - المساحة: كتلتان
    - الاختلافات:  ```
      .. .. .. DD ?? ?? ?? ??
      or
      ?? ?? ?? DD .. .. .. ..
    
    • الاستغلال: متوسط. الاختلافات تكون في البداية والنهاية تمامًا لكتل التصادم. لذا لا يوجد تحكم قبل وبعد طول في البادئة/في اللاحقة: يخزّن PNG طوله قبل نوع القطعة، لذا لن يعمل. ومع ذلك، سيعمل مع ملفات JP2 عندما تستخدم صيغة JFIF (نفس صيغة JPG)، ومن المحتمل مع MP4 وصيغ atom/box الأخرى إذا استخدمت أطوالاً طويلة على 64 بت (في هذه الحالة، تُوضع بعد نوع الذرة).

    الفرق بين كتل التصادم لكل جانب هو قناع Xor هذا:``` 0C 00 00 02 C0 00 00 10 B4 00 00 1C 3C 00 00 04 BC 00 00 1A 20 00 00 10 24 00 00 1C EC 00 00 14 0C 00 00 02 C0 00 00 10 B4 00 00 1C 2C 00 00 04 BC 00 00 18 B0 00 00 10 00 00 00 0C B8 00 00 10

    root@kitploit:~
    
    
    أمثلة: [PoC||GTFO 0x18](https://github.com/angea/pocorgtfo#0x18) يستخدم بادئات SHA1 المحسوبة،
    ويعيد استخدام الصورة مباشرة من مصدر PDFLaTeX (انظر [المقال 18:10](https://archive.org/stream/pocorgtfo18#page/n62/mode/1up))،
    كما يتحقق من قيمة البادئات عبر JavaScript في صفحة HTML (الملف متعدد الصيغ: ZIP وHTML وPDF).
    
    ## تصادمات البادئة المختارة
    
    إنها تسمح بالتصادم بين أي محتوى.
    
    | 𝓐            | ≠ | 𝔅             |
    | :----:        |:-:| :----:        |
    | تصادم *A* | ≠ | تصادم *B* |
    
    1. خذ أي بادئتين
    2. قم بحشو الأقصر حتى يصبح بنفس طول الأطول. يتم حشو كلاهما إلى الكتلة التالية - ناقص 12 بايتًا
      - ستُضاف هذه الـ 12 بايتًا من البيانات العشوائية على كلا الجانبين لجعل بحث عيد الميلاد عشوائيًا
    3. سيتم حساب X من كتل شبه التصادم وإلحاقها.
    
       كلما قلّت الكتل، طال الحساب.
    
       مثال: [400 كيلو-ساعة لكتلة واحدة](https://www.win.tue.nl/hashclash/SingleBlock/). 72 ساعة·نواة لتسع كتل باستخدام [HashClash](https://github.com/cr-marcstevens/hashclash).
    
    
    
    تصادمات البادئة المختارة جبارة، لكنها قد تستغرق وقتًا طويلًا حتى لزوج واحد من الملفات.
    
    ### [HashClash](https://github.com/cr-marcstevens/hashclash) (MD5)
    
    النسخة النهائية في [2009](https://www.win.tue.nl/hashclash/ChosenPrefixCollisions/).
    
    أمثلة: لنُحدِث تصادمًا بين `yes` و`no`. استغرق الأمر ثلاث ساعات على 24 نواة.```
    'yes' prefix:
    000:  79 65 73 0A-3D 62 84 11-01 75 D3 4D-EB 80 93 DE  yes◙=bä◄☺u╙MδÇô▐   - Prefix, padding
    010:  31 C1 D9 30-45 FB BE 1E-71 F0 0A 63-75 A8 30 AA  1┴┘0E√╛▲q≡◙cu¿0¬
    020:  98 17 CA E3-A2 6B 8E 3D-44 A9 8F F2-0E 67 96 48  ÿ↨╩πókÄ=D⌐Å≥♫gûH
    030:  97 25 A6 FB-00 00 00 00-49 08 09 33-F0 62 C4 E8  ù%ª√    I◘○3≡b─Φ
    
    040:  D5 F1 54 CD-CA A1 42 90-7F 9D 3D 9A-67 C4 1B 0F  ╒±T═╩íBÉ⌂¥=Üg─←☼  - Collision blocks start
    050:  04 9F 19 E8-92 C3 AA 19-43 31 1A DB-DA 96 01 54  ♦ƒ↓ΦÆ├¬↓C1→█┌û☺T
    060:  85 B5 9A 88-D8 A5 0E FB-CD 66 9A DA-4F 20 8A AA  à╡Üê╪Ñ♫√═fÜ┌O è¬
    070:  BA E3 9C F0-78 31 8F D1-14 5F 3E B9-0F 9F 3E 19  ║π£≡x1Å╤¶_>╣☼ƒ>↓
    
    080:  09 9C BB A9-45 89 BA A8-03 E6 C0 31-A0 54 D6 26  ○£╗⌐Eë║¿♥µ└1áT╓&
    090:  3F 80 4C 06-0F C7 D9 19-09 D3 DA 14-FD CB 39 84  ?ÇL♠☼╟┘↓○╙┌¶²╦9ä
    0A0:  1F 0D 77 5F-55 AA 7A 07-4C 24 8B 13-0A 54 A2 BC  ▼♪w_U¬z•L$ï‼◙Tó╝
    0B0:  C5 12 7D 4F-E0 5E F2 23-C5 07 61 E4-80 91 B2 13  ┼↕}Oα^≥#┼•aΣÇæ▓‼
    
    0C0:  E7 79 07 2A-CF 1B 66 39-8C F0 8E 7E-75 25 22 1D  τy•*╧←f9î≡Ä~u%"↔
    0D0:  A7 3B 49 4A-32 A4 3A 07-61 26 64 EA-6B 83 A2 8D  º;IJ2ñ:•a&dΩkâóì
    0E0:  BE A3 FF BE-4E 71 AE 18-E2 D0 86 4F-20 00 30 26  ╛ú ╛Nq«↑Γ╨åO  0&
    0F0:  0A 71 DE 1F-40 B4 F4 8F-9C 50 5C 78-DD CD 72 89  ◙q▐▼@┤⌠Å£P\x▌═rë
    
    100:  BA D1 BF F9-96 80 E3 06-96 F3 B9 7C-77 2D EB 25  ║╤┐∙ûÇπ♠û≤╣|w-δ%
    110:  1E 56 70 D7-14 1F 55 4D-EC 11 58 59-92 45 E1 33  ▲Vp╫¶▼UM∞◄XYÆEß3
    120:  3E 0E A1 6E-FF D9 90 AD-F6 A0 AD 0E-C6 D6 88 12  >♫ín ┘É¡÷á¡♫╞╓ê↕
    130:  B8 74 F2 9E-DD 53 F7 88-19 73 85 39-AA 9B E0 8D  ╕t≥₧▌S≈ê↓sà9¬¢αì
                                                                              \
    140:  82 BF 9C 5E-58 42 1E 3B-94 CF 5B 54-73 5F A8 4A  é┐£^XB▲;ö╧[Ts_¿J
    150:  FD 5B 64 CF-59 D1 96 74-14 B3 0C AF-11 1C F9 47  ²[d╧Y╤ût¶│♀»◄∟∙G      ................
    160:  C5 7A 2C F7-D5 24 F5 EB-BE 54 3E 12-B0 24 67 3F  ┼z,≈╒$⌡δ╛T>↕░$g?      ................
    170:  01 DD 95 76-8D 0D 58 FB-50 23 70 3A-BD ED BE AC  ☺▌òvì♪X√P#p:╜φ╛¼      ...............X
                                                                                 ................
    180:  B8 32 DB AE-E8 DC 3A 83-7A C8 D5 0F-08 90 1D 99  ╕2█«Φ▄:âz╚╒☼◘É↔Ö
    190:  2D 7D 17 34-4E A8 21 98-61 1A 65 DA-FC 9B A4 BA  -}↨4N¿!ÿa→e┌ⁿ¢ñ║      ................
    1A0:  E1 42 2B 86-0C 94 2A F6-D6 A4 81 B5-2B 0B E9 37  ßB+å♀ö*÷╓ñü╡+♂Θ7      ................
    1B0:  44 D2 E4 23-14 7C 16 B8-84 90 8B E0-A1 A7 BD 27  D╥Σ#¶|▬╕äÉïαíº╜'      ..............X.
                                                                                 ................
    1C0:  C7 7E E6 17-1A 93 C5 EE-59 70 91 26-4E 9D C7 7C  ╟~µ↨→ô┼εYpæ&N¥╟|
    1D0:  1D 3D AB F1-B4 F4 F1 D9-86 48 75 77-6E FE 98 84  ↔=½±┤⌠±┘åHuwn■ÿä      ................
    1E0:  EF 3C 1C C7-16 5A 1F 83-60 EC 5C FE-CA 17 0C 74  ∩<∟╟▬Z▼â`∞\■╩↨♀t      ................
    1F0:  EB 8E 9D F6-90 A3 CD 08-65 D5 5A 4C-2E C6 BE 54  δÄ¥÷Éú═◘e╒ZL.╞╛T      ...............X
                                                                                 ................
    
    'no' prefix:                                                                 ................
    000:  6E 6F 0A E5-5F D0 83 01-9B 4D 55 06-61 AB 88 11  no◙σ_╨â☺¢MU♠a½ê◄      ................
    010:  8A FA 4D 34-B3 75 59 46-56 97 EF 6C-4A 07 90 CC  è·M4│uYFVù∩lJ•É╠      ............X...
    020:  FE 19 D7 CF-6F 92 03 9C-91 AA A5 DA-56 92 C1 04  ■↓╫╧oÆ♥£æ¬Ñ┌VÆ┴♦      ................
    030:  E6 4C 08 A3-00 00 00 00-8D B6 4E 47-FF AF 7A 3C  µL◘ú    ì╢NG »z<
                                                                                 ................
    040:  D5 F1 54 CD-CA A1 42 90-7F 9D 3D 9A-67 C4 1B 0F  ╒±T═╩íBÉ⌂¥=Üg─←☼      ................
    050:  04 9F 19 E8-92 C3 AA 19-43 31 1A DB-DA 96 01 54  ♦ƒ↓ΦÆ├¬↓C1→█┌û☺T      ............X...
    060:  85 B5 9A 88-D8 A5 0E FB-CD 66 9A DA-4F 20 8A A9  à╡Üê╪Ñ♫√═fÜ┌O è⌐      ................
    070:  BA E3 9C F0-78 31 8F D1-14 5F 3E B9-0F 9F 3E 19  ║π£≡x1Å╤¶_>╣☼ƒ>↓
                                                                                 ................
    080:  09 9C BB A9-45 89 BA A8-03 E6 C0 31-A0 54 D6 26  ○£╗⌐Eë║¿♥µ└1áT╓&      ................
    090:  3F 80 4C 06-0F C7 D9 19-09 D3 DA 14-FD CB 39 84  ?ÇL♠☼╟┘↓○╙┌¶²╦9ä      .............X..
    0A0:  1F 0D 77 5F-55 AA 7A 07-4C 24 8B 13-0A 54 B2 BC  ▼♪w_U¬z•L$ï‼◙T▓╝      ................
    0B0:  C5 12 7D 4F-E0 5E F2 23-C5 07 61 E4-80 91 B2 13  ┼↕}Oα^≥#┼•aΣÇæ▓‼
                                                                                 ................
    0C0:  E7 79 07 2A-CF 1B 66 39-8C F0 8E 7E-75 25 22 1D  τy•*╧←f9î≡Ä~u%"↔      ................
    0D0:  A7 3B 49 4A-32 A4 3A 07-61 26 64 EA-6B 83 A2 8D  º;IJ2ñ:•a&dΩkâóì      ...............X
    0E0:  BE A3 FF BE-4E 71 AE 18-E2 D0 86 4F-20 00 30 22  ╛ú ╛Nq«↑Γ╨åO  0"      ................
    0F0:  0A 71 DE 1F-40 B4 F4 8F-9C 50 5C 78-DD CD 72 89  ◙q▐▼@┤⌠Å£P\x▌═rë
                                                                               /
    100:  BA D1 BF F9-96 80 E3 06-96 F3 B9 7C-77 2D EB 25  ║╤┐∙ûÇπ♠û≤╣|w-δ%
    110:  1E 56 70 D7-14 1F 55 4D-EC 11 58 59-92 45 E1 33  ▲Vp╫¶▼UM∞◄XYÆEß3
    120:  3E 0E A1 6E-FF D9 90 AD-F6 A0 AD 0E-CA D6 88 12  >♫ín ┘É¡÷á¡♫╩╓ê↕
    130:  B8 74 F2 9E-DD 53 F7 88-19 73 85 39-AA 9B E0 8D  ╕t≥₧▌S≈ê↓sà9¬¢αì
    
    140:  82 BF 9C 5E-58 42 1E 3B-94 CF 5B 54-73 5F A8 4A  é┐£^XB▲;ö╧[Ts_¿J
    150:  FD 5B 64 CF-59 D1 96 74-14 B3 0C AF-11 1C F9 47  ²[d╧Y╤ût¶│♀»◄∟∙G
    160:  C5 7A 2C F7-D5 24 F5 EB-BE 54 3E 12-70 24 67 3F  ┼z,≈╒$⌡δ╛T>↕p$g?
    170:  01 DD 95 76-8D 0D 58 FB-50 23 70 3A-BD ED BE AC  ☺▌òvì♪X√P#p:╜φ╛¼
    
    180:  B8 32 DB AE-E8 DC 3A 83-7A C8 D5 0F-08 90 1D 99  ╕2█«Φ▄:âz╚╒☼◘É↔Ö
    190:  2D 7D 17 34-4E A8 21 98-61 1A 65 DA-FC 9B A4 BA  -}↨4N¿!ÿa→e┌ⁿ¢ñ║
    1A0:  E1 42 2B 86-0C 94 2A F6-D6 A4 81 B5-2B 2B E9 37  ßB+å♀ö*÷╓ñü╡++Θ7
    1B0:  44 D2 E4 23-14 7C 16 B8-84 90 8B E0-A1 A7 BD 27  D╥Σ#¶|▬╕äÉïαíº╜'
    
    1C0:  C7 7E E6 17-1A 93 C5 EE-59 70 91 26-4E 9D C7 7C  ╟~µ↨→ô┼εYpæ&N¥╟|
    1D0:  1D 3D AB F1-B4 F4 F1 D9-86 48 75 77-6E FE 98 84  ↔=½±┤⌠±┘åHuwn■ÿä
    1E0:  EF 3C 1C C7-16 5A 1F 83-60 EC 5C FE-CA 17 0C 54  ∩<∟╟▬Z▼â`∞\■╩↨♀T
    1F0:  EB 8E 9D F6-90 A3 CD 08-65 D5 5A 4C-2E C6 BE 54  δÄ¥÷Éú═◘e╒ZL.╞╛T
    

    فيما يلي سجل للعملية بأكملها.

    Shambles (SHA-1)

    Shambles هو تصادم بادئة مُختارة مكلف للغاية يستخدم 9 كتل.

    كل كتلة لها نفس نمط xor مثل Shattered:``` 0C 00 00 02 C0 00 00 10 B4 00 00 1C 3C 00 00 04 BC 00 00 1A 20 00 00 10 24 00 00 1C EC 00 00 14 0C 00 00 02 C0 00 00 10 B4 00 00 1C 2C 00 00 04 BC 00 00 18 B0 00 00 10 00 00 00 0C B8 00 00 10

    root@kitploit:~
    ## ملخص الهجمات
    
    التجزئة | الاسم      | التاريخ | المدة | نوع البادئة | التحكم بالقرب من الاختلاف
    ---- | --------- | ---- | -------- | ----------- | -----------------
    MD5  | FastColl  | 2009 | 2s       | متطابقة   | لا شيء
         | UniColl   | 2012 | 7-40min  | متطابقة   | 4-10 بايت
         | HashClash | 2009 | 72h      | مختارة      | n/a
         |           |      |          |             |
    SHA1 | Shattered | 2013 | 6500yr   | متطابقة   | البادئة واللاحقة
         | Shambles  | 2020 | ?        | مختارة      | n/a
    
    
    # الاستغلالات
    
    عادةً ما يُنظر إلى تصادمات البادئة المتطابقة على أنها محدودة (للغاية)، لكن البادئة المختارة تستغرق وقتًا طويلًا.
    
    هناك نهج آخر يتمثل في إنشاء بادئات قابلة لإعادة الاستخدام إما عبر هجوم البادئة المتطابقة مثل UniColl - أو البادئة المختارة للتغلب على بعض القيود - ولكن إعادة استخدام زوج البادئات هذا مع حمولتين مثل هجوم البادئة المتطابقة الكلاسيكي.
    
    بمجرد حساب زوج البادئات، يصبح تصادم محتويين فوريًا:
    الأمر مجرد مسألة معالجة بيانات الملف (وفقًا لتنسيقات ملفات محددة) بحيث تتوافق مع مواصفات تنسيقات الملفات ومتطلبات البادئة المحسوبة مسبقًا.
    
    
    ## الاستراتيجية القياسية
    
    تصادمات كلاسيكية لملفين صالحين من نفس نوع الملف.
    
    
    ### JPG
    
    
    
    القيود النظرية والحلول البديلة:
    - القطعة *Application* يجب نظريًا أن تأتي مباشرة بعد علامة *Start of Image*.
      لكن عمليًا، هذا ليس ضروريًا، لذا يمكن أن يكون تصادمنا عامًا: القيد الوحيد هو حجم أصغر صورة.
    - يُخزَّن طول التعليق في بايتين، لذا فإن الكمية التي يمكنه تخزينها محدودة بـ 65536 بايت (تقريبًا حجم صورة 400×400).
    - بدلاً من القفز فوق ملف JPG كامل، يمكن تقسيم هذا الملف إلى مقاطعه وإضافة جسور قفز بين المقاطع.
    
      
    
      *تعليقات فوق كل مقاطع الصورة*
    
      
    
      *كيف تعمل جسور القفز الخاصة بالتعليقات*
    
    - بينما يتكون معظم هيكل JPG من مقاطع جميعها محدودة الحجم بـ 65536 بايت،
    فإن البيانات المضغوطة الفعلية تُخزَّن في *Entropy Coded Segment* الذي لا يلتزم بهذه الحدود:
    حجمها غير معروف مسبقًا وينمو بما يتجاوز ذلك الحد.
    وهي تنمو مع حجم الصورة، مما يجعلها تشكل معظم حجم الملف في صورة أساسية (غير تدريجية).
    لجعل الصورة بأكملها تتوافق مع كتل بحجم 64 كيلوبايت، الطريقة السهلة هي أولًا محاولة حفظ الصورة كصورة تدريجية (وهو ما يمكن لأي برنامج القيام به، ويقسم القطعة المشفرة عادةً إلى ما يصل إلى ستة تمريرات). الطريقة الأكثر تقدمًا هي استخدام *JPEGTran* مع معامل سطر الأوامر 'wizard' الخاص به `--scans` وتحديد تمريرات مخصصة.
    
    لا توجد قيود أخرى بخلاف مقاطع التمريرات،
    لذا فإن تصادم MD5 لأي ملفي JPG عشوائيين يكون *فوريًا*، ولا يحتاج إلى تصادم ببادئة مختارة، فقط UniColl.
    
    باستخدام [البرنامج النصي](https://github.com/decalage2/collisions/blob/master/scripts/jpg.py):```
    21:07:35.65>jpg.py Ange.jpg Marc.jpg
    
    21:07:35.75>
    

    أمثلة:

    ⟷

    مسحات مخصصة

    صورتا JPG متصادمتان في MD5

    إليك مثالاً على تعريف مسحات JPEGTran لتحويل صورة RGB بمقاس 1944x2508 إلى ملف JPG بنسبة 100% يحتوي على 20 مسحًا، بحيث تتسع جميعها في 64kb.``` // : -, , ;

    // 0=luma 0: 0-0, 0, 0; 0: 1-1, 0, 0; 0: 2-6, 0, 0; 0: 7-10, 0, 0; 0: 11-13, 0, 0; 0: 14-20, 0, 0; 0: 21-26, 0, 0; 0: 27-32, 0, 0; 0: 33-40, 0, 0; 0: 41-48, 0, 0; 0: 49-54, 0, 0; 0: 55-63, 0, 0;

    // 1=blueness 1: 0-0, 0, 0; 1: 1-16, 0, 0; 1: 17-32, 0, 0; 1: 33-63, 0, 0;

    // 2=redness 2: 0-0, 0, 0; 2: 1-16, 0, 0; 2: 17-32, 0, 0; 2: 33-63, 0, 0;

    root@kitploit:~
    النتيجة:
    
    
    
    *صورة RGB بدقة 1944×2508 بصيغة JPG بنسبة 100% مع 20 مسحًا*
    
    ### PNG
    
    
    
    القيود النظرية والحلول العملية:
    - يستخدم PNG خوارزمية CRC32 في نهاية مقاطعه، لكنها عمليًا تُتجاهل. يمكن أن تكون صحيحة لكن ذلك غير مطلوب.
    - البيانات الوصفية للصورة (الأبعاد، الفضاء اللوني...) تُخزَّن في مقطع `IHDR`،
      والذي يجب نظريًا أن يأتي مباشرة بعد التوقيع (أي قبل أي تعليق محتمل)،
      لذلك هذا يعني أنه يمكننا فقط حساب التصادمات مسبقًا للصور التي تتشارك في نفس البيانات الوصفية.
      ومع ذلك، يمكن لهذا المقطع فعليًا أن يأتي بعد كتلة التعليقات (في الغالبية العظمى من القارئات، باستثناء قارئات Apple)، لذا يمكننا وضع بيانات التصادم قبل الترويسة،
      وهذا يتيح تصادم أي زوج من صور PNG بعملية حساب مسبق واحدة.
    
    بما أن مقطع PNG له طول من أربعة بايتات، فلا حاجة لتعديل بنية أي من الملفين: يمكننا القفز فوق صورة كاملة دفعة واحدة.
    
    يمكننا إدراج أي عدد نريده من المقاطع المهمَلة، لذا يمكننا إضافة مقطع للمحاذاة، ثم مقطع سيتغير طوله عبر UniColl. وبذلك سيكون الطول `00` `75` و`01` `75`.
    
    إذًا، تصادم MD5 لأي صورتين عشوائيتين PNG هو *فوري*، دون أي شرط مسبق (بدون حساب، فقط بعض التعديلات البسيطة على الملفات)، ولا يتطلب تصادم اختيار البادئة، بل فقط UniColl.
    
    مع [البرنامج النصي](https://github.com/decalage2/collisions/blob/master/scripts/png.py):```
    19:27:04.79>png.py nintendo.png sega.png
    
    19:27:04.87>
    

    أمثلة:

    ⟷

    صورتا PNG متصادمتان MD5 بخصائص مختلفة

    إليك تسجيل للعملية كاملة.

    تسجيل لتصادم PNG عام (استغلالي)

    عدم التوافق

    معظم القارئات تقبل بدون مشاكل ملفات PNG التي تبدأ بقطعة (chunk) ليست IHDR.

    لكن بعضها (مثل Safari وPreview - هل من أمثلة أخرى؟) لا يتقبل ذلك. في هذه الحالة، يجب أن تكون ترويسة الصورة وخصائصها (الأبعاد، الفضاء اللوني) أولًا، قبل أي كتل تصادم.

    في هذه الحالة، يجب أن يمتلك الملفان المتصادمان نفس الخصائص. مرة أخرى، UniColl كافٍ، وبالطبع يمكن إعادة استخدام زوج البادئات المحسوب لأي زوج آخر من الملفات ذات الخصائص نفسها.

    إليك نص برمجي لتصادم أي زوج من هذه الملفات، ويقوم بتشغيل UniColl عند الحاجة لحساب زوج البادئات.

    أمثلة:

    ⟷

    ⟷

    زوجان من صور PNG المتصادمة MD5 بخصائص متطابقة لأقصى توافق

    إليك تسجيل للعملية كاملة عند استدعاء UniColl،

    تسجيل لتصادم UniColl لـ PNG

    وتسجيل آخر عندما تكون البادئة قد حُسبت مسبقًا.

    تسجيل لتصادم PNG ببادئة محسوبة مسبقًا

    GIF

    GIF مُعقّد:

    • يخزّن بياناته الوصفية في الترويسة قبل أن يكون أي تعليق ممكنًا، لذلك لا يمكن أن توجد بادئة عامة لجميع ملفات GIF.
    • إذا كان الملف يحتوي على لوحة ألوان عامة، فإنها تُخزَّن أيضًا قبل إمكانية وجود تعليق.
    • قطع التعليقات فيه محدودة الطول ببايت واحد، لذا الحد الأقصى هو 256 بايت!

    غير أن قطع التعليقات تتبع بنية غريبة: إنها سلسلة من <length:1> <data:length> حتى يتم تعريف طول صفري. وهذا يجعل أي بايت غير صفري «قفزة للأمام» صالحة. وهو ما يجعلها مناسبة للاستخدام مع FastColl، كما هو موضح في PoC||GTFO 14:11.

    لذا على الأقل، حتى لو لم نتمكن من الحصول على بادئة عامة، يمكننا تصادم أي زوج من ملفات GIF ذات البيانات الوصفية نفسها (الأبعاد، اللوحة) ولا نحتاج سوى لثانية واحدة من FastColl لحساب بادئتها.

    المشكلة الآن أننا لا نستطيع القفز فوق صورة كاملة مثل PNG أو فوق بنية كبيرة مثل JPG.

    الحل البديل الممكن هو معالجة البيانات المضغوطة أو تقسيم الصورة إلى مناطق صغيرة جدًا كما في حالة GIF hashquine، لكن هذا ليس الأمثل.

    فكرة أخرى تعمل بشكل عام هي أن بيانات الصورة تُخزَّن أيضًا باستخدام بنية تسلسل length data هذه: لذا إذا أخذنا ملفي GIF بدون حركة، كل ما علينا فعله هو:

    • تسوية اللوحة
    • ضبط مدة الإطار الأول على الحد الأقصى
    • صياغة تعليق سيقفز إلى بداية بيانات الإطار الأول، بحيث ينزلق التعليق فوق بيانات الصورة كتعليق، وينتهي بالطريقة نفسها: حتى يتم العثور على طول صفري. عندها سيواجه المحلِّل الإطار التالي ويعرضه.

    مع إعداد بسيط (فقط بضع مئات من البايتات الإضافية)، يمكننا الانزلاق فوق أي صورة GIF والتغلب على حد الـ 256 بايت. هذه الفكرة اقترحها Marc، وهي رائعة!

    إذن في النهاية، حدود GIF الحالية لتصادمات MD5 الفورية هي:

    • بدون حركة
    • يجب تسوية الصور على نفس اللوحة - انظر gifsicle --use-colormap web
    • يجب أن تكون أبعاد الصور متطابقة
    • بعد 11 دقيقة، سيعرض كلا الملفين الصورة نفسها

    اختصار سهل لتسوية صور GIF الثابتة هو جعلها إطارات حركة لنفس الصورة، ثم يمكننا استخدام نص برمجي لإعادة استخدام أو حساب كتل FastColl لإنشاء زوج ملفات يعرض كلًا منها.

    أمثلة:

    ⟷

    ملفا GIF متصادمان MD5 - الصور بواسطة KidMoGraph

    إليك تسجيل للعملية كاملة.

    تسجيل لتصادم FastColl لملف GIF

    GZIP

    مواصفات GZIP الإصدار 4.3: RFC 1952 (1996).

    • يتكوّن ملف Gzip من عضو واحد أو أكثر (تدفقات gzip) متسلسلة. سيتم فك ضغطها جميعًا ويُلحق محتواها غير المضغوط ببعضه البعض - حتى لو كان المحتوى غير المضغوط للعضو فارغًا.
    • يمكن فصل هذه الأعضاء بأصفار. سيتم تخطي الأصفار فقط، إلا في بداية الملف. سيتم فحص أي بايت غير صفري بحثًا عن التوقيع 1F 8B. إذا لم يطابق التوقيع، سيتوقف التحليل، ويمكن استخدام ذلك لإيقاف التحليل قسريًا بين حمولتين، لكنه سيطلق بعض التحذيرات التي قد تسبب مشاكل. إستراتيجية أخرى هي إضافة عضو فارغ إضافي في نهاية الملف، وجعل تحليل الحمولتين ينتهي هناك - على العضو أو على جسمه.
    • حقلا filename وfile comment الاختياريان ينتهيان ببايت صفري، بينما Extra field محدد بحجم 16 بت، وبالتالي قابل للاستغلال. يتكون من حقل فرعي واحد أو أكثر، بمعرّف وطول فرعي خاص به، لكن الحقول الفرعية غير مفروضة - فعدد قليل جدًا منها معرّف رسميًا.

    لذلك فإن عضو gzip فارغ مع حقل إضافي هو مضيف طفيلي مثالي.

    إذا كان الملف العلوي كبيرًا جدًا بحيث لا يتسع لحقل إضافي، فيمكن تقسيم تدفقه غير المضغوط إلى ملفات أصغر حتى تتسع جميعها في الحقول الإضافية.

    بعد ترويسة العضو يأتي جسمه المضغوط، وCRC32 الخاص به وحجمه غير المضغوط (غير مفروض). لذلك فإن جسم بيانات فارغ مع CRC32 وحجم صفريين يشكّل غلافًا ختاميًا عامًا، يمكن حتى مشاركته بين ترويسات أعضاء مختلفة.

    تعتمد تطبيقات مختلفة على الحجم غير المضغوط للعضو الأخير بدلاً من مجموع كل الأعضاء. لذلك ستُظهر ملفاتنا المتصادمة أن حجمها صفري، لأن هذه الملفات تنتهي بعضو فارغ يُستخدم كنقطة انطلاق.

    إليك نص برمجي لتوليد تصادمات MD5 فورية لملفي GZip. يقضي معظم وقته في فك ضغط البيانات وإعادة ضغطها إذا كانت ملفات الإدخال كبيرة - بادئات التصادم محسوبة مسبقًا. لا يمكن تقسيم الأعضاء دون فك ضغط لأن CRC32 غير المضغوط يجب حسابه.

    ملف .tar.gz هو مجرد أرشيف gzip لأرشيف tar. سيعمل بشكل جيد مع tar المضغوط بـ gzip، بخلاف tar نفسه.

    أمثلة: collision1.tar.gz (Pacome) ⟷ collision2.tar.gz (Reg)

    Portable Executable

    يتميز Portable Executable ببنية خاصة:

    • ترويسة DOS القديمة شبه عديمة الفائدة، وتشير إلى البنية التالية، وهي ترويسة PE. لا دور آخر لترويسات DOS. يمكن تبادل ترويسات DOS بين الملفات القابلة للتنفيذ.
    • يجب أن تكون ترويسة DOS عند الإزاحة 0، وطولها ثابت بمقدار كتلة كاملة، والمؤشر في نهاية البنية، خارج نطاق وصول UniColl: لذا فإن تصادم البادئة المختارة فقط هو المفيد لتصادم ملفات PE بهذه الطريقة.
    • ترويسة PE وما يليها يحددان الملف بأكمله.

    لذا فالإستراتيجية هي:

    1. يمكن نقل ترويسة PE إلى الأسفل لترك مساحة لكتل التصادم بعد ترويسة DOS.
    2. يمكن استغلال ترويسة DOS (عبر تصادمات البادئة المختارة) للإشارة إلى إزاحتين مختلفتين، حيث سيتم نقل ترويستي PE مختلفتين.
    3. يمكن وضع الأقسام بجانب بعضها البعض، بعد بنية DOS/Collisions/Header1/Header2. كل ما عليك فعله هو تطبيق دلتا على إزاحات جدولي الأقسام.

    هذا يعني أنه من الممكن تصادم أي زوج من ملفات PE القابلة للتنفيذ فورًا. حتى لو استخدما أنظمة فرعية أو معماريات مختلفة.

    بينما تكون تصادمات الملفات القابلة للتنفيذ عادةً تافهة عبر أي مُحمِّل (loader)، فإن هذا النوع من الاستغلال هنا شفاف: الكود متطابق ويُحمَّل في نفس العنوان.

    أمثلة: tweakPNG.exe (GUI) ⟷ fastcoll.exe (CLI)

    إليك نص برمجي لتوليد تصادمات MD5 فورية لملفات ويندوز القابلة للتنفيذ.

    MP4 وغيرها

    حاوية هذا التنسيق هي سلسلة من القطع Length Type Value تُسمى Atoms. الطول هو 32 بت بترتيب big-endian ويشمل نفسه والنوع والقيمة، لذا الحد الأدنى للطول الطبيعي هو 8 (النوع سلسلة من 4 أحرف ASCII).

    إذا كان الطول صفريًا، فإن الذرة تأخذ باقي الملف - مثل ذرات jp2c في ملفات JP2. إذا كان 1، فإن النوع يتبعه طول 64 بت، مما يحوّل الذرة إلى Type Length Value، ويجعلها متوافقة مع تصادمات أخرى مثل Shattered.

    بعض الذرات تحتوي ذرات أخرى: في هذه الحالات، تُسمى boxes. ولهذا سُميت هذه البنية التي لا اسم لها "atom/box".

    تنسيق "atom/box" المستخدم في MP4 هو في الواقع مشتق من Apple Quicktime، ويُستخدم في العديد من التنسيقات الأخرى (JP2, HEIF, F4V).

    نوع الذرة الأولى هو عادةً ftyp، مما يتيح التمييز بين تنسيق الملف الفعلي.

    التنسيق متساهل إلى حد كبير: فقط سلاسل ذرات free، واستغل طول إحداها باستخدام UniColl، ثم اقفز فوق الحمولة الأولى.

    بالنسبة لملفات MP4، الشيء الوحيد الذي يجب إضافته هو ضبط جداول stco (Sample Table - Chunk Offsets) أو co64 (المكافئ 64 بت)، لأنها إزاحات مطلقة (!) تشير إلى بيانات الفيلم mdat - وهي مفروضة فعليًا!

    وهذا يعطينا نصًا برمجيًا يصطدم فورًا بأي فيديو عشوائي - وكما ذُكر، قد يعمل على تنسيقات أخرى غير MP4.

    Nirvana - Smells like Teen Spirit / Weird Al Yankovik - Smells like Nirvana

    أمثلة (فيديوهات بواسطة KidMoGraph):

    • أطوال 32بت (قياسي) collision1.mp4 ⟷ collision2.mp4

      ⟷

    • أطوال 64بت collisionl1.mp4 ⟷ collisionl2.mp4

      ⟷

    لاحظ أن بعض العارضين (OS X, Safari, FireFox) لا يسمحون بملف يبدأ بذرة ليست ftyp. في هذه الحالة، يجب أن تغطي البادئة هذا الأمر، وهي ليست عامة جدًا، لكن فيما عدا ذلك فهي نفس الإستراتيجية - فقط مقتصرة على نوع ملف واحد.

    JPEG2000

    تبدأ ملفات JPEG2000 عادةً ببنية Atom/Box مثل MP4، ثم تكون الذرة الأخيرة jp2c عادةً حتى نهاية الملف (طول صفري)، ومن هذه النقطة تتبع بنية JFIF، مثل JPEG (بدءًا بـ FF 4F كعلامة مقطع).

    الصيغة النقية لـ JFIF مقبولة أيضًا، وفي هذه الحالة يكون التصادم مثل JPEG: متوافق مع Shattered، لكن مع تعليقات محدودة بـ 64 كيلوبايت.

    من ناحية أخرى، إذا تعاملت مع ملفات JPEG2000 باستخدام Atom/Box، فلن تواجه هذا القيد.

    كما ذُكر سابقًا، إذا كنت تحاول تصادم هذه البنية وكانت هناك قيود إضافية - على سبيل المثال، بعض التنسيقات لا تتقبل البدء بذرة free - فيمكنك حساب أزواج بادئات UniColl أخرى خاصة بهذا التنسيق: يبدو أن JPEG2000 يفرض ذرة 'jP ' أولاً قبل ftyp المعتاد، لكن بخلاف ذلك، هذا هو القيد الوحيد: ليست هناك حاجة لنقل أي شيء.

    لذا فإن النص البرمجي الناتج أبسط!

    Oded Goldreich / Neal Koblitz

    أمثلة: collision1.jp2 ⟷ collision2.jp2

    PDF

    حول Shattered

    استغلال Shattered لم يكن خدعة PDF، بل خدعة JPG داخل PDF.

    لقد مكّن فقط ملف PDF من احتواء كائن مضغوط بصيغة JPG يمكن أن يكون له محتويان مختلفان. وكان على ملفي PDF أن يكونا متطابقين تمامًا فيما عدا ذلك.

    لاحظ أن المستندات يمكن أن تكون طبيعية تمامًا، ويمكنها فقط قص صورة JPG المتصادمة وعرضها في أماكن مختلفة، مثل المستندات متعددة الصفحات.

    أمثلة: ورقة Shattered، معدّلة ⟷ ورقة Shattered، أصلية

    ورقة Shattered تستخدم JPG متصادمة في مكانين

    تصادمات PDF باستخدام MD5

    باستخدام MD5 (وأنماط تصادم أخرى)، يمكننا إجراء تصادمات PDF على مستوى المستند، دون أي قيود على أي من الملفين!

    لـ PDF بنية مختلفة جدًا عن تنسيقات الملفات الأخرى. يستخدم أرقام الكائنات والمراجع لتعريف شجرة. المستند بأكمله يعتمد على عنصر الجذر.

    هذا PDF (الصالح)``` text %PDF-1. 1 0 obj<</Pages 2 0 R>>endobj 2 0 obj<</Kids[3 0 R]/Count 1>>endobj 3 0 obj<</Parent 2 0 R>>endobj trailer <</Root 1 0 R>>

    root@kitploit:~
    يعادل:``` text
    %PDF-1.
    11 0 obj<</Pages 12 0 R>>endobj
    12 0 obj<</Kids[13 0 R]/Count 1>>endobj
    13 0 obj<</Parent 12 0 R>>endobj
    trailer <</Root 11 0 R>>
    

    حِيَل:

    • تخزين الكائنات غير المستخدمة في ملف PDF أمر مقبول.
    • تخطي أي أرقام كائنات هو أمر مقبول أيضًا. بل توجد طريقة رسمية لتخطي الأرقام في جدول XREF.

    إذن تخزين شجرتي مستندات في نفس الملف أمر مقبول. كل ما نحتاجه هو جعل كائن الجذر يشير إلى أيٍّ من كائنَي الجذر في المستندين.

    إذن كل ما علينا فعله هو أخذ مستندين، وإعادة ترقيم الكائنات والمراجع بحيث لا يوجد تداخل، وصياغة تصادم بحيث يمكن تغيير رقم الكائن المُشار إليه ككائن جذر مع الحفاظ على نفس قيمة التجزئة، وهو أمر مثالي لـ UniColl مع N=1، وضبط جدول XREF وفقًا لذلك.

    بهذه الطريقة، يمكننا إحداث تصادم آمن بين أي زوج من ملفات PDF، بغض النظر عن أرقام الصفحات أو الأبعاد أو الصور...

    تعليقات

    يمكن لملفات PDF تخزين بيانات خارجية بطريقتين:

    • كتعليق سطري، حيث الأحرف الوحيدة غير المسموح بها هي أحرف السطر الجديد (\r و\n). يمكن استخدام هذا داخل كائن قاموس، لتعديل مرجع كائن مثلًا، عبر UniColl. لذا يعد هذا كائن PDF صالحًا حتى لو احتوى على كتل تصادم ثنائية - فقط أعد المحاولة حتى لا توجد أحرف سطر جديد: ``` 1 0 obj << /Type /Catalog /MD5_is /REALLY_dead_now__ /Pages 2 0 R %¥┬•σe╕█╙X₧_~π▌╒εX∟■φe♦%τ8╞■[...]p╛╬ûFZ»‼v◘Åp↑╝%▓% ▼σφj╔◄dZ▀c²aU≤╨╩[├└─yNΓ5╔+▀╪yδ☻ß⌐░¼à(☺z₧
      endobj
      root@kitploit:~
    • ككائن دفق، وفي هذه الحالة تكون أي بيانات ممكنة، ولكن بما أننا داخل كائن، لا يمكننا تعديل بنية PDF بالكامل، لذلك يتطلب الأمر تصادم بادئة مختارة لتعديل البنية خارج كائن الدفق المحتوي.

    نص متصادم

    الحالة الأولى تتيح إبراز جمال UniColl، وهو تصادم تكون فيه الاختلافات قابلة للتنبؤ، حتى تتمكن من كتابة الشعر فوق البيانات المتصادمة - بفضل Jurph!

    بدلاً من تعديل بنية المستند وخداع المحللات، سنستخدم كتل التصادم مباشرة لإنتاج نص مباشر، بقراءة بديلة!``` V V Now he hash MD5, Now he hath MD5, No enemy cares! No enemy dares! Only he gave Only he have the shards. the shares. Can’t be owned & Can’t be pwned & his true gold, his true hold, like One Frail, like One Grail, sound as fold. sound as gold. ^ ^

    root@kitploit:~
    Examples: [poeMD5 A](https://github.com/decalage2/collisions/blob/master/examples/poeMD5_A.pdf) ⟷ [poeMD5 B](https://github.com/decalage2/collisions/blob/master/examples/poeMD5_B.pdf)
    
    
    
    *إبداع فني تشفيري حقيقي :)*
    
    (ملاحظة: أخطأت في التوافق مع Adobe، لكن هذا خطئي أنا، وليس خطأ UniColl)
    
    
    **بنية تصادم المستندات**
    
    سواء استخدمت UniColl كتعليق مضمّن أو كبادئة مختارة في كائن دفق وهمي، فإن الاستراتيجية متشابهة:
    أعد ترتيب أرقام الكائنات، ثم اجعل كائن Root يشير إلى كائنات مختلفة، لذلك وعلى عكس Shattered، يعني هذا تصادمًا فوريًا لأي زوج عشوائي من ملفات PDF، على مستوى المستند.
    
    خدعة مفيدة هي أن مخرجات [`mutool clean`](https://mupdf.com/docs/manual-mutool-clean.html) يمكن التنبؤ بها بشكل موثوق،
    لذلك يمكن استخدامها لتطبيع ملفات PDF كمدخلات، وإصلاح ملف PDF المدمج مع الحفاظ على الأجزاء المهمة من الملف دون تعديل.
    MuTool لا يتجاهل المفاتيح/القيم الزائفة - إلا إذا طُلب منه ذلك، ويحتفظ بها بنفس الترتيب،
    لذا فإن استخدام إدخالات قاموس مزيفة مثل `/MD5_is /REALLY_dead_now__` مثالي لمحاذاة الأشياء بشكل يمكن التنبؤ به دون الحاجة إلى نوع آخر من التعليقات.
    ومع ذلك، فإنه لا يحتفظ بالتعليقات في القواميس (لذلك لا توجد خدعة التعليق المضمّن)
    
    طريقة سهلة للقيام بعملية إعادة خلط الكائنات دون عناء هي مجرد دمج ملفي PDF
    عبر `mutool merge` ثم تقسيم كائن `/Pages` إلى قسمين.
    
    لإفساح مساحة لهذا الكائن، فقط ادمج ملف PDF وهميًا أمام المستندين.
    
    اختياريًا، أنشئ مرجعًا مزيفًا إلى المصفوفة المعلقة
    لمنع تجميع القمامة (garbage collection) من حذف المجموعة الثانية من الصفحات.
    
    
    **مثال**:
    بهذا [البرنامج النصي](https://github.com/decalage2/collisions/blob/master/scripts/pdf.py)،
    يستغرق الأمر [أقل من ثانية](https://github.com/decalage2/collisions/blob/master/examples/pdf.log) لتصادم الورقتين العامتين بصيغة PDF مثل Spectre وMeltdown:
    
    Examples: [spectre.pdf](https://github.com/decalage2/collisions/blob/master/examples/collision1.pdf) ⟷ [meltdown.pdf](https://github.com/decalage2/collisions/blob/master/examples/collision2.pdf)
    
    
    
    امتداد محتمل: سلسلة كتل UniColl للاحتفاظ أيضًا بأزواج من [الكائنات غير الحرجة](https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/PDF32000_2008.pdf#page=81)
    المختلفة التي يمكن الإشارة إليها في كائن Root - مثل `Outlines` و`Names` و`AcroForm` والإجراءات الإضافية (`AA`) - في ملفات المصدر الأصلية.
    
    **في PDFLaTeX**
    
    تعمل التقنيات السابقة مع زوج واحد فقط من ملفات PDF،
    ولكن من الممكن أيضًا القيام بذلك مباشرةً من مصادر TeX
    عبر [معاملات PDFTeX محددة](http://texdoc.net/texmf-dist/doc/pdftex/manual/pdftex-a.pdf).
    
    يمكنك تعريف الكائنات مباشرةً - بما في ذلك المفاتيح والقيم الوهمية للمحاذاة - وتعريف كائنات فارغة لحجز بعض فتحات الكائنات عن طريق تضمين ما يلي في بداية مصادر TeX الخاصة بك:``` latex
    % set PDF version low to prevent stream XREF
    \pdfminorversion=3
    
    \begingroup
    
      % disable compression to keep alignments
      \pdfcompresslevel=0\relax
    
      \immediate
      \pdfobj{<<
        /Type /Catalog
    
        % cool alignment padding
        /MD5_is /REALLY_dead_now__
    
        % the first reference number should be on offset 0x49,
        % so the '2' object number will be changed to '3' by UniColl
        /Pages 2 0 R
    
        % now padding so that the collision blocks (ends at 0xC0) are covered
        /0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
        % with an extra character to be replaced by a return char
        /0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0
      >>}
    
      % the original catalog of the shifted doc
      \immediate\pdfobj{<</Type/Pages/Count 1/Kids[8 0 R]>>}
    
      % the original catalog of the host doc
      \immediate\pdfobj{<</Type/Pages/Count 1/Kids[33 0 R]>>}
    
      % now we need to reserve PDF Objects so that there is no overlap
      \newcount\objcount
    
      % the host size (+3 for spare object slots) - 1
      % putting a higher margin will just work, and XREF can have huge gaps
      \objcount=25
      \loop
        \message{\the\objcount}
        \advance \objcount -1
    
      \immediate\pdfobj{<<>>} % just an empty object
    
      \ifnum \objcount>0
      \repeat
    
    \endgroup
    

    لا تنسَ تطبيع مخرجات PDFLaTeX - باستخدام mutool على سبيل المثال - إذا لزم الأمر: من الصعب الحصول على بنيات قابلة لإعادة الإنتاج عبر التوزيعات - بل قد ترغب في ربط وقت التنفيذ للحصول على نفس التجزئة بالضبط إذا لزم الأمر.

    JPG في PDF

    قد تتوقع أن يكون JPG مجرد صور، لكن في ملف PDF وبعض قارئات PDF (غير المستعرضات، مثل Evince و Adobe Reader)، يمكن استخدامه كمحتوى صفحة تمامًا مثل أي كائن مضمّن آخر، أي أنه مضمّن في صورة JPEG.

    لتخزين بيانات JPEG بدون فقدان، قم بتخزينها كتدرج رمادي 100%، ثم استخدم إما صورة من صف/عمود واحد، أو كرر خط البيانات 8 مرات (نظرًا لأن كتل JPEG هي 8×8)، وسيتم تخزين بياناتك بدون فقدان وستتم الإشارة إليها من صفحات PDF.

    أمثلة على تصادم SHA-1 لملفي PDF عبر بيانات صفحة JPEG (صورة بتدرج رمادي تعرض ألوانًا) كمحتوى صفحة متجه:

    If ⟷ Shattered - the movie

    ملفّا PDF متصادمان عبر SHA-1 مع بيانات الصورة المخزنة بصيغة JPG

    من الممكن الإشارة إلى JPG المتصادم مرتين: كمحتوى صفحة، بدون فقدان، والذي يشير أيضًا إلى نفسه كصورة مفقودة للعرض. مرة أخرى، الصورة المراد عرضها بتدرج رمادي، لكن محتوى الصفحة يمكنه عرض بعض الألوان عبر عوامل تشغيل PDF.

    يُظهر الجزء العلوي من الصورة محتوى الصفحة مكررًا 8 مرات.

    أمثلة على تصادم SHA-1 لملفي PDF عبر JPEG المستخدم كبيانات صفحة وصورة للعرض:

    Skulls & Crossbones ⟷ Golden Axe

    ملفّا PDF متصادمان عبر SHA-1 مع JPG المستخدم كصورة ومحتوى صفحة

    ZIP

    TL;DR لا يوجد تصادم عام قابل لإعادة الاستخدام لملفات ZIP، لكن يوجد للتنسيقات القائمة على ZIP. يجب أن يكون من الممكن تصادم ملفين خلال 2h.core (أسرع بـ36 مرة من chosen-prefix)

    أرشيفات ZIP عبارة عن شطيرة من 3 طبقات (على الأقل). أولاً يأتي محتوى الملفات (تسلسل من هياكل Local File Header، واحد لكل ملف أو دليل مؤرشف)، ثم بعض الفهرس (مرة أخرى، تسلسل من Central Directory)، ثم بنية واحدة تشير إلى هذا الفهرس (End Of Central Directory).

    لا يمكن تغيير ترتيب هذه الطبقات. بعض المحللين يحتاجون فقط إلى بنية محتوى الملف، لكن هذه ليست طريقة صحيحة للتحليل ويمكن إساءة استخدامها.

    بسبب هذا الترتيب المطلوب، لا يوجد بادئة عامة يمكن أن تساعد في أي تصادم.

    نهج غير عام

    قد يكون النهج الآخر مجرد دمج الأرشيفين، مع طبقاتهما المدمجة، واستخدام UniColl - ولكن مع N=2، مما يُحدث فرقًا في البايت الرابع - لإبطال التوقيع السحري لـ End of Central Directory.

    هذا يعني أنه يمكن للمرء تصادم ملفي ZIP عشوائيين باستخدام UniColl واحدة و24 بايتًا من البادئة المحددة.

    نموذج End of Central Directory، وهو 22 بايتًا إذا كان التعليق فارغًا:``` 00: 504b 0506 0000 0000 0000 0000 0000 0000 PK.............. 10: 0000 0000 0000 ......

    root@kitploit:~
    إذا استخدمنا هذه البادئة (مع حشو البادئة إلى 16 بت) لـ UniColl و `N=2`، فسيكون الاختلاف في البايت الرابع، مما يبطل السحر `.P .K 05 06` بتغييره بشكل متوقع إلى `.P .K 05 86````
    00: 504b 0506 0000 0000 0000 0000 0000 0000  PK..............
    10: 0000 0000 0000 2121 eb66 cf9d db01 83bb  ......!!.f......
    20: 2888 4c41 e345 7d07 1634 5d4a 3b61 89a0  (.LA.E}..4]J;a..
    30: 0029 94af 4168 2517 0bbc b841 cbf2 9587  .)..Ah%....A....
    40: e438 0043 6390 279d 7c9e a01e e476 4c36  .8.Cc.'.|....vL6
    50: 527f b1f4 653e d866 f98d 7278 5324 0bd5  R...e>.f..rxS$..
    60: b31d ef6d d5d6 1163 5a2e a8a5 21bf eab4  ...m...cZ...!...
    70: c59c 028e a913 f6b7 0036 c93f 5092 a628  .........6.?P..(
    

    (no content provided)``` 00: 504b 0586 0000 0000 0000 0000 0000 0000 PK.............. 10: 0000 0000 0000 2121 eb66 cf1d db01 83bb ......!!.f...... 20: 2888 4c41 e345 7d07 1634 5d4a 3b61 89a0 (.LA.E}..4]J;a.. 30: 0029 94af 4168 251f 0bbc b841 cbf2 9587 .)..Ah%....A.... 40: e438 00c3 6390 279d 7c9e a01e e476 4c36 .8..c.'.|....vL6 50: 527f b1f4 653e d866 f98d 72f8 5324 0bd5 R...e>.f..r.S$.. 60: b31d ef6d d5d6 1163 5a2e a8a5 21bf eab4 ...m...cZ...!... 70: c59c 028e a913 f6af 0036 c93f 5092 a628 .........6.?P..(

    root@kitploit:~
    هذا ليس عامًا على الإطلاق، ولكنه أسرع بكثير من تصادم البادئة المختارة:```
    real 12m23.993s
    user 112m24.072s
    sys 2m0.194s
    

    المشكلة هي أن بعض المحللات لا تزال تحلل ملفات ZIP رأسًا على عقب حتى لو كان ينبغي تحليلها من الأسفل إلى الأعلى: طريقة للتأكد من تحليل الملفين بشكل صحيح هي ربط كتلتين من UniColl معًا، لتمكين/تعطيل كل End of Central Directory.

    لمنع محللات ZIP من الاعتراض على المساحة غير المستخدمة، يمكن إساءة استخدام Extra Fields، وتعليقات الملفات في Central Directory وتعليقات الأرشيف في End of Central Directory.

    diagram of ZIP collision

    مثال: إليك مصدر التجميع الذي يصف بنية ZIP مزدوج، يمكنه استضافة ملفي أرشيف مختلفين.

    بعد عمليتي UniColl، ينتج الملفان المتصادمان: collision1.zip ⟷ collision2.zip

    التنسيقات المعتمدة على Zip

    حتى لو كان تنسيق Zip نفسه لا يمكن استغلاله بشكل عام مثل Gzip، فإن بعض التنسيقات التي تعتمد على Zip يمكن استغلالها بشكل عام داخل أرشيفات Zip بهيكل محدد مسبقًا. يجب اتخاذ بعض الاحتياطات لجعل تصادم Zip عامًا.

    بعض التنسيقات هي ملفات متعددة مخزنة في أرشيف Zip، وتعتمد على ملف جذر باسم ملف ثابت يشير إلى ملفات أخرى في الأرشيف. يستخدم الكثير منها XML أو نصًا للملف الجذر، ويخزن الملفات الأخرى كما هي.

    الفكرة : اجعل مجموعتي ملفات تتعايشان في الأرشيف نفسه، وأشر إلى أيٍّ من المجموعتين. يمكن تخزين ملف جذر عام في بداية الملف، لكن كتل التصادم تُخزَّن خارج محتوى الملف، في الأرشيف (نظرًا لأن التصادمات لها إنتروبيا عالية جدًا، فمن المستحيل استغلال XML أو الملفات التي تحتوي على ASCII فقط مع التصادمات).

    الخطوات:

    1. ضع مجموعتي ملفات من أصلين في الأرشيف نفسه - أي في مجلدات فرعية مختلفة.

    2. عدّل الملف الجذر ليشير بالتناوب إلى كل مجموعة.

    3. بما أن الطابع الزمني والطول وCRC للملف الجذر مخزنة في كلٍّ من Local File Header - قبل محتويات الملف - وفي Central Directory - بعد محتويات الملف - يجب ألا تتغير هذه القيم بين نسختي الملف.

      • إذا تغير الطول، فستتغير جميع المؤشرات اللاحقة، لذا لن يكون من الممكن الحصول على لاحقة متطابقة.
      • إذا كانت CRC32 غير صحيحة في Central Directory، فقد يتجاهل المحلل هذه النسخة من القيمة، لكن تزوير CRC32 إلى قيمة ثابتة مفيد لتجنب المشكلة تمامًا. من المرجح أن تزوير CRC بإلحاق 4 بايتات عشوائية لن يكون كافيًا، لأن هذه الملفات الجذرية عادةً ما تكون بصيغة XML أو نصية ذات بناء جملة صارم، لذا ستصبح غير صالحة. CrcHack يساعد كثيرًا في تزوير CRC ببتات عشوائية دون استخدام القوة الغاشمة، مما يضمن أن يكون ملف الإخراج ASCII وأن البتات المعدّلة لا تزال داخل تعليق.
    4. استخدام extra field لملف إضافي وهمي - حتى لو كان فارغًا - في الأرشيف بعد الملف الجذر هو طريقة أنيقة لتخزين كتل تصادم Hashclash: بهذه الطريقة، يحافظ أرشيف Zip على بنية قياسية ويمكن التعامل معه بسهولة لاحقًا، حتى باستخدام الأدوات القياسية.

    Extra Fields لا تحتوي على CRC32، وطولها البالغ 16 بت معلن في الترويسات سابقًا. لها تنسيقها الداخلي ID:2 Size:2 Data لكنه عادةً ما يُتجاهل، وهي موجودة في كلٍّ من Local File Header وCentral Directory، ولكن يمكن أن تكون غائبة من Central Directory للحفاظ على اللاحقة متطابقة بعد كتل التصادم.

    قد يلزم التصريح عن وجود الملف الإضافي الذي يغطي كتل التصادم في extra field الخاص به في بنية التنسيق، مثل ملف [Content_Types].xml في مستند OOXML. قد يلزم تعديل ملفات XML أخرى في اللاحقة، لأن بعض التنسيقات تتطلّب استخدام مسارات مطلقة.

    فيما يلي البنية العامة للاستغلال العام لتنسيق معيّن قائم على Zip:``` [Root file] (with constant CRC32)

    [Dummy file] (with collision blocks in the extra field)

    [...] <- rest of the archive, with 2 documents merged

    root@kitploit:~
    لذلك، من خلال التحديد المسبق لمحتويات ملف الجذر وتزوير قيم CRC32 بنظام ASCII، يمكن حساب تصادم Hashclash عام قابل لإعادة الاستخدام لتنسيق محدد قائم على zip.
    
    ### ملخص المتطلبات
    
    - بادئتان أو أكثر
    - نوع ملف واحد أو أكثر (تعمل الملفات متعددة الصيغ polyglots دون مشاكل)
    - ملف جذر XML باسم ملف وطول ملف وCRC ثابتة: هذه المعلومات موجودة مرتين، قبل كتل التصادم وبعدها
     - المحتويات عبارة عن XML عشوائية
     - الحشو ممكن، حتى عبر تعليق XML، للوصول إلى الطول نفسه.
     - يمكن تعيين CRC (عبر CrcHack) على كل محتوى.
    - مجموعتا الملفات تتواجدان معًا في اللاحقة، غالبًا في مجلدات مختلفة. بعض الأدوات تثبّت المسار ترميزًا ثابتًا، مما قد يقلل التوافق.
    - قد يلزم دمج ملف XML من نوع *المحتوى* لتغطية جميع الملفات، المدعومة وغير المدعومة (كتل التصادم، والمستند البديل)
    
    ### أمثلة
    
    #### CRC32
    
    تعليق XML بسيط (بأحرف ASCII فقط) مع CRC32 مزوّرة (حساب فوري) باستخدام CrcHack.``` bash
    echo "<!--ABCDEF-->" | crchack -b 4.0:+.8*6:1 -b 4.1:+.8*6:1 -b 4.2:+.8*6:1 -b 4.3:+.8*6:1 -b 4.4:+.8*6:1 -b 4.5:+.8*5:1 - 0xdeadf00d
    <!--X{]EZF-->
    

    مثال آخر حيث تقوم بضبط CRC في حالة رسالة أبجدية.```bash echo "" | crchack.exe -b 4:+.8*32:.8 - 0xcafebabe

    root@kitploit:~
    #### التصادمات
    
    [zInsider](https://github.com/decalage2/collisions/blob/master/scripts/zinsider.py) هو سكربت لتوليد تصادمات MD5 فورياً لأزواج من المستندات العشوائية باستخدام تنسيقات ZIP+XML التالية:
    - Office Open XML: docx / pptx / xlsx
    - Open Container Format: epub
    - Open Packaging Conventions:
      - تنسيق التصنيع ثلاثي الأبعاد: 3mf
      - XML Paper Specification: xps / oxps
    
    لتوليد بادئات التصادم الخاصة بك، [إليك سكربت](https://github.com/decalage2/collisions/blob/master/scripts/makezip.py) لتوليد زوج جذر من zip.
    بعد حساب التصادمات، استخدم [هذا السكربت الآخر](https://github.com/decalage2/collisions/blob/master/scripts/extendzip.py) لدمج زوج الجذور هذا مع لاحقة مشتركة.
    
    بعض نماذج إثبات المفهوم للتصادم:
    - Office Open XML: Excel ([1](https://github.com/decalage2/collisions/blob/master/examples/free/md5-1.xls) - [2](https://github.com/decalage2/collisions/blob/master/examples/free/md5-2.xls)), Powerpoint ([1](https://github.com/decalage2/collisions/blob/master/examples/free/md5-1.pptx) - [2](https://github.com/decalage2/collisions/blob/master/examples/free/md5-2.pptx)), Word ([1](https://github.com/decalage2/collisions/blob/master/examples/free/md5-1.docx) - [2](https://github.com/decalage2/collisions/blob/master/examples/free/md5-2.docx)).
    - Open Container Format: Epub ([1](https://github.com/decalage2/collisions/blob/master/examples/collision-1.epub) - [2](https://github.com/decalage2/collisions/blob/master/examples/collision-2.epub)).
    - Open Packaging Conventions: 3MF ([1](https://github.com/decalage2/collisions/blob/master/examples/collision-1.3mf) - [2](https://github.com/decalage2/collisions/blob/master/examples/collision-2.3mf)), XPS ([1](https://github.com/decalage2/collisions/blob/master/examples/collision-1.xps) - [2](https://github.com/decalage2/collisions/blob/master/examples/collision-2.xps)).
    
    
    بعض التنسيقات متعددة الملفات المبنية على Zip لا يمكن استغلالها بشكل عام:
    - Quake PK3: ملف zip من ملفات دون جذر محدد.
    - Open Document Format: يجب أن يذكر ملف `META-INF/manifest.xml` كل ملف آخر، لذلك لا يمكن أن يكون عاماً.
    - APK وJAR وXPI: يجب أن يذكر ملف `META-INF/MANIFEST.mf` أيضاً كل ملف آخر مع تجزئاته.
    
    
    شكراً لـ [Philippe Lagadec](https://twitter.com/decalage2) على مساعدته في تنسيقات ملفات Office!
    
    
    ## استراتيجيات غير شائعة
    
    التصادمات عادة ما تتعلق بملفين صالحين من النوع نفسه.
    
    
    ### MultiColls: سلسلة تصادمات متعددة
    
    لا شيء يمنع ربط عدة كتل تصادم،
    والحصول على أكثر من محتويين بقيمة تجزئة واحدة.
    مثال على ذلك *hashquines* - التي تعرض قيمة MD5 الخاصة بها.
    يحتوي ملف [PoCGTFO 14](https://github.com/angea/pocorgtfo#0x14) على 609 تصادم FastColl،
    لفعل ذلك عبر نوعي ملفات في الملف نفسه.
    
    
    ### الصلاحية
    
    استراتيجية مختلفة تتمثل في قتل نوع الملف لتجاوز الفحص كملف تالف.
    يكفي فقط استبدال التوقيع السحري.
    إلحاق كلا الملفين (كصالح أو غير صالح) بتنسيق
    لا يحتاج إلى أن يكون عند الإزاحة 0 (أرشيف، مثل ZIP/RAR/...) سيكشف عن نوع ملف آخر.
    
    هذا يتيح تصادمات متعددة التنسيقات دون استخدام تصادم بادئة مختارة:
    1. استخدم UniColl لتفعيل أو تعطيل توقيع سحري، مثلاً PNG:
    2. ألحق أرشيف ZIP
    
    بينما يكون كلا الملفين تقنياً ZIP صالحاً، فإن معظم المحللات تعيد أول نوع ملف تجده وتبدأ الفحص من الإزاحة 0، لذا سترى نوع ملف مختلفاً.
    
    أمثلة:
    
     ⟷ [غير صالحة](https://github.com/decalage2/collisions/blob/master/examples/png-invalid.png)
    
    
    
    ### PolyColls: تصادمات لأنواع ملفات مختلفة
    
    من الممكن أيضاً أن يكون طرفا التصادم من نوعين مختلفين لتقليل الشكوك:
    
    سيناريو الهجوم:
    1. أرسل `holiday.jpg`
    2. اجعله في القائمة البيضاء
    3. أرسل `evil.exe` الذي يملك نفس MD5.
    
    في هذه الحالات، يلزم تصادم بادئة مختارة
    إذا كان كلا تنسيقي الملفات بحاجة إلى البدء عند الإزاحة 0.
    
    بعض الأمثلة على تخطيطات polycoll:
    
    ![تصادم متعدد التنسيقات pdf-jpg](https://assets.kitploit.com/production/public/readmes/47472/3dcd55e877a4ce9c933bf1478d0a71ede85e129b9e746414d754ffabceabe463.png)
    
    *تصادم متعدد PDF/JPG*
    
    
    ![تصادم متعدد التنسيقات pe-png](https://assets.kitploit.com/production/public/readmes/47472/63df55a15e7ca33153f352f13ba273604df6b1ae3e1e8838b601fea39de801e0.png)
    
    *تصادم متعدد PE/PNG*
    
    
    #### PE - JPG
    
    نظراً لأن ترويسة PE عادة ما تكون أصغر من 0x500 بايت، فهي مناسبة تماماً لتعليق JPG:
    1. ابدأ بترويسات DOS/JPG
    2. يقفز تعليق JPEG فوق ترويسة PE
    3. ضع صورة JPG كاملة
    4. ضع مواصفات PE كاملة
    
    ومرة أخرى، التصادم [فوري](https://github.com/decalage2/collisions/blob/master/scripts/jpgpe.py)
    
    أمثلة: [fastcoll.exe](https://github.com/decalage2/collisions/blob/master/examples/jpg-pe.exe) ⟷ [Marc.jpg](https://github.com/decalage2/collisions/blob/master/examples/jpg-pe.jpg)
    
    
    #### PDF - PE
    
    دمج PDF مع ملف وهمي باستخدام `mutool` هو طريقة عامة جيدة لإعادة ترتيب الكائنات
    ثم جعل أول كائنين قابلين للتجاهل (صفحة ومحتوى وهميان)،
    وهو مناسب تماماً لاستضافة كائن `stream` بطول غير معروف كـ `1 0`،
    ويُشار إلى طوله لاحقاً (بعد كتل التصادم) في الكائن الثاني.
    
    المشكلة الوحيدة هي أن `mutool` سيدرج الطول دائماً - ويزيل مرجع الطول،
    لذا يجب إعادة إدراجه في PDF بدلاً من القيمة،
    لكن معظم المراجع `2 0 R` ستكون أصغر من الأطوال المثبتة برمجياً.
    لحسن الحظ، يمكن إصلاح ذلك دون تغيير أي إزاحة كائن،
    لذا لا حاجة لتعديل XREF.
    
    إليك [سكربت](https://github.com/decalage2/collisions/blob/master/scripts/pdfpe.py) لتصادم فوري، على سبيل المثال، بين عارض PDF ([Sumatra](https://www.sumatrapdfreader.org/free-pdf-reader.html) خفيف ومستقل) ومستند PDF:
    
    أمثلة: [Poster.pdf](https://github.com/decalage2/collisions/blob/master/examples/pepdf.pdf) ⟷ [Sumatra.exe](https://github.com/decalage2/collisions/blob/master/examples/pepdf.exe)
    
    ![عارض PDF يعرض PDF (يعرض هو نفسه PDF) بنفس MD5](https://assets.kitploit.com/production/public/readmes/47472/4356d710fc4b60297ee05999be64f596198e9d4a02c826666818eb8ae117310f.png)
    
    *عارض PDF يعرض PDF (يعرض هو نفسه PDF) بنفس MD5*
    
    
    #### PDF - PNG
    
    وبالمثل، يمكن التصادم مثلاً بين ملفات PDF وPNG عشوائية دون قيود على أي من الطرفين. هذا فوري وقابل لإعادة الاستخدام وعام.
    
    أمثلة: [Hello.pdf](https://github.com/decalage2/collisions/blob/master/examples/png-pdf.pdf) ⟷ [1x1.png](https://github.com/decalage2/collisions/blob/master/examples/png-pdf.png)
    
    
    ### PileUps (تصادم متعدد)
    
    
    التصادمات التشفيرية ليست مقتصرة على ملفين!
    
    كما تم إثباته في تجربة [Nostradamus](https://www.win.tue.nl/hashclash/Nostradamus/) عام 2008،
    فإن ربط التصادمات يجعل من الممكن التصادم مع أكثر من ملفين.
    
    يمكن أن تكون التصادمات الأولى متطابقة أو ببادئة مختارة، بينما يجب أن تكون التالية ببادئة مختارة.
    
    يمكنك تسميتها تصادمات متعددة، لكنني أفضل *pileups* - إنها أقصر :)
    
    
    #### PE - PNG - MP4 - PDF
    
    بدمج كل المعارف المكتسبة سابقاً،
    استخدمت 3 تصادمات ببادئة مختارة لصياغة 4 بادئات مختلفة لأنواع ملفات مختلفة:
    مستند (PDF)، فيديو (MP4)، قابل للتنفيذ (PE) وصورة (PNG).
    
    ![مخطط لتراص PE/PNG/MP4/PDF](https://assets.kitploit.com/production/public/readmes/47472/f7c45f284bad51f431a2993cf4797f679c85671c028cf1862f1c07604740360a.png)
    
    *مخطط لتراص PE/PNG/MP4/PDF*
    
    هذا السكربت عام وفوري:
    
    ![مخطط لتراص PE/PNG/MP4/PDF](https://assets.kitploit.com/production/public/readmes/47472/3ec7caeb459eab294c6b9876a8a82e136502c3d11c599804fd7925fc2d819276.png)
    
    أمثلة: [commodore.pdf](https://github.com/decalage2/collisions/blob/master/examples/pileup.pdf) ⟷ [diagram.png](https://github.com/decalage2/collisions/blob/master/examples/pileup.png) ⟷ [kidmo.mp4](https://github.com/decalage2/collisions/blob/master/examples/pileup.mp4) ⟷ [sumatra18.exe](https://github.com/decalage2/collisions/blob/master/examples/pileup.exe)
    
    
    نظراً لأنك قد توزع ملفاً واحداً فقط
    ومن المستحيل تخمين قيم البادئات الأخرى منه،
    فإن الحل هو تضمين جميع بادئات التصادم في كود JavaScript
    وإدراجها في نماذج إثبات المفهوم الخاصة بك،
    محولاً ملفاتك إلى [ملفات HTML متعددة التنسيقات](https://github.com/decalage2/collisions/blob/master/examples/polyglot.html) لمشاركة الملفات المتصادمة المرتبطة بسهولة.
    
    
    
    يُعد [العدد 19](https://github.com/angea/pocorgtfo#0x19) من 'PoC or GTFO' تراصاً **و** متعدد التنسيقات في نفس الوقت،
    يجمع مستنداً من 80 صفحة مولّداً بـ PDFLaTeX، وعارض PDF لنظام Windows،
    ومخطط PNG وفيديو MP4 قصير "تصادمي" من [KidMoGraph](https://www.kidmograph.com/)
    مع حمولة HTML لتوليد الملفات الأخرى من إصدار PDF
    (وأرشيف ZIP أيضاً):
    
    
    
    شكراً لـ Rafał Hirsz على مساعدته الدائمة في JavaScript.
    
    
    ## حالات الاستخدام
    
    من الأفضل التخلي عن MD5 نهائياً، لأن فحص الملفات الداخلي يستغرق وقتاً طويلاً ومحفوف بالمخاطر!
    
    
    ### يجب تصادمها جميعاً!
    
    استخدام آخر للتصادمات الفورية والقابلة لإعادة الاستخدام والعامة هو إخفاء أي ملف من نوع معين - لنقل PNG - خلف ملفات وهمية (أو نفس الملف في كل مرة) - وهذا في الواقع يتم فقط بدمجه مع نفس البادئة بعد إزالة التوقيع - يمكنك حتى فعل ذلك على مستوى المكتبة!
    
    من منظور تحليل صارم،
    ستعرض جميع ملفاتك نفس المحتوى،
    وستُكشف الصور الخبيثة على أنها ملفات بنفس MD5 الذي تم جمعه سابقاً.
    
    لنأخذ ملفين:
    
     ⟷
    
    
    ونصادمهما مع نفس ملف PNG.
    
    يعرضان الآن نفس الصورة الوهمية، وهما متطابقان تماماً حتى الصورة الثانية على مستوى الملف!
    
     ⟷
    
    
    حمولتهما الخبيثة مخفية خلف ملف بنفس MD5 على التوالي.
    
    
    ### ملفات مُدينة
    
    حالة استخدام أخرى للتصادمات هي إخفاء شيء مُدين داخل شيء بريء،
    لكن مرغوب: إذا كان الشيء الوحيد لجمع الأدلة هو مقارنة تجزئات ضعيفة،
    فلا يمكنك إنكار أنك لا تملك الملف الآخر (الذي يعرض محتوى مُديناً لكنه يخفي محتوى بريئاً).
    
    تركز البرامج عادة على التحليل (السريع)، وليس على تحليل الملفات المفصل.
    
    
    
    *صورة تعرض معاينات مختلفة تحت علامات تبويب مختلفة من EnCase Forensic*
    
    
    ## الإخفاقات
    
    ليست كل التنسيقات يمكن أن تملك بادئات عامة قابلة لإعادة الاستخدام:
    إذا تعذر إدراج نوع ما من حاملات البيانات بين التوقيع السحري
    وترويسات المعيار الحاسمة والمحددة لكل ملف،
    فلن تكون التصادمات العامة ممكنة.
    
    بالطبع، يمكن للمرء تحويل الملفات القديمة إلى ملف جديد،
    وحتى استخدام كود للتفرع إلى حمولتين مختلفتين،
    لكنه أقرب إلى نقل الحمولات منه إلى تصادم بنية الملفات.
    
    
    ### ELF
    
    
    
    ترويسة ELF مطلوبة عند الإزاحة 0 وتحتوي على معلومات حاسمة مثل 32b/64b،
    وترتيب البايتات وABI منذ البداية،
    لذا من المستحيل وجود بادئة شاملة ثم كتل تصادم
    قبل معاملات حاسمة محددة للملف الأصلي.
    
    
    ### Mach-O
    
    
    
    لا تبدأ ملفات Mach-O حتى بنفس التوقيع السحري لكل من 32b (`feedface`) و64b (`feedfacf`).
    بعد ذلك مباشرة، يوجد عدد وأحجام الأوامر (مثل تعريف القطاعات، symtab، الإصدار،...).
    
    كما هو الحال مع ELF، التصادمات القابلة لإعادة الاستخدام غير ممكنة.
    
    
    ### Java Class
    
    
    
    مباشرة بعد التوقيع السحري توجد الإصدارات (التي قد تكون مزعجة)،
    لكن عدد تجمع الثوابت محدد تماماً لكل ملف،
    لذا لا توجد تصادمات شاملة لجميع الملفات.
    
    ومع ذلك، لا تزال العديد من الملفات تشترك في إصدار واحد ويمكننا حشو أقصر تجمع ثوابت ليصل إلى العد الأطول.
    أولاً، أدخل *حرفية UTF8* لمحاذاة المعلومات،
    ثم أعلن عن أخرى بطول يتم استغلاله بواسطة UniColl (يُخزن الطول في 16 بايت بصيغة big endian).
    
    لكن هذا سيتطلب معالجة الكود لأن جميع فهارس التجمع ستُزاح.
    
    التصادمات الفورية القابلة لإعادة الاستخدام لـ MD5 لملفات Java Class يجب أن تكون ممكنة، لكنها تتطلب تحليل الكود وتعديله.
    
    
    ### TAR
    
    **الخلاصة:** لا يوجد تصادم قابل لإعادة الاستخدام لملفات TAR، ولا استراتيجية أخرى سوى البادئة المختارة.
    
    
    
    أرشيفات الشريط هي سلسلة من ترويسات ومحتويات ملفات مدمجة، جميعها بمحاذاة 512 بايت.
    
    لا توجد بنية مركزية للملف بأكمله. لذا لا توجد ترويسة عامة أو تعليق من أي نوع لاستغلاله.
    
    قد تكون الحيلة هي بدء ملف وهمي بطول متغير، لكن الطول يكون دائماً عند نفس الإزاحة، وهو غير متوافق مع UniColl، مما يعني أن تصادمات البادئة المختارة فقط هي المفيدة هنا.
    
    
    ## ملخص الاستغلالات
    
    التنسيق      | عام؟ | FastColl | UniColl | Shattered | HashClash / Shambles
    --------      | -------- | :------: | :-----: | --------- | :-------:
    PDF           | Y        |          | x       |           | x
    JPG           | Y (1)    |          | x       | x (2)     | x
    GZ            | Y        |          | x       |           | x
    PNG           | Y/N (3)  |          | x       |           | x
    MP4           | Y (4)    |          | x       | x (5)     | x
    PE            | Y        |          |         |           | x
    القائمة على ZIP (6) | Y        |          |         |           | x
                  |          |          |         |           |
    GIF           | N        | x        |         |           | x
    ZIP           | N        |          | x (7)   |           | x
                  |          |          |         |           |
    ELF           | N        |          |         |           | x
    TAR           | N        |          |         |           | x
    Mach-O        | N        |          |         |           | x
    Class         | N        |          |         |           | x
    
    1. لدى JPG بعض القيود على البيانات التي يمكن تحسينها إلى حد ما عبر معالجة ترميز المسح.
    2. PDF مع JPG هو [التنفيذ الأولي](http://shattered.io) لهجوم Shattered، لكنه مجرد خدعة JPG خالصة داخل مستند PDF.
    3. PNG: يتطلب Safari/Preview أن تحتوي PNG على مقطع `IHDR` في الخانة الأولى، قبل أي كتلة تصادم. فعل ذلك يمنع بادئة عامة، وفي هذه الحالة يقتصر التصادم على أبعاد وفضاء ألوان وBPP وتشابك محددة.
    4. تنسيقات Atom/Box مثل MP4 قد تعمل بنفس البادئة لتنسيقات فرعية مختلفة. بعض التنسيقات الفرعية مثل JPEG2000 أو HEIF تتطلب تهيئة إضافية، لكن استراتيجية الاستغلال هي نفسها - فقط أن التصادم غير ممكن بين التنسيقات الفرعية، بل فقط مع زوج بادئات لتنسيق فرعي محدد.
    5. Atom/Box متوافق مع Shattered عند استخدام أطوال 64 بت.
    6. بعض التنسيقات القائمة على Zip يمكن استغلالها بشكل عام.
    7. لتوافق أفضل، يحتاج ZIP إلى تصادمي UniColl لأرشيف كامل، وهذه التصادمات تعتمد على محتويات كلا الملفين.
    
    ## ملفات الاختبار
    
    [هنا](https://github.com/decalage2/collisions/blob/master/examples/free/README.md) أزواج اختبار متصادمة مجانية (خالية من حقوق النشر وخالية من المعلومات الشخصية).
    
    
    # المراجع
    
    أوراق بحثية:
    
    - 2004
      - [MD5 ينبغي اعتباره ضاراً يوماً ما](https://eprint.iacr.org/2004/357.pdf) - Dan Kaminsky
      - [هجمات عملية على التوقيعات الرقمية باستخدام ملخص رسالة MD5](https://eprint.iacr.org/2004/356.pdf) - Ondredj Mikle 
    - 2005:
      - [ملاحظة حول القيمة العملية لتصادمات التجزئة المفردة لتنسيقات ملفات خاصة](https://github.com/decalage2/collisions/blob/master/papers/Illies_NIST_05.pdf) - Max Gebhardt, Georg Illies, Werner Schindler
    - 2014:
      - [تجزئة خبيثة: نسخة إيف من SHA-1](https://malicioussha1.github.io/) - Ange Albertini, Jean-Philippe Aumasson, Maria Eichlseder, Florian Mendel, Martin Schläffer
    - 2017:
      - [أول تصادم لـ SHA-1 الكامل](http://shattered.io) - Marc Stevens, Elie Bursztein, Pierre Karpman, Ange Albertini, Yarik Markov
      - [Postscript يعرض MD5 الخاص به](https://archive.org/stream/pocorgtfo14#page/n45/mode/1up) بواسطة Gregor "Greg" Kopf
      - [PDF يعرض MD5 الخاص به](https://archive.org/stream/pocorgtfo14#page/n49/mode/1up) بواسطة Mako
      - [هذا GIF يعرض MD5 الخاص به!](https://archive.org/stream/pocorgtfo14#page/n52/mode/1up) بواسطة Kristoffer "spq" Janke
      - [هذا PDF هو ROM لنظام NES يطبع تجزئة MD5 الخاصة به!](https://archive.org/stream/pocorgtfo14#page/n55/mode/1up) بواسطة Evan Sultanik, Evan Teran
    - 2018:
      - [تصادم PDF سهل مع SHA-1 باستخدام PDFLaTeX.](https://archive.org/stream/pocorgtfo18#page/n62/mode/1up) بواسطة Ange Albertini
    - 2020:
      - [SHA-1 في حالة فوضى](https://eprint.iacr.org/2020/014.pdf) بواسطة Gaëtan Leurent, Thomas Peyrin
    
    عروض تقديمية:
    - 2017 استغلال تصادمات التجزئة في Black Alps:
      - [الشرائح](https://speakerdeck.com/ange/exploiting-hash-collisions)
      
        [](https://speakerdeck.com/ange/exploiting-hash-collisions)
      
      - [الفيديو](https://www.youtube.com/watch?v=Y-oJWEYKVLA)
      
        [![فيديو استغلال تصادمات التجزئة على يوتيوب](https://assets.kitploit.com/production/public/readmes/47472/c995bb115228391b655125ee5806530149829d3a62b8754485071f5db9512e67.jpg)](https://www.youtube.com/watch?v=Y-oJWEYKVLA)
    
    - 2019 اقتل MD5 في Pass the Salt:
      - [الشرائح](https://speakerdeck.com/ange/kill-md5)
    
        [](https://speakerdeck.com/ange/kill-md5)
      - [الفيديو](https://passthesalt.ubicast.tv/videos/kill-md5-demystifying-hash-collisions/)
    
        [![فيديو اقتل MD5](https://assets.kitploit.com/production/public/readmes/47472/4d7d0e2935f37e9ae363ad7bebe2abb3697978e7b3c1aa57851c54727b7ac49f.jpg)](https://passthesalt.ubicast.tv/videos/kill-md5-demystifying-hash-collisions/)
    
    
    ورشة عمل (CollTris):
      - [الشرائح](https://speakerdeck.com/ange/colltris)
    
        [](https://speakerdeck.com/ange/colltris)
    
      - [الفيديو](https://www.youtube.com/watch?v=BcwrMnGVyBI)
    
        [](https://www.youtube.com/watch?v=BcwrMnGVyBI)
    
      - [المواد](https://github.com/decalage2/collisions/blob/master/workshop/README.md)
    
      - الجلسات
        - 2019/07/02 150p, Pass The Salt
        - 2019/07/24 199p, Google
        - 2019/08/19 208p, Google
        - 2019/10/23 222p, Hack.lu
        - 2019/11/07 225p, Black Alps
        - 2019/12/03 229p, Google
    
    
    مهام CTF:
    - [Prudentialv2](https://ctftime.org/task/3453)، من *Boston Key Party CTF 2017*.
    - [HREFIN](https://ctftime.org/task/6965)، من *Google CTF 2018*.
    - [Looking glass](https://ctftime.org/task/9271) من *Dragon Sector Teaser CTF 2019*.
    
    <!-- - [ليس ملخصي](https://ctftime.org/task/4784) من *Hack.lu CTF 2017*: غير متعلق بالتصادمات، لكنه حُلّ بواسطة Marc نفسه :p -->
    التحدي الشائع لمثل هذه المهام في CTF هو عدم إعطاء ميزة أو عائق كبيرين بناءً على حجم القوة الحاسوبية المتاحة لكل لاعب.
    
    
    # الاعتمادات
    
    كل هذا كان ممكناً بفضل [Marc Stevens](https://marc-stevens.nl/research/)،
    ليس فقط لإسهاماته التشفيرية، بل أيضاً لمساعدته واقتراحاته الدائمة!
    
    شكراً أيضاً لـ Philippe Teuwen على ملاحظاته الواسعة حول تنسيقات الملفات بشكل عام.
    
    
    # الخلاصة
    
    **اقتل MD5!**
    
    ما لم تتحقق بنشاط من التشوهات أو كتل التصادم في الملفات، فلا تستخدم MD5!
    
    إنه ليس تجزئة تشفيرية، بل دالة تافهة!
    
    تنزيل الأداة