DoSaTTaCK
- קטגוריה: Reverse Engineering
- 1200 נקודות
- נפתר על ידי קבוצת JCTF
תיאור
פתרון
נבדוק מהו הקובץ המצורף:
root@kali:/media/sf_CTFs/bsidestlv/DoSaTTaCK# file challenge.flp
challenge.flp: DOS/MBR boot sector, code offset 0x58+2, OEM-ID "WINIMAGE", sectors/cluster 2, root entries 112, sectors 640 (volumes <=32 MB), Media descriptor 0xfd, sectors/FAT 1, sectors/track 8, serial number 0x22550c8e, label: " ", FAT (12 bit), followed by FAT
זהו קובץ תמונה של תקליטון דוס. מספר תוכנות יכולות לחלץ את הקבצים ממנו, למשל 7Zip. לאחר חילוץ הקבצים אנו מקבלים שתי תוכנות הרצה וקובץ בינארי:
root@kali:/media/sf_CTFs/bsidestlv/DoSaTTaCK# ls -al
drwxrwx--- 1 root vboxsf 4096 Jun 21 13:08 .
drwxrwx--- 1 root vboxsf 4096 Jun 20 19:23 ..
-rwxrwx--- 1 root vboxsf 327680 Jun 11 19:10 challenge.flp
-rwxrwx--- 1 root vboxsf 17216 Apr 6 1992 CLIENT.EXE
-rwxrwx--- 1 root vboxsf 11892 Sep 26 1987 MAIN.ENC
-rwxrwx--- 1 root vboxsf 23568 Apr 6 1992 SERVER.EXE
קבצי ההרצה הם בפורמט NE (עבור חלונות 3):
root@kali:/media/sf_CTFs/bsidestlv/DoSaTTaCK# file CLIENT.EXE
CLIENT.EXE: MS-DOS executable, NE for MS Windows 3.x
root@kali:/media/sf_CTFs/bsidestlv/DoSaTTaCK# file SERVER.EXE
SERVER.EXE: MS-DOS executable, NE for MS Windows 3.x
נעלה לחלונות 3.11 (שרץ מעל אמולטור DOSBox) ונריץ את הקבצים.
הפלט מהרצת הסרבר:
הפלט מהרצת הקליינט:
עם זאת, דבר לא קורה. נצטרך לנתח את קבצי ההרצה ולראות מה היה אמור לקרות. שימו לב שלדיסאסמבלרים מודרניים ישנה לרוב תמיכה חלקית לכל היותר בפורמט NE. למשל, IDA Free לא תומך בפורמט (IDA Pro כן, אבל הוא יקר), ו-Ghidra תומך בו אך מתקשה בהבנתו. אנחנו נשתמש ב-W32Dasm הותיק שמעניק תמיכה סבירה בפורמט.
באמצעות חיפוש המחרוזות שראינו, אנחנו מגיעים אל קטע הקוד הבא:
* Possible StringData Ref from Data Seg 002 ->"Sending Magic Byte.."
|
:0001.0112 689800 push 0098
:0001.0115 0E push cs
:0001.0116 E833FF call 004C
:0001.0119 83C402 add sp, 0002
:0001.011C 689100 push 0091
:0001.011F FF7606 push word ptr [bp+06]
:0001.0122 E8CD0E call 0FF2
:0001.0125 83C404 add sp, 0004
יש פה קריאה לשתי פונקציות. הראשונה, בכתובת 0x4C, משמשת לכתיבה למסך. השנייה, בכתובת 0xFF2, משמשת לשליחת נתונים דרך COM1, הפורט הסיריאלי.
אם כך, עלינו להרים תמיכה ב-COM1 על מנת לאפשר לתוכנות לדבר בינן לבין עצמן. ניתן לעשות זאת על ידי שינוי בהגדרות ה-DOSBox כך שיחבר את COM1 המדומה לפורט סיריאלי על המחשב המארח - למשל COM1 גם כן. אם אין לנו פורט סיריאלי על המחשב המארח (ולרובנו אין), אפשר להתקין דרייבר שידמה זאת, או להרים עוד רמה של וירטואליזציה ולהריץ את DOSBox בתוך מכונה וירטואלית שרצה עם VirtualBox, שם אפשר להגדיר פורט סיריאלי מדומה:
לאחר שחזור הריצה בשנית נקבל את התעבורה שנשלחת מהקליינט אל הסרבר. התשדורת מתחילה עם התו בעל הערך 0x91 ולאחר מכן המחרוזת הבאה:
06E820075A5DE9ED1ECA0200558BEC6823018B4608E80C078B4606E806075A5DE91B20CA0400558BEC683D018B4608E800078B4606E8EC065A5DE91588CA0400558BEC6857018B4608E8E6068B4606E8D2065A5DE98485B8FFFFCA0400558BEC6874018B460CE8C9068B460AE8B5065A5DE9C683CA0800558BEC6888018B4606E8AF065A5DE9A086CA0200558BEC689C018B4606E89B065A5DE9D585CA0200558BEC68B6018B4608E887068B4606E873065A5DE90487CA0400558BEC68CA018B4606E85F065A5DE9B648CA0200558BEC68EA018B460CE84B068B46088B4E0A8D5E06E8C2065A5DE9CF48558BEC8B4E068B5E088B560A5DE83B07CA0800558BEC
התו 0x91 הוא מה שהתוכנה מכנה Magic Byte, והמחרוזת היא הייצוג של המפתח, באורך 256 בתים.
מהצד השני, הסרבר מתעורר לחיים ומדפיס:
קיבלנו קובץ EXE חדש, שהוא פענוח של הקובץ MAIN.ENC עם המפתח מהקליינט! אולם, משום מה הוא לא רץ כראוי.
לאחר חקירה התברר לנו שחלק מהמפתח שנשלח מהקליינט שגוי. ניתן היה לראות זאת באמצעות התבוננות במחרוזות שפוענחו, למשל:
setvbuf._.{rcat._strlen
ברור שאמור להיות שם strcat.
מניתוח הסרבר התברר שההצפנה היא בסך הכל ביצוע XOR עם המפתח. למזלנו, הקובץ הכיל מספר רב של מחרוזות, ובאמצעות ניחוש הערכים הנכונים של המחרוזות שנראו שגויות אפשר היה לשחזר את המפתח הנכון ולקבל את הקובץ MAIN.EXE כפי שאמור היה להתקבל במקור.
ההרצה של הקובץ המתוקן ב-DOSBox הציגה את ההודעה הבאה:
השתמשנו ב-Boot Disk של DOS 3.3, הרצנו שוב וקיבלנו:
נראה שהתוכנה מבצעת פקודה לא חוקית. מבדיקת האסמבלי של התוכנה (היה צורך לבצע קודם חילוץ באמצעות UPX), הגענו אל הקוד הבא:
1000:05ee b8 00 00 MOV AX,0x0
1000:05f1 f7 f0 DIV AX
מתבצעת פה חלוקה ישירה באפס. עם זאת, גם לאחר מעקף הפקודות הנ"ל, עדיין לא הצלחנו לקבל את הדגל:
מופיע פה משהו שנראה כמו דגל, אך יש בו קטע משובש באמצע:
BSidesTLV{DOSis ??????????????ttack}
באמצעות מספר יוריסטיקות וניחושים הגענו למסקנה שקיימים מספר תווים חוקיים גם באמצע, מה שהביא אותנו ל:
BSidesTLV{DOSis ??????nl??an??ttack}
הוספנו רווחים וקיבלנו:
BSidesTLV{DOS is ?????nl? an attack}
ומכאן כבר היה אפשר לנחש את הדגל:
BSidesTLV{DOS is not only an attack}
בדיעבד פורסם שהיה באג באתגר, והוא הציג את הדגל הנכון רק ב-DOS 6.22 למרות שדרש את DOS 3.3.