PracticU

ניתוח סטטי של UnCrackable3 עם IDA

בלי כתוביותעם כתוביות
PracticU › קורס סייבר והאקינג ל-Android - פריצה לטלפונים ואפליקציות אנדרואיד - בודק חוסן - Mobile App Pentesting › ניתוח סטטי של UnCrackable3 עם IDA
מילון מושגים:
מחרוזת - סוג נתונים שמייצג רצף של תווים, כלומר טקסט, ומשמש לאחסון מילים, משפטים או כל רצף סימנים.
root - משתמש העל במערכות Linux, בעל הרשאות מלאות לכל פעולה. גם הרמה העליונה בעץ של תיקיות או נתונים.
סקריפט - קובץ המכיל רצף פקודות שמבוצעות על ידי מפרש, לרוב כדי להפוך משימות לאוטומטיות.
זיכרון - רכיב מהיר ונדיף שבו המחשב שומר נתונים ותוכניות בזמן ריצתם. תוכנו נמחק עם כיבוי המחשב.
DLL - קובץ ספרייה ב-Windows המכיל קוד ופונקציות שתוכנות שונות יכולות לטעון ולהשתמש בהן במשותף.
ספרייה - אוסף קוד מוכן, כמו פונקציות ומחלקות, שמפתחים משתמשים בו בתוכניותיהם במקום לכתוב הכול מחדש.
פרמטר - ערך שמועבר לפונקציה או לפקודה כקלט, ומשפיע על אופן פעולתן ועל התוצאה שהן מחזירות.
לולאה - מבנה בקרה שחוזר על קטע קוד שוב ושוב כל עוד תנאי מתקיים או עבור כל פריט באוסף.

ניתוח סטטי של UnCrackable3 עם IDA

