
הטקסט המלא של הדקות הראשונות בהרצאה «דיבאג של קובץ so עם IDA ופריצה לתוך UnCrackable-Level2» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
שלום לכולם, ברוכים הבאים להרצאה שבה נגלה את הקוד הסודי שלנו על ידי זה שנתחבר עם הדבאגר לתוך האפליקציה הזאת. אז ככה, קודם כל, יש לנו פה סוכן סמוי שרץ בתוך הטלפון ומחכה לחיבור הדבאגינג שלנו.
אנחנו מפעילים עאידה פרו, עושים לה new שתדבג את ה-DLL הזה של אנדרואיד, ליפטפון.so. דיברנו על זה בהרצאות קודמות, אז אני לא חוזר.
אנחנו רוצים לשים breakpoint בתוך פונקציה של בר, זאת הפונקציה שהג'אווה שולחת לבדיקה, ראינו את זה בג'אדקס ואנחנו רוצים לעצור כאן בתחילת הפונקציה ואנחנו רואים שאנחנו פה. עכשיו, איך אנחנו נגלה את הסיסמה?
קודם כל בוא נראה שזה באמת עובד, שאנחנו מצליחים באמת להגיע לכאן ולהציץ לפקודות האלו, שזה לא ניתוח סטטי, שזה ניתוח דינמי של זיכרון. אנחנו עושים debugger process options, מכניסים פה את ה-IP של הטלפון שלנו.
אפשר לעשות פינג אליו, לבדוק שהוא באמת עובד. ככה אני מציע לכולם תמיד לבדוק, לעשות פינגים בלראות שזה באמת יש תקשורת, כי הטלפון נמצא בברידג' בהגדרות, ואני עושה את touch to process, מחפש את התהליך בתוך הטלפון, את השם של התוכנה, Uncrackable 2, ומתחבר עם הדבאגר לתוך הטלפון לתוכנה הזאת.
הוא שואל אותי האם מה שרץ בטלפון ומה שיש לך על המסך זה אותו דבר, אני אומר לו אותו דבר והוא חיבר אותי ואני עושה לו פליי יופי עכשיו אני אחשון פה סיסמה 12345 נעשה verify והנה הוא עוצר לנו בתוך הזה זה נהיה פחות אדום ואני יכול לעבור עם F7 שורה שורה עכשיו תשאלו אותי טוב מה זה עוזר לך שאתה בשפת מכונה איך אתה מבין פה משהו אז אני פה עובר שורה שורה וזה לא אומר לי
הרבה בוא ננסה לנתח את הקוד הזה ניתן לו לרוץ מהר ואנחנו רואים שהסיסמה לא נכונה טוב אז קודם כל הצלחנו עם הדבאגר להיכנס לו לזיכרון ולהציץ לו מה קורה.
איפה אני מציץ? במשתנים פה. זה המשתנים של המעבד, אני יכול להציץ פה. אני יכול להציץ לכל כתובת בזיכרון שאני ארצה.
יש כתובות רגילות, סתם דאמפ, ויש כתובות שמנוהלות בצורה חכמה שנקראת סטאק. אוקיי, אז אני יכול עוד פעם לעשות פה נניח 1, 2, 3, 4, 5, 6, וריפאי, ולעבור פקודה-פקודה ולראות פה דברים משתנים.
אתם רואים פה כל מיני פקודות רצות, תאי זיכרון פה משתנים, הסטאק פה משתנה, זה פקודות בשפת מכונה. רק מה הבעיה? שזה לא באמת עוזר לי. רגע, יש לי פה הודעת שגיאה.
הוא קיבל איזשהו סיגנל 33. אני עושה לו פה תמתין. אני עושה לו אוקיי, תריץ קדימה, לא מעניין אותי הסיגנל הזה. Change exception definition, מה לעשות עם הטעויות?
אני אומר לו, כשמגיעה טעות 21, אל תעצור את התוכנה, ניתן לאפליקציה לטפל בבעיות של עצמה וזהו. כן, אל תעשה לי סאספנד, אוקיי, אוקיי. הוא אומר לי יש גם בעיה 35, אני עושה לו פליי, תמשיך הלאה.
מה קורה עם בעיה הזאת? אל תעצור לי את התוכנה, פסט טו דה אפליקיישן, תודה רבה. עוד אחד, אוקיי, פסט דה אפליקיישן וזהו.
אוקיי, בואו נראה שזה עובד. 1, 2, 3, 4, 5, הנה אנחנו עוצרים בפקודה הראשונה בבר, יכולים לעבור שפת מכונה, לעשות פליי, הוא כותב לי שהקוד לא נכון טוב איך ממשיכים קודם כל הצלחנו עם הדבאגר להתחבר פנימה ולהציץ שזה נהדר מבחינתי רק שזה לא באמת עוזר לי כי אני לא מבין בזה כלום אז אני לוחץ כפתור
F5 שמנסה להפוך את הפונקציה הזאת של בר חזרה לשפת C אולי בשפת C זה יהיה לי יותר ברור כי בכל מקרה השפה הזאת הרבה יותר ברורה מאשר שפת מכונה אני לוחץ F5 ומופיע לי פה קוד בשפת C שזה קוד הרבה הרבה הרבה יותר קריא בוא ננסה לקרוא אותו ולהבין לראות מה אנחנו מבינים ממנו אולי זה יעזור לנו אוקיי אז אני רואה פה שיש לי
פה דברים לא כאלו ברורים למה זה לא כזה ברור לי טוב בוא נתחיל לפענח קודם כל ככה אנחנו רואים שהפונקציה מחזירה פה ברטורן בסוף הפונקציה הזאת מחזירה משתנה ריזולט המשתנה ריזולט מתחיל מאפס ואם מתקיים איזשהו תנאי הוא הופך לאחד יופי אז אני צריך את התנאי הזה אני צריך להבין את האיף הזה ולפענח אותו
עכשיו, האיף הזה נראה לי ממש לא ברור. ולמה הוא כזה לא ברור? קודם כל, כי יש פה בעיה. עאידה לא פירש נכון את הסיפור הזה. יש פה ככה, האיף הזה מורכב מכמה חלקים.
יש פה חלק שמאלי שמושווה ל-23, וחלק ימני שמשווה סטרינג קומפר, שני סטרינגים מושווים. כנראה שפה יושבת התשובה. כי הוא משווה פה את הסטרינג, אבל בשביל שזה יהיה, צריך שיהיה משהו 23.
עכשיו, הדבר הזה לא ברור לי בכלל. וזה למה? כי עאידה פישל. עאידה לא הבין שהמשתנה הראשון ב-GNI זה תמיד משתנה שמצביע לכתובת בזיכרון ששם יושב ה-GNI.
אז אני בא לכאן, מסמן את זה ולוחץ Y, ואומר לו, תקשיב, ה-A1 זה לא סתם מספר שאתה לא יודע מה זה, זה מצביע, כוכבית זה אומר שזה מצביע, למשהו שזה נקרא GNI Environment, למשתנה סביבה של GNI זה מצביע לשם.
למעשה שם יושבת כתובת שמצביעה על GNI. מקווה שבגרסאות הבאות הם ידעו לפענח את זה, בינתיים הם לא יודעים אז אני צריך להגיד לא ידענית, ותראו מה יקרה לשורה הזאת פה למטה.
ברגע שאני עושה את זה, הופה, פתאום היא נהיית ממש ברורה, אתם רואים? דברים פתאום נהיים ברורים.
מה אנחנו מבינים פתאום? פתאום הוא כבר מבין שזאת פונקציה, ולא איזה משהו לא ברור שהיה לפני כן, פונקציה בשם get array length. זה אומר שהוא בודק אורך של input וה input הזה צריך להיות 23, אם input הזה get array length צריך להיות 23 רק אז מתקיימת פקודת string compare אוקיי זה ה-string compare שמעניין אותי מה אני עושה קודם כל זה נהיה הרבה יותר
מובן והמטרה הסופית שלי זה להגיע ל-result שווה 1 כי זה אומר שהצלחתי ואז תצא להודעה נכונה וכדי להגיע לשם אני צריך לעבור דרך string compare הזה אוקיי אז מה אנחנו עושים קודם כל אני רוצה לסנכרן את החלון הזה של c++ עם שפת מכונה אני עושה פה רייט קליק סינכרונאיז וויד פסאודו קוד אתם רואים פה מעל כל חלון כתוב השם שלו אז יש לו פסאודו קוד a זה כאילו קוד כי הוא לא רוצה להתחייב
שזה קוד אמיתי אז הוא עושה פסאודו קוד a אוקיי יופי כשאני לוחץ על כאן הוא ישר מקפיץ אותי לסטרין קומפר הזה שימו לב עוד פעם כשאני אלחץ כאן נניח הוא יקפיץ אותי לפה הם מסונכנים עכשיו אני רוצה את הסטרין קומפר הזה נכון כי סטרין קומפר הזה משווה את הסטרינגים
ואחד מאלו זה הקוד האמיתי אחד מאלו זה מה שהיוזר הכניס השני זה מה שהוא חילץ לא יודע מאיפה הוא הביא אותו אז פה אחד זה שלי אחד זה מה שהקוד הסודי האמיתי הוא משווה ביניהם ואם הכל תקין הוא נכנס לתוך הif ואומר ריזולט אחד שזה בדיוק מה שהייתי רוצה נכון ריזולט אחד ואנחנו רואים פה שזה זז פחות או יותר לפי מה שאנחנו לוחצים לו אוקיי
בקיצור מעניין אותי הסטרינג קומפר כאן הנה זאת הפקודה של סטרינג קומפר כאן, אני לוחץ עליה אדום. אז הפסבדו קוד הזה עזר לי להבין בכלל מה קורה בתוכנית ולמצוא את הסטרינג קומפר הזה שנורא רציתי.
עזרתי לעאידה לפרש את הפונקציות וזה מתחיל להתבאר. טוב, בואו ננסה עכשיו להגיע. זאת אומרת, שמתי פה נקודת עצירה. אני מזכיר לכם, יש לי נקודת עצירה אחת פה בסטרינג קומפר הזה ואני רוצה לגלות בדיוק מה הוא משווה.
ויש לי פה למעלה, בהתחלה של כל הסיפור, נקודת עצירה בואו נראה שזה עובד לנו עושים verify הנה הגענו לשורה ראשונה ואנחנו יכולים לעשות F7 ולעבור שורה שורה ולראות שדברים בזיכרון זזים אנחנו יכולים לראות תאריכים שלהם אני עושה F7 זז תסתכלו איזה יופי אני זז כאן בתוך הקוד אני רואה גם פה שזה זז תסתכלו תסתכלו גם פה
שורות זזות זאת אומרת אני עובר פקודה פקודה בשפת מכונה וזה גם זז לי בתוך השפת C++ בשפת C אני לוחץ על F8, מי שרוצה לדעת על מה אני לוחץ, אני לוחץ על F8 כדי שלא ייכנס לי לתוך פונקציות עזר. אם אני אעשה F7, אם יש לו איזה פונקציית עזר הוא ייכנס לתוכה ויעבור לי שורה שורה,
זה לא מעניין אותי. אני רוצה שפונקציות עזר הוא יריס מהר, אז אני לוחץ לו F8. אז אני לוחץ לו כל הזמן F8. והנה הגענו למה שרציתי. שימו לב איפה אנחנו.
הגענו לאזור שלנו, הנה זה נהיה חם, חם מאוד. הנה ה-Stream Compare שלנו, אנחנו צריכים להגיע אליו ואנחנו פה בשורה הזאת. אוקיי בוא נתחיל לראות F7 מה קרה פה אין לי