לדלג לתוכן

איך מתחילים אתגרי CTF בניצול בינארי - המדריך המעשי

למדתם קצת תיאוריה - גלישת חוצץ, אולי אפילו ROP - ועכשיו אתם רוצים לגעת באתגר CTF אמיתי בקטגוריית Pwn ולראות איך זה מרגיש בפועל. זה בדיוק הרגע הנכון. הנה בדיוק איך לגשת לזה, כדי שהחוויה הראשונה תהיה מספקת ולא מתסכלת.

מה בדיוק מקבלים באתגר Pwn

באתגר CTF טיפוסי בקטגוריית Pwn, מקבלים בדרך כלל קובץ בינארי (התוכנית שצריך לנצל), ולעיתים גם את קוד המקור שלה בשפת C, כדי להקל על ההבנה. בנוסף, מקבלים כתובת ופורט של שרת שמריץ את אותה תוכנית בדיוק, כי המטרה הסופית היא לנצל את החולשה מרחוק ולקבל shell על השרת, ומשם לקרוא את קובץ ה-"דגל" (flag) שמוכיח שהצלחתם.

הצעדים הראשונים - לפני שכותבים שורת קוד אחת

שלב 1 - הרצה בסיסית. קודם כל, פשוט הריצו את הבינארי אצלכם מקומית וראו איך הוא מתנהג. אילו קלטים הוא מבקש, מה הוא מדפיס, מה קורה אם אתם מזינים קלט "רגיל" לגמרי.

שלב 2 - checksec. הפעילו את הפקודה checksec (מגיעה עם pwntools) על הקובץ, כדי לראות אילו הגנות מופעלות - NX, PIE/ASLR, Stack Canary. זה קובע לגמרי את האסטרטגיה שלכם. אתגר בלי שום הגנה מאפשר ניצול "קלאסי" עם shellcode, בעוד אתגר עם כל ההגנות מופעלות דורש שילוב מתוחכם יותר, כמו דליפת מידע ו-ROP.

שלב 3 - הנדסה לאחור. אם אין לכם קוד מקור, פתחו את הבינארי ב-Ghidra כדי להבין את הפונקציות המרכזיות. גם אם יש לכם קוד מקור, שווה להסתכל על הבינארי בכל זאת, כדי להתרגל לקרוא את הייצוג הבינארי בפועל.

שלב 4 - איתור הבאג. חפשו קריאות לפונקציות מסוכנות כמו gets, strcpy, או printf עם קלט משתמש ישיר. חפשו חישובי גודל שעלולים לגלוש. שאלו את עצמכם - איפה כאן קלט משתמש נכנס לתוכנית בלי בדיקה מספקת?

מבנה ניצול טיפוסי

ברוב האתגרים הבסיסיים, הזרימה תיראה בערך כך:

  1. זיהוי החולשה. בדרך כלל גלישת חוצץ פשוטה על הסטאק, כי זה סוג האתגר הכי נפוץ למתחילים.
  2. מציאת ה-offset המדויק. כמה בייטים בדיוק צריך לכתוב לפני שמגיעים לכתובת ההחזרה. יש כלים ייעודיים לזה (כמו cyclic שמגיע עם pwntools) שעוזרים למצוא את המספר המדויק בלי ניחוש.
  3. בניית ה-payload. בהתאם להגנות שזוהו - shellcode פשוט אם אין NX, או שרשרת ROP אם NX מופעל.
  4. הרצה מול השרת. שליחת הניצול מול השרת המרוחק, וקבלת shell שממנו קוראים את קובץ הדגל.

הטעויות הכי נפוצות של מתחילים

  • לקפוץ ישר לניסוי וטעייה בלי להבין את הבאג. אתגר Pwn לא נפתר על ידי ניסיון אקראי של payloads. תבינו קודם למה יש חולשה, ורק אז תכתבו קוד.
  • להתעלם מ-checksec. ניסיון להריץ shellcode ישיר על תוכנית עם NX מופעל פשוט לא יעבוד, ולפני שבודקים את ההגנות, זה מבזבז שעות של תסכול מיותר.
  • לבחור אתגר קשה מדי בהתחלה. רוב פלטפורמות ה-CTF מדרגות אתגרים לפי רמת קושי. תתחילו מהקל ביותר בקטגוריית Pwn, גם אם זה מרגיש "פשוט מדי" - זה בונה ביטחון ומיומנות בסיסית.
  • לא לקרוא write-ups אחרי שפתרתם (או נכשלתם). גם אם פתרתם אתגר, שווה לקרוא איך אחרים פתרו אותו - כמעט תמיד יש טכניקה או קיצור דרך שלא חשבתם עליו.

איפה מוצאים אתגרים למתחילים

יש כמה פלטפורמות מוכרות שמרכזות אתגרי CTF ברמות קושי עולות, חלקן עם אתגרים סטטיים שזמינים כל הזמן ולא רק בזמן תחרות. הן מאפשרות לכם לתרגל בקצב שלכם, בלי לחץ של שעון תחרות, מה שמצוין בשלב הלמידה הראשוני.

איך להתקדם משם

אחרי כמה אתגרים ראשונים, תתחילו להרגיש דפוסים חוזרים - הרבה אתגרי Pwn בסיסיים דומים במבנה שלהם, גם אם הפרטים הקטנים משתנים. זו בדיוק הנקודה שבה כדאי להעמיק את הבסיס התיאורטי שלכם במקביל לתרגול, כדי שתוכלו לעבור לאתגרים מורכבים יותר עם heap ו-ROP מתקדם.

בקורס מחקר חולשות בניתי את החומר כך שכל נושא תיאורטי מלווה מיד בתרגול על אתגרים אמיתיים, כדי שהידע לא יישאר תיאורטי אלא יהפוך למיומנות מעשית.

תקועים על אתגר ספציפי? זה בדיוק סוג הדיון שקורה כל הזמן בדיסקורד שלנו - תשאלו, בלי בושה, גם על הדברים שנראים לכם "בסיסיים מדי".

הצטרפו לקהילה בדיסקורד

לסיכום

הכניסה הראשונה לאתגרי CTF בקטגוריית Pwn צריכה להיות שיטתית - הרצה, checksec, הנדסה לאחור, איתור באג, ורק אז כתיבת ניצול. אל תדלגו על השלבים כדי "להגיע כבר לחלק המגניב". ככל שתתרגלו את הסדר הזה יותר, כך הוא יהפוך לאינסטינקט, וזה בדיוק מה שמבדיל בין מי שנתקע כל אתגר לבין מי שפותר אתגר אחרי אתגר בביטחון.