מה זה UPX, וכשקובץ "דחוס" הופך גם למוסווה¶
אחת ההפתעות הראשונות שחוקרים חדשים בהנדסה לאחור נתקלים בהן היא לפתוח בינארי בכלי כמו Ghidra, ולגלות שאין כמעט קוד קריא בכלל - רק בלוק אחד גדול של נתונים חסרי משמעות לכאורה. ברוב המקרים הסיבה היא UPX, כלי דחיסה שנועד במקור לצמצם גודל קובץ, אבל הפך גם לכלי הסוואה נפוץ.
מה זה UPX במקור¶
UPX, קיצור של Ultimate Packer for eXecutables, הוא כלי קוד פתוח שדוחס קבצי תוכנה מקומפלים, בדומה לאיך שדוחסים קובץ ZIP - אבל בהבדל מהותי אחד. בזמן שקובץ ZIP נשאר "רדום" עד שמישהו מחלץ אותו ידנית, קובץ שנארז ב-UPX יודע לחלץ את עצמו לבד, בזמן ריצה, בלי שום עזרה חיצונית.
איך זה עובד מבפנים¶
כשארוזים תוכנית עם UPX, הקוד וה-data המקוריים דוחסים ונשמרים בתוך הקובץ החדש. במקום ה-entry point המקורי, UPX מוסיף שגרת חילוץ (unpacker stub) קטנה. כשהקובץ הארוז מורץ, שגרת החילוץ הזאת רצה קודם - היא מפענחת את הקוד הדחוס בחזרה לזיכרון, כותבת אותו למקום המקורי שלו, ורק אז מקפיצה את ההרצה לנקודת הכניסה האמיתית של התוכנית המקורית, כאילו כלום לא קרה.
מבחינת המשתמש, אין שום הבדל בהרצה - התוכנית פשוט עובדת. אבל מבחינת קובץ על הדיסק, כל מה שיש שם זה השגרה הקטנה של UPX, ובלוק דחוס שלא ניתן לקרוא בלי לפענח אותו קודם.
למה זה הפך לכלי הסוואה¶
מכיוון ש-UPX משנה לחלוטין את המראה של הקובץ בדיסק - החתימה הבינארית, גודל הקוד הקריא, וכל מחרוזת טקסט שיכולה להסגיר משהו על מה שהתוכנית עושה - תוכנות זדוניות מאמצות אותו (או כלי דחיסה דומים) כדי להתחמק מזיהוי חתימתי (signature-based) של אנטי וירוס. קובץ ארוז נראה שונה לגמרי מהקובץ המקורי מבחינת ניתוח סטטי, גם אם ההתנהגות בפועל בזמן ריצה זהה.
חשוב להבין, UPX עצמו לא כלי זדוני - הוא כלי דחיסה לגיטימי לגמרי, בשימוש נרחב בתוכנות תקינות. אבל הפרופיל שלו הפך אותו לפופולרי גם בתוכנות עוינות, כי הוא נגיש, חינמי, ומוכר.
איך מזהים קובץ ארוז¶
כמה סימנים בולטים לקובץ שעבר UPX או כלי ארוז דומה:
- entropy גבוה בקטעים מסוימים בקובץ - נתונים דחוסים או מוצפנים נראים אקראיים סטטיסטית, בניגוד לקוד רגיל.
- מיעוט קיצוני של מחרוזות קריאות (strings) בקובץ, כי כל הטקסט המקורי חבוי בתוך הבלוק הדחוס.
- section names חשודים - UPX משאיר לרוב שמות מזהים כמו
UPX0ו-UPX1בכותרת הקובץ, אלא אם הם נמחקו במכוון כדי להקשות עוד יותר על הזיהוי. - entry point שקופץ למקום לא צפוי בתחילת הקובץ, במקום לתוך אזור הקוד הרגיל.
איך מפרקים קובץ ארוז לניתוח¶
הדרך הפשוטה ביותר, אם UPX לא שונה במכוון, היא פשוט להריץ upx -d על הקובץ, שמחלץ בחזרה את הגרסה המקורית. אבל תוכנות זדוניות לרוב משנות את שגרת החילוץ במכוון כדי למנוע את זה. במקרה כזה, חוקרים משתמשים בטכניקה שנקראת "dumping" - מריצים את הקובץ הארוז תחת debugger, נותנים לשגרת החילוץ לסיים את עבודתה בזיכרון, ואז "שולפים" את התוכן המפוענח ישירות מהזיכרון החי, ובונים ממנו קובץ תקין מחדש לניתוח.
למה זה חשוב ללמוד¶
הבנת ארוזים היא שלב הכרחי בכל מסלול הנדסה לאחור רציני, כי היא מלמדת אתכם לזהות "האם מה שאני רואה בקובץ הוא באמת הקוד, או רק שכבה שמסתירה אותו". זו יכולת שרלוונטית גם לניתוח תוכנות זדוניות, וגם סתם לניתוח בינארי שנארז מסיבות לגיטימיות של חיסכון במקום.
בקורס מחקר חולשות אנחנו עוברים על זיהוי וטיפול בקבצים ארוזים כחלק מיסודות ההנדסה לאחור, כדי שהצעד הראשון בניתוח כל בינארי חדש יהיה נכון.
נתקלתם בקובץ ארוז שמסרב להיפרק בקלות? יש כמה טריקים שעוזרים, ובדיסקורד שלנו אפשר לשאול ולקבל כיוון.
לסיכום¶
UPX ממחיש בדיוק איך כלי לגיטימי יכול לשמש גם ככלי הסוואה, תלוי בכוונה של מי שמשתמש בו. חוקר הנדסה לאחור טוב יודע לזהות שכבת ארוז, להבין מתי היא רק לחיסכון במקום ומתי היא ניסיון הסתרה מכוון, ולדעת איך לחשוף את מה שנמצא מתחתיה.