
حقن الكود، حقن حمولة ضارة عبر جداول الصفحات pml4.
حقن الشيفرة، حقن حمولة ضارة عبر جداول الصفحات PML4.
هذا مجرد إثبات مفهوم لتقنية حقن جدول الصفحات لحقن شيفرة ضارة في عمليات المستخدم التعسفية.
في ويندوز (وبعض أنظمة التشغيل الحديثة)، كل عملية لديها PML4 الخاص بها والمعروف أيضًا باسم قاعدة جدول الدليل. وبالتالي لا يمكن للعملية A الوصول إلى العملية B بدون واجهات برمجة التطبيقات. ولكن ماذا لو استطعنا حقن إدخال PML4 تعسفي؟ بالطبع، سيشير إدخال PML4 إلى العنوان الفعلي المقابل للإدخالات، PDP, PD و PT تمامًا مثل العملية الداعمة.
لحقن إدخال PML4 ضار في العملية المستهدفة، نحتاج إلى صفحة مقيمة فعلية (ذاكرة فيزيائية) تدعم إدخال PML4 الضار. وبالتالي، يجب أن تكون الصفحة المقيمة مقيمة حرفيًا، وإلا سيتعطل النظام أو يصبح غير مستقر، لأنه أثناء ترجمة MMU إلى العنوان الفعلي، لا يوجد شيء تتوقعه MMU، وكذلك لا يوجد شيء يتوقعه مدير ذاكرة ويندوز.
لننظر إلى مخازن العملية الداعمة والعملية المستهدفة. في هذه الحالة، المخازن هي:
0x1A45F8100000x6EA45F810000قبل الانتقال إلى الخطوة التالية، قد يعتقد البعض منكم أن العنوان الثاني (0x6EA45F810000) يبدو غريبًا، مثل أننا عادة ما نخصص مخزنًا عبر malloc أو VirtualAlloc، يجب أن يبدو العنوان الظاهري مثل 0x17C7CAC0000 0x23BE9D80000 0x19FE76F0000 أو ما شابه ذلك. ذلك لأن إدخال PML4 الضار لا يشارك في مدير ذاكرة ويندوز، ولا يتم إدارته أيضًا. بالطبع، يمكن أن يكون أي عنوان ظاهري على عملية ويندوز 64 بت بأي قيمة ضمن نطاق ذاكرة المستخدم.
لذا إذا نظرنا إلى كلا العنوانين...
0: kd> .process ffff9803d8037080
Implicit process is now ffff9803`d8037080
0: kd> db 0x6EA45F810000 l2
00006ea4`5f810000 4d 5a MZ
0: kd> !vtop 7968b000 0x6EA45F810000
Amd64VtoP: Virt 00006ea45f810000, pagedir 000000007968b000
Amd64VtoP: PML4E 000000007968b6e8
Amd64VtoP: PDPE 000000005849b488
Amd64VtoP: PDE 0000000059e9c7e0
Amd64VtoP: PTE 000000003251d080
Amd64VtoP: Mapped phys 0000000014306000
Virtual address 6ea45f810000 translates to physical address 14306000.
0: kd> .process ffff9803d9f6b080
Implicit process is now ffff9803`d9f6b080
0: kd> db 0x1A45F810000 l2
000001a4`5f810000 4d 5a MZ
0: kd> !vtop 564f6000 0x1A45F810000
Amd64VtoP: Virt 000001a45f810000, pagedir 00000000564f6000
Amd64VtoP: PML4E 00000000564f6018
Amd64VtoP: PDPE 000000005849b488
Amd64VtoP: PDE 0000000059e9c7e0
Amd64VtoP: PTE 000000003251d080
Amd64VtoP: Mapped phys 0000000014306000
Virtual address 1a45f810000 translates to physical address 14306000.
كلا العنوانين يتوافقان مع نفس إدخالات جدول الصفحات تمامًا، PDP, PD و PT وعنوان فيزيائي. لذلك إذا قمنا بتعديل مخزن العملية الداعمة، سينعكس التغيير أيضًا على العملية المستهدفة. هذا مشابه جدًا للذاكرة المشتركة في ويندوز، لكن الفرق هو أن منطقة الذاكرة في العملية المستهدفة لن تظهر أبدًا في أي إدخالات VAD لعمليتها. من ناحية أخرى، إذا تم تحرير مخزن العملية الداعمة، فهذا يعني أيضًا على العملية المستهدفة ولكن دون تنظيف إدخالات جدول الصفحات للعملية المستهدفة، مما يعني أن مدير الذاكرة سيتسبب في خطأ MEMORY_MANAGEMENT، أو سيؤدي إلى خطأ ثلاثي أسوأ على وحدة المعالجة المركزية.
هذه التقنية تعاني من مشاكل استقرار كبيرة كما قلت، حيث أن إدخال PML4 الضار المحقون لا يشارك في مدير ذاكرة ويندوز ولا في النواة. ولا يوجد ضمان بأن العملية الداعمة ستبقى حية حتى يتم إنهاء العملية المستهدفة، أو أن العملية المستهدفة ليس لديها ما تفعله لتنظيف إدخال PML4 الضار عند إنهاء العملية الداعمة.
MIT حقوق الطبع والنشر Kento Oki <[email protected]>
قد تحتوي الشيفرات المصدرية على محتويات خارجية، وهذه المحتويات تعود لصاحب حقوق الطبع والنشر الخاص بها.