بسم الله الرحمن الرحيم الحمد لله رب العالمين والصلاة والسلام على أشرف المرسلين سيدنا محمد وعلى آله وصحبه ومن تبعهم بإحسان إلى يوم الدين.
اليوم راح نتكلم عن هجوم House of Spirit
حسابي في التويتر هنا
المتطلبات:
قرأة مقالتي السابقة بخصوص هجوم Fastbin Dup كي لاتجد صعوبة في فهم الشرح هنا
فهم Memory Management
معرفة أبسط الاشياء في الHeap ولديك معرفة في Stack Overflow
البداية
في المقالة السابقة تكلمت عن كيف نقدر نستغل الDouble Free ونغير الFD الخاص بchunk بعد ماصار لها free وراحت للFastbin وتكلمنا وش هو الFastbin وبعض الأساسيات.
ماهو هجوم House of Spirit ؟
هو هجوم يختلف قليلاً عن هجمات الHeap الأخرى بحيث انه يعتمد على ثغرة ثانية كي يكتمل مثال Stack Overflow ونعطي pointer الخاص با fake chunk حقتنا ألى ()free وتروح للbins ونطلب chunk بنفس الحجم الخاص با fake chunk عشان ترجع لنا ونسوي overwrite للData الي فيها.
هناك array في البرنامج يوضع فيها pointers للchunks عندما تخصيص chunk في الHeap يوضع pointer للchunk بحيث اذا أراد المستخدم التعامل معها مثال وضع بيانات فيها أو رؤية البيانات التي بداخلها او تحريرها فقط بأستخدام الpointer الخاص بالchunk.
في هذا الهجوم نحتاج ألى 3 أشياء
أن يكون لدينا العنوان الخاص با الHeap
أن يكون العنوان الأصلية الخاص با Libc Base
وأن يكون لدينا ثغرة أخرى كي نتحكم في global array pointers list
الهجوم
رابط البرنامج المستخدم في الشرح هنا
لدينا برنامج هنا فيه خيارين أول واحد نسوي allocate لchunk والثاني نسوي free لchunk ونلاحظ في البداية يعطينا عنوانين عنوان printf والعنوان الخاص با الHeap كي نستخدمها في هجومنا
أول خيار يطلب منك إدخال حجم الchunk التي تريد حجزها و البيانات التي تريد وضعها في الchunk و أسم الchunk دعونا نرا الarray التي يوضع فيها الpointers لكل chunk نخصصها
نشوف هنا الchunk name الي كتبناه موجود فوق ال chunk pointer
ومأشر على العنوان حق الchunk الي سوينا لها allocate ونشوف البيانات الي كتبناها خلونا نشوف الsource code
نشوف هنا مسوي struct فيها أثنين variables اول واحد مخصص للchunk name وحجمه 8 byte والثاني pointer للchunk خلونا نشوف ال source code حق الtwo functions الي هي alloc و free
نشوف أول شيء يطلب منك إدخال حجم للchunk التي تود حجزها ثم يطلب منك إدخال بيانات للchunk التي حجزناها ثم يطلب منا إدخال أسم للChunk ولو نلاحظ أن الثغرة الوحيدة الموجودة هنا هي في Chunk Name أن ()read تأخذ 0x10 bytes من المستخدم والتي هي 16 حرف والمتغير الي أسمه name حجمه 8 حرف وهنا يوجد overflow بحيث يمكننا نغير البيانات الموجودة في المتغير الذي أسمه ptr