Desktop RE Writeup: PE Extraction & Patching

מאת שי מרדכי | 29 בפברואר 2024

1. חילוץ קובץ ההרצה (PE Carving)

במבט ראשוני על קובץ ה-PDF שסופק באתגר, התגלה תוכן חריג. באמצעות עורך הקסדצימלי (Hex Editor), זיהיתי חתימת התחלה מוכרת של פורמט PE (ערך הקסדצימלי 4D 5A או MZ). מנקודה זו ועד סוף הקובץ, היה מונח קובץ הרצה שהוסתר בתוך ה-PDF. חילצתי את הבלוק כולו ושמרתי אותו כקובץ עצמאי (new-flag.exe).

2. אנליזה סטטית ו-Binary Patching ב-IDA

בטעינת הקובץ ל-IDA Pro, איתרתי את פונקציית הבדיקה המרכזית האחראית על אימות הסיסמה. הלוגיקה דרשה שסכום ערכי ה-ASCII של הסיסמה שהוזנה, לאחר פעולת AND 0xFF, יהיה שווה ל-10 (0Ah).

.text:00291C12    and     eax, 0FFh
.text:00291C17    mov     [ebp+var_20], eax
.text:00291C1A    cmp     [ebp+var_20], 0Ah
.text:00291C1E    jnz     short loc_291C95

במקום לנחש או לכתוב סקריפט ליצירת סיסמה תואמת, בחרתי לעקוף את המנעול לחלוטין (Binary Patching). דרסתי את הפקודה and eax, 0FFh לפקודת mov eax, 0Ah, מה שמבטיח שהבדיקה תעבור בהצלחה עבור כל קלט שיוזן. לאחר מכן השתמשתי ב-Apply patches to input file כדי לייצר את הקובץ הפרוץ.

3. שחזור אלגוריתם ה-XOR (Decompilation)

הקוד כלל גם לולאת הצפנה פנימית שמבוססת על XOR. המערך המוצפן פוענח כך שאלמנטים באינדקסים זוגיים עברו XOR עם 0xA ואלמנטים אי-זוגיים עברו XOR עם 0xB. שחזרתי את האלגוריתם לקוד C++ נקי כדי לאמת את ה-Control Flow הסופי.