السلام عليكم ورحمة الله وبركاته اليوم راح أتكلم عن هجوم Ret2Syscall x86/x64

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


ماهو SysCall ؟

يكون وسيط بين User و Kernel عندما يريد User من Kernel تنفيذ شيء يستعمل Syscall كي يطلب منها -> هنا جدول Syscalls


ماهو Ret2Syscall ؟

هو أستخدام Syscall كي نستدعي أي Funcations نريدها مثال أن نستدعي execve


ماهي execve

هي function في لغة c تستخدم لأجل أغلاق البرنامج و تشغيل برنامج آخر لمزيد من المعلومات تجدها هنا

مثال على أستخدام execve

#include unistd.h int main() { char binary[] = "/bin/sh"; execve(binary,NULL,NULL); return 0; } //Note 0 == NULL //To Compile it use gcc //gcc execve.c -o execve

متطلبات الهجوم في معمارية x86

To use any funcation from syscalls table =========================================== EAX, arg0 (sys-call number loaded here) EBX, arg1 ECX, arg2 EDX, arg3 ESI, arg4 EDI, arg5 EBP, arg6 ===========================================

أن نضع 0xb في EAX لان الرقم حق execve

نستخدم pop eax ; ret

نستخرج الادرس حق (pop eax ; ret) عن طريق أداة ROPgadget

الامر (ROPgadget --binary ret2syscall-x86 | grep eax)

//التعليمات التي نحتاجها pop eax ; ret pop ecx ; ret pop ebx ; ret pop edx ; ret int 0x80 //is execute this code 'execve("/bin/sh",NULL,NULL)'

وقت التطبيق 

البرنامج المستخدم في الشرح تجدونه هنا 

في البداية بعد ماتحكمنا في EIP حان وقت بناء الاستغلال

اولاً نجد ألادرس الخاص بتعليمة “pop eax“

وجدناه

ألان نحاول الحصول على ألادرس الخاص بتعليمة “pop ecx“

وألان نجد الأدرس الخاص با “pop ebx“

الان نجد ألادرس الخاص بتعليمة “pop edx“

وألان أخر تعليمة نحتاجها هي “int 0x80” هي التي ستطلب من النواة تنفيذ “execve“

فقط بقي عندنا شيء صغير وهو ان نجد “bin/sh/” في البرنامج كي “execve“ تشغل لنا “bin/sh/”


وقت الاستغلال

هذا الكود الذي كتبته

لقد نجح الهجوم 


متطلبات الهجوم في معمارية x64

//نحتاج التعليمات التالية pop rdi ; ret pop rax ; ret pop rdx ; ret pop rbx ; ret pop rsi ; ret bin_sh

في معمارية x64 نجد في جدول syscall ان execve قيمتها 0x3b

أول خطوة أن نضع “bin/sh/“ في rdi

ثاني خطوة أن نضع 0x3b في rax

ثالث خطوة ان نضع قيمة 0 في rdx 

رابع خطة ان نضع قيمة 0 في rbx # ماهو مهم تقدر تستغل البرنامج بن ماتحط قيمة 0 في rbx

خامس خطولة نضع قيمة 0 في rsi 

آخر خطوة أن نستدعي syscall 

تحصلون على ألادرس الخاص بأي تعليمة عن طريق أداة ROPGadet

في نظام x64 الArgements توضع في Registers بدال Stack من 1 الى 6 توضع في Registers زي كذا

 RDI, RSI, RDX, RCX, R8, R9


وقت ألاستغلال

بنيت أستغلال صغير

لقد نجح ألاستغلال الذي بنيته


الختام

يمكننا أن نبني أستغلال من أي function نريد موجودة في syscall table لكن في مقالتي لقد أخترت ان أطبق على execve function

و في الختام إن أصبت فا من الله وإن اخطأت فمن نفسي والشيطان

References:

https://man7.org/linux/man-pages/man2/execve.2.html

https://x64.syscall.sh/

https://en.wikipedia.org/wiki/System_call