hideinpILainsight

נכתב על ידי naweiss

hideinpILainsight

התקבל מהאתגר קובץ בשם wabbalubbadubdub.exe, בתיאור האתגר נכתב שמדובר בקוד של .NET לכן השתמשנו ב ILSpy וקיבלנו את הקוד הבא:

 

יש שני מכשולים קטנים שצריך לעבור כדי להגיע לחלק המעניין:

  1. הקוד בודק האם אנו משתמשים ב-Debugger, אם כן הוא פשוט מדפיס Sometimes science is a lot more art than science. A lot of people don't get that.
  2. אחרת, הוא מג'נרט מספר ראנדומאלי בין 0 ל-312 לא כולל ובודק האם הוא גדול שווה מ-312. כלומר if (false)

נתעלם לרגע משני המכשולים ונמשיך הלאה.

הקוד יוצר dll תוך כדי ריצה עם מודל מסוים שבתוכו פונקציה בשם gimmedeflag, מעניין.

הפונקציה מקבלת שני פרמטרים מטיפוס byte[] ומחזירה byte[].

אחר כך מוגדרים כל הטיפוסים של המשתנים המקומיים בפונקציה ומוגדר שקוד ה-IL (byte-code) של הפונקציה יהיה התוכן של המערך il.

לאחר מכן הפונקציה gimmedeflag מופעלת עם 2 פרמטרים:

ניקח את הקוד הרלוונטי נשים בפרויקט C# חדש נריץ ב-Debug ונדלג מעל שני המכשולים.

הפונקציה gimmedeflag זורקת error, מוזר.

אנחנו לא יודעים מה באמת קורה בפונקציה gimmedeflag אבל נתון לנו קוד ה-IL שלה, ננסה להיעזר בזה.

הדרך הנוחה ביותר הייתה פשוט לשמור את כל ה-dll שנוצר תוך כדי ריצה בקובץ נפרד, ואז נוכל לעשות לו decompile. וכך יהיה לנו את קוד ה-C# של gimmedeflag.

כמה שינויים קטנים בקוד ונקבל את ה-dll:

 

נשתמש ב-ILSpy שוב ונקבל:

 

נשים לב שהקוד יזרוק null תמיד בלא קשר ל-input.

נסכם מה שראינו, הקוד יצר dll שאותו שמרנו לקובץ, קראנו את הפונקציה gimmedeflag ושמנו לב שהיא זורקת שגיאה.

ננסה ליצור פרויקט חדש ונשים בו את הפונקציה gimmedeflag ללא ה-throw null.

כמו שהזכרנו, הפונקציה מקבלת 2 פרמטרים. מערך קבוע והקוד של ה-Main מה-exe הנ"ל.

הדבר היחיד שחסר לנו זה הקוד של ה-Main, נוציא אותו עם הקוד:

 

זהו, נריץ את הקוד עם הפרמטרים הנ"ל ונקבל את הדגל: BSidesTLV{Look, Rick, I know IL!}

הערה: הפרמטר המוחזר היה מטיפוס byte[] נמיר אותו ל-string כך: Encoding.Default.GetString(flag)

Success