AFL Under the hood (Part 1)
בפוסט הקודם נתתי הקדמה לפאזר AFL – איך הוא עובד ברמה הגבוהה, מהם השימושים שלו וגם דוגמה פשוטה לאופן השימוש בו. כעת, לאחר שהכרנו את הכלי במבט על, הגיע הזמן לצלול למימוש הפנימי שלו – נביט בקוד של AFL עצמו ואיך הוא מיישם את הרעיונות שמנחים את הפאזר. מה קורה ב afl-gcc ו afl-as ? בואו ניזכר בשלב הראשון של השימוש בפאזר, שהוא לקמפל את קוד המקור עם afl-gcc . התוצר של הפעולה הזאת הוא הבינארי שלנו עם קוד אינסטרומנטציה בתוכו. למעשה, afl-gcc הוא לא יותר ממעטפת קטנה, שמוסיפה \ עורכת כמה פרמטרים ל gcc וגורמת לו להשתמש באסמבלר אחר, שהוא afl-as – שם קורה הקסם האמיתי והאינסטרומנטציה נוספת אל התוכנית שלנו. הקלט שמועבר אל afl-as הוא קוד אסמבלי שעבר קומפילציה של gcc (יש לזכור שכשאומרים קומפילציה לעיתים מתכוונים להפוך קוד לתוצר הסופי, executable , אך לתהליך זה יש כמה תחנות בדרך: compiler->assembler->linker . אנחנו בתחנה האמצעית ועלינו להפוך קוד אסמבלי להוראות מכונה שהמעבד מבין). החלק המעניין מתחיל בפונקציה add_instrumentation ב afl-as.c . הפונקציה בודקת תחילה אם אנחנו נמצאים ב text section ,...