الفرق الحمراء — الهجومخبير150mL23
استغلال ثغرات الذاكرة والملفات التنفيذية
ثغرات التدفق، الـ ROP، وتجاوز حمايات ASLR/DEP
#BoF#ROP#Heap#ASLR
استغلال الذاكرة — جذور الأمن السيبراني
تشبيه — شرح مبسط
الذاكرة في البرنامج مثل دفتر حسابات: الـ stack طاولة الموظف، الـ heap أرشيف عام. لو تجاوزتَ سطر الإدخال ستكتب على عمود «التوقيع» — البرنامج سيقفز إلى عنوان وضعتَه أنت بدلاً من العنوان الذي خطّط له المبرمج. هذا هو استغلال الذاكرة باختصار.
هام
هذا الدرس مركّز على الفهم و التدريب على بيئات CTF (pwn.college, HackTheBox, ROP Emporium). لا يحوي 0-days ضد منتجات إنتاجية. كتابة exploit ضد منتج تجاري دون تفويض = جريمة.
بنية البرنامج في الذاكرة
- .text — التعليمات (read+execute).
- .data / .bss — متغيرات عامة.
- Heap — تخصيص ديناميكي (
malloc, new) — ينمو لأعلى. - Stack — استدعاءات الدوال — ينمو لأسفل في معظم المعماريات.
- Libraries (libc, ld) — مكتبات مشتركة.
memory layout (x86_64 Linux)
0x7ffffffff000 ─┐
│ Stack (grows down)
│
▼
...
▲
│ Heap (grows up)
┴
.bss / .data
.text (program code)
0x000000400000Stack Buffer Overflow — الكلاسيكي
C — vulnerable
#include <stdio.h>
void win() { system("/bin/sh"); }
int main() {
char buf[64];
gets(buf); // bug — لا حدّ
return 0;
}الـ stack بعد دخول main:
stack frame
high addresses
+------------------+
| return address | <-- نريد تغييره
+------------------+
| saved RBP |
+------------------+
| buf[64] | <-- gets يكتب هنا
+------------------+
low addressesلو كتبنا 72 بايت + عنوان win، تنفّذ الـ shell.
exploit (pwntools)
from pwn import *
elf = ELF('./vuln')
p = process('./vuln')
payload = b"A"*72 + p64(elf.sym.win)
p.sendline(payload)
p.interactive()حماية: Stack Canary
المترجم يضع قيمة عشوائية قبل الـ saved RBP. لو غيّرها الـ overflow، البرنامج يقتل نفسه قبل الـ return. تجاوزها يحتاج تسريب الـ canary أولاً (format string, partial overwrite).
ASLR و DEP/NX
- ASLR — عشوائية عناوين الـ stack/heap/libs في كل تشغيل. تجاوزها يحتاج info leak.
- DEP/NX — الـ stack/heap غير قابلة للتنفيذ. لا يمكن وضع shellcode فيها مباشرة.
- PIE — حتى الـ .text يصبح عشوائياً.
- RELRO — يمنع overwrite الـ GOT.
- CFI — Control Flow Integrity (Clang, MSVC).
Return-Oriented Programming (ROP)
تشبيه — شرح مبسط
لو منعونا من تأليف جملة جديدة (NX)، نأخذ كلمات من كتاب موجود (libc) و نرتّبها بطريقة جديدة. كل «كلمة» = gadget ينتهي بـ
ret، نسلسلها على الـ stack.ROP chain — open/read/write a file (concept)
# اكتشف الـ gadgets
ROPgadget --binary ./libc.so.6 | grep "pop rdi"
# 0x000023b6a : pop rdi ; ret
# 0x0000241c1 : pop rsi ; pop r15 ; ret
# 0x0000114b0 : ret
# ابنِ chain بـ pwntools
rop = ROP(libc)
rop.call('open', ['/flag', 0])
rop.call('read', [3, libc.bss(), 0x100])
rop.call('write', [1, libc.bss(), 0x100])
payload = b"A"*72 + rop.chain()تنويعات
- ret2libc — استدعاء system("/bin/sh") مباشرة.
- ret2dlresolve — يحلّ symbols ديناميكياً بدون info leak.
- SROP (Sigreturn-Oriented) — استغلال signal frame.
- JOP (Jump-Oriented) — لا يستخدم
ret. - COP (Call-Oriented) — مع indirect calls.
Format String — قوة كاملة من حرف واحد
C — vuln
printf(user_input); // ← خطأ شائع جداً
// لو user_input = "%x %x %x %s"
// طُبعت قيم من الـ stack — تسريب canary, libc, retaddr- %x %s %p — تسريب.
- %n — كتابة (يكتب عدد الأحرف المطبوعة لعنوان من الـ args).
- أداة fmtstr_payload في pwntools تولّد الـ payload تلقائياً.
Heap Exploitation — أعمق طبقة
الـ heap allocator (ptmalloc/glibc) يدير قوائم free chunks. عبث الـ metadata يحوّل to arbitrary write.
تقنيات معروفة
- Use-After-Free (UAF) — استخدام pointer بعد
free. - Double Free —
free(p); free(p);. - Heap overflow — كتابة فوق chunk تالٍ.
- Tcache poisoning (glibc 2.27+) — تلويث singly-linked list.
- Fastbin attack, Unsorted Bin attack, House of * (Spirit, Force, Orange...).
- Safe-Linking bypass (glibc 2.32+).
UAF concept
Object* o = new Object(0x41);
delete o;
// p لا يزال يشير إلى نفس الذاكرة
Object* fake = new Object(0x42); // غالباً نفس chunk
o->method(); // ينفّذ على fake — type confusionللتعمّق: how2heap repo (shellphish) — كل تقنية مع PoC قابل للتشغيل.
kernel exploitation — مقدمة
الانتقال من user-space إلى kernel = root كامل. تقنيات شائعة:
- UAF / heap overflow في الـ kernel objects.
- Race conditions (DirtyCOW, DirtyPipe).
- Type confusion في الـ ioctl / netlink.
- تجاوز SMEP/SMAP/KASLR/KPTI.
- kROP داخل الـ kernel.
تدرّب على: kernelpop, kernel-exploitation labs على pwn.college.
Browser & Sandbox — أعقد سطح هجوم
- JIT compilers (V8, JSCore, SpiderMonkey) — ثغرات type confusion.
- Renderer compromise ثم sandbox escape عبر IPC.
- Pwn2Own chains: 3-5 ثغرات للوصول من tab إلى kernel.
- الدراسة: Project Zero blog، Phrack، Microsoft Security Response.
منهجية تطوير الـ exploit
01
Triage
شغّله، تابع crash، حدّد نوع الـ bug (read/write/exec primitive).
02
Primitive
حوّل الـ bug إلى read primitive و write primitive.
03
Bypass mitigations
ASLR → leak. NX → ROP. Canary → leak أو overwrite partial.
04
Hijack control flow
RIP → gadget → shell.
05
Reliability
اختبر تحت ظروف مختلفة (load, ASLR, kernel versions).
06
Weaponize
اجعله يعمل بدون تفاعل (1-click → 0-click).
الأدوات
toolkit
# debugging
gdb + pwndbg / gef / peda
windbg + retsync (Windows)
lldb (macOS/iOS)
# analysis
Ghidra, IDA Pro, Binary Ninja, radare2/cutter
angr (symbolic execution)
afl++, libFuzzer, honggfuzz (fuzzing)
# exploitation
pwntools (Python)
ROPgadget, ropper, OneGadget
checksec
patchelf (لتعديل binary للتجارب)الدفاع — ما يجعل الاستغلال أصعب
- اللغات الآمنة الذاكرة: Rust, Go, Swift — يمنعن معظم الفئات في الأصل.
- Compiler flags:
-fstack-protector-strong -D_FORTIFY_SOURCE=2 -Wl,-z,relro,-z,now -fPIE -pie. - ASLR كامل + Kernel ASLR + kernel KPTI.
- CFI (Clang's CFI, MS Control Flow Guard).
- Shadow stack (Intel CET).
- Sandboxing (seccomp-bpf, gVisor, Firejail).
- Memory tagging (ARM MTE).
- تنويع heap (Scudo, hardened_malloc).
- استبدل C/C++ ببدائل آمنة في كل ما يقبل user input.
إحصائية مهمة
Microsoft و Google: ~70% من ثغراتهم الأمنية كانت memory safety. التحوّل إلى Rust في الـ kernel و Android system layer قلّل الفئة كثيراً.
مسار التعلّم
- pwn.college — مجاني، شامل من الأساسيات حتى الـ kernel.
- ROP Emporium — تركيز على ROP.
- HackTheBox — قسم pwn.
- OpenSecurityTraining2 — كورسات عميقة.
- Phrack Magazine, Project Zero, Exploit-DB write-ups للقراءة الجادة.
- شهادة OSED (Offensive Security Exploit Developer) للتقدّم الاحترافي.