GammaCyber

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

Format String Exploitation

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

T4 · מתקדם450 נק'~28 דק'algorithmic
סורק פגיעויות Format String
ממש find_fmt_bugs(lines) שמזהה פגיעויות format-string: קריאות ל-printf/fprintf/sprintf/snprintf/syslog שבהן ארגומנט ה-*format* אינו מחרוזת-ליטרל (מתחיל ב-") אלא משתנה נשלט-משתמש. מיקום ה-format: printf→ראשון, fprintf/sprintf/syslog→שני, snprintf→שלישי. החזר (מספר_שורה, שם_פונקציה) לכל פגיעות.
דוגמאות
find_fmt_bugs(['printf(user_input);']) → [(1, 'printf')]
find_fmt_bugs(['printf("%s", user_input);']) → [] # ליטרל = בטוח
פתרון-ייחוס סורק פגיעויות Format String ›
import re def find_fmt_bugs(lines: list) -> list: pos = {'printf':0, 'fprintf':1, 'sprintf':1, 'snprintf':2, 'syslog':1} def split_args(s): parts=[]; depth=0; cur='' for c in s: if c in '([{': depth+=1; cur+=c elif c in ')]}': depth-=1; cur+=c elif c==',' and depth==0: parts.append(cur); cur='' else: cur+=c if cur.strip(): parts.append(cur) return parts out=[] for i, ln in enumerate(lines, 1): m = re.search(r'\b(printf|fprintf|sprintf|snprintf|syslog)\s*\((.*)\)\s*;?', ln) if not m: continue fn=m.group(1); args=split_args(m.group(2)); p=pos[fn] if len(args)>p and not args[p].strip().startswith('"'): # format-arg לא ליטרל out.append((i, fn)) return out
הפתרון נשמר מקומית אוטומטית.
T3 · בינוני250 נק'~10 דק'analysis
סיווג הפגיעות
קוד מכיל את הקריאה `printf(user_input);` כאשר user_input נשלט על-ידי המשתמש. איזו פגיעות זו, שמאפשרת גם קריאה שרירותית (%x/%s) וגם כתיבה שרירותית (%n)? (a) Format String (b) Integer Overflow (c) Use-After-Free (d) SQL Injection
דוגמאות
(פורמט) → אות
פתרון-ייחוס סיווג הפגיעות ›
a — הזנת format נשלט-משתמש ל-printf היא פגיעות Format String; %x/%s לקריאה, %n לכתיבה. התיקון: printf("%s", user_input).
הפתרון נשמר מקומית אוטומטית.