GammaCyber

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

ASLR, PIE ו-Canary Bypass

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

T3 · בינוני350 נק'~15 דק'analysis
קריאת הגנות מ-readelf
נתון פלט readelf של בינארי. האם הגנת NX (stack לא-ניתן-להרצה) מופעלת? ענה 'yes' או 'no'. readelf על הבינארי מראה: ELF Header -> Type: EXEC Program Header -> GNU_STACK flags: RWE
דוגמאות
GNU_STACK flags: RW → NX מופעל (yes)
פתרון-ייחוס קריאת הגנות מ-readelf ›
no — הדגל E (Execute) ב-GNU_STACK=RWE אומר שה-stack ניתן-להרצה, כלומר NX *כבוי*. (NX מופעל היה מציג RW בלבד.)
הפתרון נשמר מקומית אוטומטית.
T4 · מתקדם450 נק'~25 דק'build
הקשחת קוד פגיע (Hardening)
הפונקציה הבאה פגיעה ל-Stack Buffer Overflow כי scanf("%s") אינו חסום. כתוב גרסה *מוקשחת* שקולטת בבטחה לכל היותר 15 תווים ל-buffer בגודל 16, ומדפיסה 'Hi <name>'. קלט ארוך ייחתך בבטחה במקום לדרוס את ה-stack. הקוד הפגיע: void greet(){ char name[16]; scanf("%s", name); // ללא גבול -> Stack Buffer Overflow printf("Hi %s\n", name); }
דוגמאות
Alice → Hi Alice
AAAA...(100 תווים) → Hi AAAAAAAAAAAAAAA (15, בלי crash)
פתרון-ייחוס הקשחת קוד פגיע (Hardening) ›
#include <stdio.h> void greet(){ char name[16]; scanf("%15s", name); // חסום ל-15 תווים + NUL -> אין דריסה printf("Hi %s\n", name); } int main(){ greet(); return 0; }
הפתרון נשמר מקומית אוטומטית.