לדלג לתוכן

מה זה ret2win, האתגר הראשון שכל חוקר Pwn פותר

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

מה זה בעצם אתגר ret2win

בבינארי טיפוסי מסוג הזה יש שתי פונקציות מרכזיות - main, שקוראת לפונקציה פגיעה כלשהי (למשל פונקציה שמשתמשת ב-gets או פונקציה דומה שלא בודקת אורך קלט), ופונקציה נוספת שנקראת בדרך כלל בשם דומה ל-win או secret, שלעולם לא נקראת בזרימה הרגילה של התוכנית. בתוך פונקציית ה-win הזאת, לרוב יש קוד שמדפיס את הדגל (flag), או פותח shell ישירות.

המטרה שלכם היא פשוטה להבנה, גם אם לא תמיד פשוטה לביצוע - לגרום לתוכנית לקפוץ לפונקציית ה-win, למרות שאף קריאה רגילה בקוד לא מובילה אליה.

איך הניצול עובד

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

השלבים המעשיים כוללים מציאת ה-offset המדויק עד לכתובת ההחזרה (בעזרת כלי כמו cyclic), איתור הכתובת המדויקת של פונקציית ה-win (למשל באמצעות objdump או Ghidra), ובניית קלט שמכיל בייטי מילוי עד ה-offset, ואחריהם את כתובת פונקציית ה-win, בסדר הבייטים הנכון לארכיטקטורה.

למה זה נקודת ההתחלה המושלמת

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

מה קורה כשיש הגנות

בגרסה הכי בסיסית של ret2win, אין NX רלוונטי (כי לא מזריקים shellcode בכלל), ואין בעיה של ASLR (כי הבינארי עצמו, בניגוד לספריות חיצוניות כמו glibc, לרוב נטען לכתובת קבועה כשאין PIE מופעל). מה שכן עלול לעצור אתכם הוא Stack Canary, שיזהה את הגלישה לפני שכתובת ההחזרה בכלל נדרסת. ברוב האתגרים המתחילים, הגנה זו מכובה בכוונה, בדיוק כדי לשמור על הפוקוס בהבנת העיקרון הבסיסי.

למה עדיין שווה לתרגל את זה גם אם זה "קל"

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

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

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

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

לסיכום

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