بسم الله الرحمن الرحيم الحمد لله رب العالمين والصلاة والسلام على أشرف المرسلين سيدنا محمد وعلى آله وصحبه ومن تبعهم بإحسان إلى يوم الدين.

اليوم راح نتكلم عن هجوم House of Spirit

حسابي في التويتر هنا

المتطلبات:

  1. قرأة مقالتي السابقة بخصوص هجوم Fastbin Dup كي لاتجد صعوبة في فهم الشرح هنا

  2. فهم Memory Management

  3. معرفة أبسط الاشياء في ال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 أشياء

  1. أن يكون لدينا العنوان الخاص با الHeap

  2. أن يكون العنوان الأصلية الخاص با Libc Base 

  3. وأن يكون لدينا ثغرة أخرى كي نتحكم في 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

Join