בשיעור זה אנו מגיעים סוף סוף לגלות את הסיסמה החבויה באפליקציית UnCrackable Level 3, תוך שהצלחנו להתגבר על כל מנגנוני ההגנה בשיעורים הקודמים, ומבצעים ניתוח סטטי מלא של הפונקציות הרלוונטיות ב-IDA.
נושאי הסיכום המוצגים בשיעור:
1. היעד שלנו: לגלות את ה-secret string המתחבא באפליקציה, אחרי שבהרצאות הקודמות התגברנו על זיהוי root, על זיהוי Frida ועל הגנת הדבאגר.
2. חזרה על הפתרונות עד כה: סקריפט שמבטל את System.exit על ידי כתיבת מימוש חדש שלא עושה דבר, ו-native hooks לספריות הדינמיות כדי להתמודד עם בעיית זיהוי ה-Frida.
3. שתי דרכים לטפל בזיהוי Frida: הצמדה לפונקציה שמחפשת את מילת ה-Frida והחלפת התוצאה ביציאה, או החלפת מימוש הפונקציה בזיכרון במימוש משלנו שקורא לפונקציה המקורית רק כאשר אין זיהוי.
4. עקיפת הדבאגר בזמן טעינה: כדי לתפוס את הפונקציה לפני שנטענת לזיכרון השתמשנו בהשהיה קצרה, אך זה לא עזר, ולכן עקפנו את פונקציית טעינת הספריות במימוש משלנו שטוען את המודול ורק אחרי הטעינה מריץ את הקוד שלנו.
5. איתור האנטי-דבאגר: מכיוון שלא ניתן היה לזהות את הפונקציה לפי שם, חישבנו את הכתובת המדויקת שלה על ידי חיבור כתובת הבסיס של המודול להיסט הידוע של הפונקציה, וביצענו replace עליה.
6. הפניית המבט לפונקציית Verify: בקוד הג'אווה נכנסים מהפונקציה שמציגה הצלחה אל פונקציה שמקבלת קלט יוזר ושולחת אותו לפונקציה נוספת, שמסתבר שהיא פונקציה native היושבת בתוך ספריית ה-DLL של האפליקציה.
7. פתיחת הספרייה ואיתור הפונקציה: בתוך רשימת ה-exports של הספרייה מאתרים את הפונקציה שאליה נשלח הקלט, וזו הפונקציה שתהיה מוקד הניתוח שלנו.
8. תיקון הצגת החתימה: ראשית מתקנים את הצגת החתימה כך שהפרמטר הראשון יהיה מצביע למבנה סביבת ה-JNI, ומזהים שהפרמטר האחרון הוא קלט היוזר שהגיע מג'אווה, ומשנים את השמות לשמות משמעותיים.
9. מנגנון ספירת אמצעי האבטחה: בהתחלה נראית הכרזת משתנה שמקבל ערך 2, ומתברר שמדובר במונה אבטחה שמקודם פעם אחת כאשר מנגנון זיהוי ה-Frida הופעל ופעם שנייה כאשר פונקציה מסוימת בודקת את ה-Frida ברמת ה-Interrupt.
10. המטרה של המונה: הספירה נועדה לבדוק שכל אמצעי האבטחה אכן הופעלו ולא הוחלפו או אופסו על ידי תוקף, ורק לאחר שהמונה שווה לשניים ממשיכים לבדיקת הקוד עצמה, ולכן כל ניסיון לעקוף מנגנון בלי לקדם את המונה יכשיל את הבדיקה.
11. בדיקת אורך הקלט: הפונקציה ממירה את קלט היוזר מהמנגנון של ג'אווה לצורה native, ובודקת שאורכו בדיוק 24 תווים, וקלט באורך אחר אינו עובר כלל אל תוך הבדיקות שאחריו.
12. לולאת ההשוואה: בתוך הבלוק של הבדיקה פועלת לולאה עם שני מונים, וכל תו של קלט היוזר מושווה מול תו במקום המתאים של מחרוזת סודית, ומכאן ניתן לשנות את שם המשתנה ל-secret password מכיוון ששם שמורה הסיסמה.
13. פעולת ה-XOR על התווים: לפני ההשוואה מבוצעת פעולת XOR בין התו לבין תו של מפתח, ורק התוצאה מושווה לקלט היוזר, ובכל איטרציה מתקדמים לתו הבא במפתח.
14. איתור המפתח הסודי: מעקב אחר השימושים במשתנה החיבור מראה שהוא מוזן בפונקציה אחרת מהמפתח שהועבר מג'אווה, ובהמשך החקירה מתגלה שהמפתח הסודי הוא המילה פיצה המופיעה פעמיים.
15. העברת המפתח בין המשתנים: המפתח מועתק תחילה למשתנה מקומי של הפונקציה המאתחלת ומשם בהעתקת מחרוזת אל משתנה גלובלי, וכל זאת נעשה בשכבות עטיפה שנועדו להקשות על הניתוח.
16. סידור השמות לקריאות: לאחר שהבנו את תפקידי המשתנים משנים את השמות כך שישקפו את המשמעות, המונה, התו הנוכחי במפתח והסיסמה הסודית, וכך הפונקציה קריאה וברורה.
17. הלוגיקה המלאה של הבדיקה: לכל תו בקלט עושים XOR עם התו הנוכחי במפתח ומשווים את התוצאה לתו במחרוזת הסודית, ורק אם כל 24 התווים עברו את הבדיקה מוחזרת תוצאת הצלחה, אחרת מוחזר אפס.
18. הפונקציה שמאתחלת את הסיסמה: מגלים שהמחרוזת הסודית מאותחלת בהתחלה כאפסים ונבנית בהמשך על ידי פונקציה ייעודית, שהיא למעשה הפונקציה החשובה ביותר בניתוח שלנו.
19. ניתוח סטטי בלבד: כל העבודה נעשתה בלי דבאגר, על ידי קריאה והבנה של הקוד המנותח ב-IDA, שיטה שדורשת הבנה מעמיקה אך גם אינה מסתמכת על כך שהדבאגר יפעל.
לסיכום, בשיעור זה ביצענו ניתוח סטטי של פונקציות הבדיקה באפליקציה, הבנו את מנגנון ספירת אמצעי האבטחה שמקשה על עקיפתם, את בדיקת אורך הקלט של 24 תווים, את לולאת ה-XOR בין הקלט למפתח הסודי מילת הפיצה, וגילינו שהמחרוזת הסודית נבנית בפונקציה ייעודית שטרם נתחנו, ואת תפיסתה וחילוץ הסיסמה נבצע בהרצאה הבאה. SR12606HE

פרקי ההרצאה: ניתוח סטטי של UnCrackable3 עם IDA

  1. 00:00

    סיכום ההגנות שעקפנו

  2. 01:01

    חזרה על תפיסת StrStr

  3. 02:11

    בעיית טעינת הספרייה באיחור

  4. 03:27

    החלפת System Load Library

  5. 04:23

    איתור לפי כתובת ו-Offset

  6. 05:16

    המסלול לפונקציית Bar

  7. 07:30

    מנגנון ה-CheckBit

  8. 08:56

    מונה מנגנוני האבטחה

