ARM ו-MIPS בהנדסה הפוכה, כשעוזבים את עולם ה-x86¶
רוב חומרי הלימוד בהנדסה לאחור מתחילים ומתמקדים ב-x86, וזה הגיוני - זו הארכיטקטורה של רוב המחשבים האישיים והשרתים. אבל ברגע שיוצאים מעולם המחשב האישי אל עולם הראוטרים, המצלמות החכמות, מכשירי ה-IoT והמובייל, פתאום נכנסים לעולם שבו ARM ו-MIPS הן ברירת המחדל, לא x86.
למה בכלל יש ארכיטקטורות שונות¶
x86 היא ארכיטקטורת CISC (Complex Instruction Set Computer) - יש בה הוראות מכונה מורכבות שיכולות לבצע כמה פעולות בהוראה בודדת. ARM ו-MIPS הן ארכיטקטורות RISC (Reduced Instruction Set Computer) - הפילוסופיה שלהן היא הפוכה, הוראות פשוטות וקצרות, שרצות מהר ובצריכת אנרגיה נמוכה. בדיוק בגלל היתרון הזה בצריכת חשמל, ARM שולטת כמעט לגמרי בעולם המכשירים הניידים והמוטמעים (embedded), ו-MIPS נפוצה מאוד בציוד רשת ישן וחדש כאחד - ראוטרים ביתיים, נתבים, ומצלמות IP.
מה משתנה בפועל כשעוברים ל-ARM¶
מי שמגיע מ-x86 יגלה כמה הבדלים מרכזיים:
- הוראות באורך קבוע. ב-x86 הוראות הן באורך משתנה, מה שהופך את הפירוק שלהן (disassembly) למאתגר יותר. ב-ARM (במצב הרגיל), כל הוראה היא באורך קבוע של 32 סיביות, מה שהופך את הניתוח לצפוי הרבה יותר.
- יותר רגיסטרים כלליים. ARM מספקת מספר גדול יותר של רגיסטרים לשימוש כללי בהשוואה ל-x86 הקלאסי, מה שמשנה איך פונקציות מעבירות ארגומנטים - לרוב ברגיסטרים ולא על הסטאק, לפחות עבור הפרמטרים הראשונים.
- מצבי הרצה שונים. בארכיטקטורות ARM ישנות יותר קיים גם מצב הוראות מקוצר בשם Thumb, שבו הוראות באורכים קצרים יותר, לצורך חיסכון נוסף בזיכרון - מה שדורש תשומת לב כשמנתחים בינארי ARM, כי אותו קוד יכול להיראות אחרת לגמרי בהתאם למצב.
- מודל זיכרון little-endian ברירת מחדל, כמו ב-x86, אבל ARM תומכת גם ב-big-endian בהגדרות מסוימות, מה שכדאי לבדוק לפני שמתחילים לנתח קובץ.
מה מייחד את MIPS¶
MIPS שונה עוד יותר בכמה היבטים שכדאי להכיר:
- Delay slot. ב-MIPS, ההוראה שמיד אחרי הוראת קפיצה (branch) עדיין מתבצעת, לפני שהקפיצה בפועל קורית. זה תוצר של איך צנרת ההוראות (pipeline) בנויה בחומרה, ומבלבל מאוד מי שלא מודע לזה בפעם הראשונה.
- אין מחסנית קריאה אוטומטית לגמרי כמו ב-x86. כתובת ההחזרה נשמרת ברגיסטר ייעודי (
$ra), לא נדחפת אוטומטית לסטאק, מה שמשנה לגמרי איך ניצול חולשות סטאק צריך להיראות בארכיטקטורה הזאת. - נפוצות ביותר בציוד רשת ישן, מה שהופך אותה לרלוונטית מאוד למי שמתעניין במחקר חולשות בנתבים וציוד IoT.
הכלים לא באמת משתנים, רק ההרגלים¶
החדשות הטובות הן שכלים כמו Ghidra ו-IDA תומכים היטב בשתי הארכיטקטורות האלה, כולל דה-קומפילציה שהופכת אסמבלי לפסאודו-קוד קריא יחסית. מה שכן משתנה זה ההרגלים - צריך ללמוד מחדש איך פונקציה מקבלת ארגומנטים, איפה כתובת ההחזרה נשמרת, ואיך זרימת התוכנית נראית בפועל בכל ארכיטקטורה.
כלי חשוב נוסף הוא QEMU, שמאפשר להריץ ולדבג בינארי בארכיטקטורה זרה (למשל ARM) על מחשב x86 רגיל, בלי צורך בחומרה פיזית מתאימה. זה חוסך את הצורך להחזיק ראוטר אמיתי כדי לתרגל ניתוח קושחה שלו.
למה שווה ללמוד את זה¶
מי שמתמחה רק ב-x86 מגביל את עצמו לחלק אחד מעולם הסייבר. עולם ה-IoT ומחקר קושחה, שהוא אחד התחומים הכי צומחים במחקר חולשות, בנוי כמעט כולו על ARM ו-MIPS. חוקר שמרגיש בנוח בשתי הארכיטקטורות האלה פותח לעצמו הזדמנויות שסגורות למי שנשאר רק בעולם ה-x86.
בקורס מחקר חולשות אנחנו בונים קודם בסיס מוצק ב-x86, ואז מציגים את ההבדלים המרכזיים מול ARM, כדי שהמעבר יהיה מובן ולא מבלבל.
עוברים לראשונה מ-x86 ל-ARM ומרגישים אבודים באסמבלי? זה תחושה נורמלית לגמרי, ובדיסקורד שלנו יש אנשים שכבר עברו את זה ויכולים לעזור.
לסיכום¶
ARM ו-MIPS הן לא רק "עוד ארכיטקטורות" - הן השער לעולם שלם של מחקר קושחה, IoT, ומובייל, שנעדר לגמרי ממי שנשאר רק ב-x86. ההבדלים בין הארכיטקטורות דורשים למידה מחדש של כמה הרגלים בסיסיים, אבל הכלים והעקרונות הכלליים של הנדסה לאחור נשארים אותו דבר.