GammaCyber

כתיבת קוד — שיעור 40

Stack Buffer Overflow

כל 2 משימות הקוד שנשמרו מהשיעור מופיעות כאן, עם דרישות, דוגמאות וקוד פתיחה. אפשר לכתוב פתרון בעורך המקומי וללחוץ על „בדיקת AI” לקבלת ציון, רמזים והערות.

T4 · מתקדם500 נק'~25 דק'analysis
Offset לכתובת החזרה מ-Disassembly
בהינתן ה-disassembly של vuln() (char buf[80], קומפל ב--O0 -fno-stack-protector), חשב כמה בתים מתחילת buf יש עד כתובת החזרה (saved RIP). רמז: buf נטען מ-rbp במרחק המופיע ב-lea; אחריו 8 בתים של saved rbp ואז כתובת החזרה. הגש מספר עשרוני. ; vuln(): char buf[80]; read(0,buf,300); lea -0x50(%rbp),%rax ; כתובת buf ... call read@plt
דוגמאות
buf ב-rbp-0x50 → offset = 0x50 + 8
פתרון-ייחוס Offset לכתובת החזרה מ-Disassembly ›
buf ב-rbp-0x50 (80 בתים). עד saved rbp: 80. + 8 (saved rbp) = 88 עד saved RIP.
הפתרון נשמר מקומית אוטומטית.
T3 · בינוני300 נק'~12 דק'analysis
זיהוי מיטיגציה מ-Disassembly
ב-disassembly של פונקציה מוגנת מופיע `mov %fs:0x28,%rax` בכניסה, והשוואה לפני ה-ret שקופצת ל-__stack_chk_fail אם הערך השתנה. איזו מיטיגציה זו? ; פונקציה מוגנת (disassembly חלקי): mov %fs:0x28,%rax ; טעינת ה-canary לתוך המסגרת ... ; לפני ret: השוואת ה-canary; אם שונה -> __stack_chk_fail (a) NX (Non-Executable Stack) (b) Stack Canary (c) ASLR (d) PIE
דוגמאות
(פורמט) → אות, למשל b
פתרון-ייחוס זיהוי מיטיגציה מ-Disassembly ›
b — הערך מ-%fs:0x28 הוא ה-Stack Canary; דריסת ה-buffer משנה אותו ו-__stack_chk_fail עוצר את התוכנית לפני ה-ret.
הפתרון נשמר מקומית אוטומטית.