תמלול ההרצאה: ניתוח סטטי של UnCrackable3 עם IDA

הטקסט המלא של הדקות הראשונות בהרצאה «ניתוח סטטי של UnCrackable3 עם IDA» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:02

    שלום לכולם, בהרצאה הזו אני רוצה סוף סוף להגיע לקוד. אתם זוכרים שהצלחנו להתגבר על הגנה של רות? הצלחנו להתגבר על הגנה של פרידייט? הצלחנו להתגבר על הדבאגר?

  2. 00:13

    עכשיו הגיע הזמן לגלות את הסיקרט סטרינג הזה. מהו הסטרינג הסודי שמתחבא פה? בואו ניזכר בשני מילים מה עשינו עד עכשיו. קודם כל כתבנו סקריפט שמבטל את היציאה של סיסטם.אקזיט על ידי זה שאנחנו מתחברים לקלאס ב-Java של סיסטם, ועושים לקלאס הזה סיסטם נקודה אקזיט חדש שלא עושה כלום.

  3. 00:38

    אחרי זה עשינו נייטיב הוקס, שזה אומר נתפסנו לתוך פונקציות של ספריית העזר, של DLL, של ליבררי דינמי, והצלחנו להתגבר על הבעיה שהוא חיפש מילת פרידה בשני דרכים.

  4. 00:54

    הדרך הראשונה, על ידי שהתחברנו, עשינו את touch לפונקציית str str, עשינו interceptor touch לפונקציית str str ותפסנו בכניסה את המילה פרידה וביציאה כתבנו אם הייתה מילת פרידה תעשה ריפלייס לתוצאה.

  5. 01:14

    בואו נעשה את זה קצת יותר יפה שיהיה לנו יותר קריא. אני עושה את זה עם כזה דבר שפשוט יהיה לנו יותר קל לקרוא את זה וכזה דבר בסוף גם, רק בסוף זה הפוך.

  6. 01:26

    יופי. אז זה הפתרון הראשון שעשינו לבעיה של פרידה דטקשן, לא רות דטקשן, read הדטקשן פרובלם זה הפתרון הראשון שעשינו והפתרון השני שעשינו זה על ידי זיהוי והחלפה של str str פה עשינו החלפה שלו בתוך הזיכרון החלפנו את הקוד לקוד חדש ופה התחברנו רק ביציאה והחלפנו תוצאה כשהפונקציה נגמרת פה עשינו החלפה של הקוד ושם עשינו attach לקוד זה

  7. 01:58

    אומר מתחברים בכניסה וביציאה ובreplace מחליפים אותו החלפנו אותו לקוד שלנו כאשר במקרה של פרידה שווה מינוס 1 זה אומר שאין מילת פרידה אז אנחנו קוראים לפונקציה המקורית לזה המקורי אנחנו קוראים עם הערכים שקלטנו מבחוץ אנחנו קוראים לפונקציה המקורית אחרי שהצלחנו בשני דרכים

  8. 02:22

    שונות למצוא את הפרידה דטקשן פרובלם אנחנו הגענו למצב שרצינו לפרוץ את כדי לפרוץ את הדבאגר היינו צריכים להיכנס לתוך הפונקציה לפני שהיא נטענת בזיכרון וזאת הייתה בעיה.

  9. 02:37

    הראינו שהפונקציה שלנו שזה libfoo לא נטענה לנו בזמן שהסקריפט נטען ואם עשינו delay של 100 אלפיות השנייה של עשירית השנייה היא כן נטענה לנו. זאת אומרת המודול שלנו נטען לנו באיחור למה כי הוא צריך להתחיל לבצע את הפקודות של ג'אווה.

  10. 02:58

    הרי אחת הפקודות פה בסוף זה להתין את המודול, אז ברגע שהפקודה הזאת תתבצע נוכל להתין את המודול, אבל בהתחלה לא מבוצעת, בגלל שהיא בהתחלה לא מבוצעת היינו צריכים לחכות מהאלפיות השנייה, וזה לא עוזר לנו, כי בזמן הזה כבר מתחילות להתבצע פקודות אחרות, אז זה לא עוזר לנו, אז עשינו שיטה אחרת.

  11. 03:22

    מה השיטה האחרת? במקום לחכות שכתבנו System Load Library, שכתבנו את הדבר הזה, סיסטם לורד לייברירי נכנסנו לתוך הקוד שלו ועשינו לו אימפלימנטציה חדשה זאת אומרת לקחנו את הסיסטם לורד לייברירי שמקבל סטרינג ועשינו לו קוד חדש ובתוך הקוד שלו עשינו את הטעינה של המודול את זה לקחתי מהאינטרנט ואחרי שהמודול נטען אנחנו ביצענו את הקוד שלנו

  12. 03:50

    מה הקוד שלנו? הקוד שלנו עשה ריפלייס לאנטי דיבאגר איך זיהינו איפה נמצא אנטי דיבאגר? אי אפשר היה לזהות אותו לפי שם בגלל שאי אפשר היה לזהות אותו לפי שם, אז עשיתי דבר כזה, לקחתי את הכתובת הבסיס של כל המודול, הוספתי לו את ה-offset של הספרייה, ואחרי שהייתה לנו כתובת מדויקת, עשינו replace.

  13. 04:13

    ה-offset הזה זה offset של פונקציה 3250. זה הכתובת פה בכתובות פה, הנה 3250, זה בדיוק פונקציית אנטי-דיבאגר. זה מה שהיה עד עכשיו. מה אנחנו רוצים לעשות?

  14. 04:27

    עכשיו אנחנו רוצים לגלות את הקוד, איפה מתחבא הקוד שלנו. אז אנחנו נעשה את זה, Getting the secret code, איך הם קראו לזה?

  15. 04:38

    סטרינג נראה לי, סיקרט סטרינג, יופי. איך אנחנו נעשה את זה? טוב, אנחנו חייבים ללכת לחפש איך זה עובד. זה לא שיש לי תשובות מוכנות. אנחנו נלך פה לפונקציית Verify.

  16. 04:51

    אנחנו רואים פה ב-Verify, כשיש Success, יש לפני כן צ'ק קוד. באים, right-click, Go to declaration, לראות מה זה ה-check code הזה.

  17. 05:01

    אנחנו רואים שה-check code הזה, שמקבל איזשהו סטרינג מהיוזר, שולח את זה לפונקציית בר עם אותו סטרינג. מה זה פונקציית בר? עושים right-click, Go to declaration, ומגיעים שפונקציית בר כאן, באותו קובץ, היא native. מה זה אומר?

  18. 05:16

    native שיושבת בתוך dll. אוקיי, בואו נלך ל-dll, יש לנו פה את ה-dll שלנו. פתוח שזה dllipfoo.so. פונקציה, איך היא נקראת?

  19. 05:26

    פונקציה שנקראת בר. בואו נחפש אותה, היא צריכה להיות באקספורטס פה היא צריכה להיות פונקציית בר והנה פונקציית בר שלנו אנחנו צריכים להבין מה זה הפונקציה הזאת איך היא פועלת ואיך מחלצים משם את הקוד דבר ראשון אני רואה שזה לא קלט שזה gni שזה קשור לג'אווה אז אני אעשה לו את זה ידנית מה לעשות שהוא לא קלט את זה אני אעשה פה ctrl c יבוא לכאן

  20. 05:56

    אני אני אלחץ אותו y ובמקום אינטג'ר אני אגיד לו שזה ושימו לב שזה פוינטר למבנה מסוג gna environment ושימו לב מה יקרה כאן כשהוא יקלוט שזה זה תסתכלו פה הופה נהיה הכל ברור יופי ומה זה אחרון האחרון זה בעצם הuser input בוא נעשה rename user input שהגיע אליי מג'אווה הדבר השני זה גם משהו שקשור לgna עצמו אז

  21. 06:22

    זה הuser input זה בדיוק מה שמעבירה לי ג'אווה כאן אתם רואים מערך של בתים הסוגריים הזה הדבר הזה זה בדיוק זה יופי בואו ננסה להבין מה קורה פה אני רואה פה שיש הכרזת משתנים אחרי זה מה זה 14u בוא נראה את זה בדצימלי 20 לא יודע איזשהו מספר מקבל 20

  22. 06:46

    די וורד 6038 שווה שווה 2 אין לי מושג מאיפה זה הגיע אז נרשום איזשהו צ'ק רינם איזשהו צ'ק צ'ק ביט בוא נראה מה זה הצ'ק הזה לא לא בטוח שזה ביט אבל בסדר בוא נראה מה זה הצ'ק הזה איך אני בודק אני עושה איקס ומסתכל מי קורא לו מאיפה הוא הגיע אני רואה שהוא הגיע פה משלושה מקומות מבר מעינית ומעוד איזושהי פונקציה מה הקשר לעינית

  23. 07:13

    הנה צ'ק ביט פלוס פלוס אז למעשה בודקים פה שהעינית הזה הופעל זאת אומרת כשהעינית הזה מופעל הצ'ק ביט הזה מקודם באחד ואז ככה בודקים שהפונקציה הזאת התבצעה ולא החלפנו אותה כאילו מישהו פה ניסה להקשות עלינו לראות שאם אני מעיף את כל העינית הזה, ה-check beat הזה לא יעלה ב-1, וברגע שהוא לא יעלה ב-1,

  24. 07:38

    אנחנו לא ניכנס פה להשוואה, זה מעין security beat כזה, security check. בואו נראה גם מה זה זה. הנה, ויש לנו פה גם פונקציה של, מה זה הפונקציה הזאת?

  25. 07:49

    זה מוכר לי, ה-3080. אה, זה פרידה מוניטור. טוב, אני מחליף לזה שם, אני לוחץ right-click-n. ראינו את זה, זה פרידה מוניטור.

  26. 07:59

    זה זה שמזהה האם הפרידה מופעל או לא. פרידה מוניטור, אתם זוכרים זה זה? אוקיי, אז יש לנו פרידה מוניטור. הפונקציה הזאת של פרידה מוניטור גם מקדמת את הצ'קביט ב-1.

  27. 08:12

    אוקיי, הצ'קביט הזה בא לבדוק שגם פרידה מוניטור הצליח. בואו נעשה לזה rename, פרידה מוניטור צ'קר, עינית, זה שמפעיל את הפרידה מוניטור.

  28. 08:24

    פרידה מוניטור עינית גם מקדם אותו ב-1, אז הוא צריך להתקדם פעם אחת מפרידה מוניטור ופעם שנייה מעינית. בואו נראה עוד פעם. אתם רואים, פרידה מוניטור צריך לקדם אותו ב-1, איני צריך לקדם אותו ב-1, ואז בבר אנחנו בודקים שהוא באמת שווה ל-2.

  29. 08:44

    אז נקרא לזה בשם חדש, לחצתי עוד N, All Security Security Checker, Security Check Counter. סופר כמה מנגנוני אבטחה הופעלו, Security Check Counter.

  30. 08:57

    ה-Security Check Counter הזה מקודם פעם אחת בתוך פרידה מוניטור, אתם רואים כשהפרידה מוניטור הופעל, ופעם שנייה security checker הזה מופעל כשיש לנו פה אינית שהאינית עבר כמו שצריך, בקיצור דוחפים אותו בכל מקום שחשבו שאנחנו ננסה לפרוץ או לאפס אותו ואז לפני שבודקים את הקוד לפני שהבר הזה בודק הוא בודק שכל אמצעי האבטחה במקום רק אז הוא מתחיל לעבוד בוא ננסה לראות

  31. 09:27

    מה הוא עושה הוא מפעיל פה איזושהי פונקציה שמקבלת v9 מה זה ה v9 הזה אין לי מושג אוקיי, נחזור לזה, GetElementByArray, פה,

לקורס המלא: קורס האקינג לאנדרואיד אונליין

ההרצאה הקודמת: עקיפה עם Frida הגנת Anti-Debug בתוך UnCrackable3

ההרצאה הבאה: פריצה של UnCrackable-Level3

הרצאות קשורות מקורסים אחרים

  • ניתוח קוד סטטי - דִּיסְאָסֶמְבְּלֶר
  • ניתוח בדיקות
  • ניתוח הפריצה
  • ניתוב סטטי צף

קורסים נוספים במסלול

  • קורס SOC - מיישם הגנת סייבר
  • קורס סייבר למתחילים - Hacking - בדיקות חוסן תשתיתי ופריצה ל-Windows 10/11 - קורס זה נדרש למבחן ההסמכה היוקרתי OSCP
  • קורס פריצה ומבדקי חדירה לתשתית ארגונית - בדיקות חוסן מתקדמות ל-Active Directory - קורס זה נדרש למבחן ההסמכה היוקרתי OSCP
  • קורס פריצה ומבדקי חדירה לאתרי אינטרנט - בדיקות חוסן לאתרים - Web Pentesting - קורס זה נדרש למבחן ההסמכה היוקרתי OSCP