מבוא לספריית pwntools - הכלי שכל חוקר חולשות בינארי מכיר¶
בשלב מסוים בלמידה שלכם, אחרי שכבר הבנתם גלישת חוצץ וכתבתם ניצול ראשון "ידני", תתקלו במונח pwntools כמעט בכל אתגר CTF ובכל מדריך. זו ספריית פייתון שהפכה לסטנדרט דה-פקטו בעולם ניצול החולשות הבינארי, וברגע שתתחילו להשתמש בה, תבינו למה.
למה בכלל צריך ספרייה מיוחדת לזה¶
כתיבת ניצול חולשה כוללת המון פעולות שחוזרות על עצמן בכל אתגר כמעט בלי שינוי - התחברות לתהליך מקומי או לשרת מרוחק, שליחת בייטים בפורמט מדויק, קבלת תשובה וניתוח שלה, המרת מספרים בין ייצוגים שונים (למשל little-endian), ובניית payloads מורכבים עם padding מדויק. אפשר לכתוב את כל זה מאפס בכל פעם עם פייתון רגיל, אבל זה עבודה חוזרת ומייגעת שגוזלת זמן מהחלק המעניין באמת - הבנת החולשה עצמה.
pwntools נבנתה בדיוק כדי לפתור את הבעיה הזאת. היא ספריית פייתון קוד פתוח שמרכזת את כל הפעולות השגרתיות האלה תחת ממשק אחד, נוח ועקבי.
מה pwntools נותנת לכם בפועל¶
- תקשורת אחידה עם התהליך. בין אם אתם מריצים את הבינארי מקומית או מתחברים לשרת מרוחק דרך רשת, pwntools נותנת לכם את אותו ממשק בדיוק (
process()לתהליך מקומי,remote()לשרת) - אין צורך לכתוב קוד שונה לכל מקרה. - פונקציות המרה נוחות. פונקציות כמו
p32ו-p64ממירות מספרים לרצף בייטים בפורמט הנכון (little-endian, כפי שרוב הארכיטקטורות המודרניות משתמשות בו) בשורה אחת, במקום קוד המרה ידני ומועד לטעויות. - חיפוש gadgets אוטומטי. באמצעות מודול בשם ROP, pwntools יודעת לסרוק קובץ בינארי ולמצוא gadgets שימושיים לבניית שרשראות ROP, ולפעמים אפילו לבנות את השרשרת עצמה באופן אוטומטי לפי מטרה שאתם מגדירים.
- זיהוי הגנות בבינארי. הפקודה
checksec(שמגיעה עם pwntools) בודקת קובץ בינארי ומראה לכם מיד אילו הגנות מופעלות עליו - NX, ASLR/PIE, Stack Canary, ועוד. זה בדרך כלל הצעד הראשון בכל ניצול, ו-pwntools עושה אותו בפקודה אחת. - ממשק אינטראקטיבי. הפונקציה
interactive()נותנת לכם שליטה ידנית ישירה על התהליך אחרי שהניצול שלכם הצליח - שימושי במיוחד ברגע שבו פתחתם shell ורוצים להמשיך משם ידנית.
איך זה נראה בפועל, ברמת הרעיון¶
זרימת עבודה טיפוסית עם pwntools נראית כך - פותחים חיבור לתהליך, בונים payload שמורכב מ-padding עד לכתובת ההחזרה, ואז מוסיפים את הכתובות או השרשרת שרוצים לדרוס איתה, שולחים את זה בקריאה אחת, ומעבירים שליטה למצב אינטראקטיבי כדי לקבל shell. כל שלב בתהליך הזה נכתב בכמה שורות פייתון קריאות, במקום בקוד ידני ומייגע שמטפל בסוקטים ובפורמטים של בייטים.
זה גם מה שהופך אקספלויטים לניתנים לשחזור ולתחזוקה - כשמישהו אחר (או אתם, בעוד חצי שנה) פותח את הקוד שלכם, ברור מיד מה כל שלב עושה, בניגוד לסקריפט מבולגן שמטפל ידנית בכל בייט.
למה זה חשוב ללמוד מוקדם, לא רק בסוף¶
יש מתחילים שמנסים "לדחות" את הלמידה של pwntools עד שהם "כבר מבינים הכל", אבל זו טעות. ברגע שאתם מבינים את יסודות גלישת החוצץ, שווה מיד להתחיל לכתוב את הניצולים שלכם עם pwntools, כי היא לא רק חוסכת זמן - היא גם עוזרת לכם להתמקד בלוגיקה של הניצול עצמו במקום להילחם בפרטים טכניים משעממים כמו סדר בייטים.
איך לומדים להשתמש בזה נכון¶
pwntools היא כלי, לא תחליף להבנה. היא לא תגיד לכם איפה החולשה נמצאת או איך לנצל אותה - היא רק הופכת את מימוש הניצול שאתם כבר הבנתם למהיר וקריא יותר. בקורס מחקר חולשות אנחנו משלבים את pwntools כבר מהאתגרים הראשונים, כדי שתתרגלו לכתוב אקספלויטים בצורה מקצועית מההתחלה, ולא תצטרכו "ללמוד מחדש" איך לעבוד אחרי שכבר התרגלתם לשיטות פחות יעילות.
נתקעתם עם שגיאה מוזרה מ-pwntools, או לא בטוחים איך להתחיל להשתמש בה? זה בדיוק הסוג של שאלות שעולות כל הזמן בדיסקורד שלנו.
לסיכום¶
pwntools היא לא רק "עוד ספרייה" - היא הפכה לשפה המשותפת של קהילת מחקר החולשות הבינארי. כמעט כל write-up, כל אקספלויט, וכל מדריך שתתקלו בהם בתחום בנויים סביבה. ככל שתתחילו להשתמש בה מוקדם יותר, כך תוכלו להתמקד במה שבאמת חשוב - להבין את החולשה עצמה.