
הטקסט המלא של הדקות הראשונות בהרצאה «ניתוח סטטי של UnCrackable3 עם IDA» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
שלום לכולם, בהרצאה הזו אני רוצה סוף סוף להגיע לקוד. אתם זוכרים שהצלחנו להתגבר על הגנה של רות? הצלחנו להתגבר על הגנה של פרידייט? הצלחנו להתגבר על הדבאגר?
עכשיו הגיע הזמן לגלות את הסיקרט סטרינג הזה. מהו הסטרינג הסודי שמתחבא פה? בואו ניזכר בשני מילים מה עשינו עד עכשיו. קודם כל כתבנו סקריפט שמבטל את היציאה של סיסטם.אקזיט על ידי זה שאנחנו מתחברים לקלאס ב-Java של סיסטם, ועושים לקלאס הזה סיסטם נקודה אקזיט חדש שלא עושה כלום.
אחרי זה עשינו נייטיב הוקס, שזה אומר נתפסנו לתוך פונקציות של ספריית העזר, של DLL, של ליבררי דינמי, והצלחנו להתגבר על הבעיה שהוא חיפש מילת פרידה בשני דרכים.
הדרך הראשונה, על ידי שהתחברנו, עשינו את touch לפונקציית str str, עשינו interceptor touch לפונקציית str str ותפסנו בכניסה את המילה פרידה וביציאה כתבנו אם הייתה מילת פרידה תעשה ריפלייס לתוצאה.
בואו נעשה את זה קצת יותר יפה שיהיה לנו יותר קריא. אני עושה את זה עם כזה דבר שפשוט יהיה לנו יותר קל לקרוא את זה וכזה דבר בסוף גם, רק בסוף זה הפוך.
יופי. אז זה הפתרון הראשון שעשינו לבעיה של פרידה דטקשן, לא רות דטקשן, read הדטקשן פרובלם זה הפתרון הראשון שעשינו והפתרון השני שעשינו זה על ידי זיהוי והחלפה של str str פה עשינו החלפה שלו בתוך הזיכרון החלפנו את הקוד לקוד חדש ופה התחברנו רק ביציאה והחלפנו תוצאה כשהפונקציה נגמרת פה עשינו החלפה של הקוד ושם עשינו attach לקוד זה
אומר מתחברים בכניסה וביציאה ובreplace מחליפים אותו החלפנו אותו לקוד שלנו כאשר במקרה של פרידה שווה מינוס 1 זה אומר שאין מילת פרידה אז אנחנו קוראים לפונקציה המקורית לזה המקורי אנחנו קוראים עם הערכים שקלטנו מבחוץ אנחנו קוראים לפונקציה המקורית אחרי שהצלחנו בשני דרכים
שונות למצוא את הפרידה דטקשן פרובלם אנחנו הגענו למצב שרצינו לפרוץ את כדי לפרוץ את הדבאגר היינו צריכים להיכנס לתוך הפונקציה לפני שהיא נטענת בזיכרון וזאת הייתה בעיה.
הראינו שהפונקציה שלנו שזה libfoo לא נטענה לנו בזמן שהסקריפט נטען ואם עשינו delay של 100 אלפיות השנייה של עשירית השנייה היא כן נטענה לנו. זאת אומרת המודול שלנו נטען לנו באיחור למה כי הוא צריך להתחיל לבצע את הפקודות של ג'אווה.
הרי אחת הפקודות פה בסוף זה להתין את המודול, אז ברגע שהפקודה הזאת תתבצע נוכל להתין את המודול, אבל בהתחלה לא מבוצעת, בגלל שהיא בהתחלה לא מבוצעת היינו צריכים לחכות מהאלפיות השנייה, וזה לא עוזר לנו, כי בזמן הזה כבר מתחילות להתבצע פקודות אחרות, אז זה לא עוזר לנו, אז עשינו שיטה אחרת.
מה השיטה האחרת? במקום לחכות שכתבנו System Load Library, שכתבנו את הדבר הזה, סיסטם לורד לייברירי נכנסנו לתוך הקוד שלו ועשינו לו אימפלימנטציה חדשה זאת אומרת לקחנו את הסיסטם לורד לייברירי שמקבל סטרינג ועשינו לו קוד חדש ובתוך הקוד שלו עשינו את הטעינה של המודול את זה לקחתי מהאינטרנט ואחרי שהמודול נטען אנחנו ביצענו את הקוד שלנו
מה הקוד שלנו? הקוד שלנו עשה ריפלייס לאנטי דיבאגר איך זיהינו איפה נמצא אנטי דיבאגר? אי אפשר היה לזהות אותו לפי שם בגלל שאי אפשר היה לזהות אותו לפי שם, אז עשיתי דבר כזה, לקחתי את הכתובת הבסיס של כל המודול, הוספתי לו את ה-offset של הספרייה, ואחרי שהייתה לנו כתובת מדויקת, עשינו replace.
ה-offset הזה זה offset של פונקציה 3250. זה הכתובת פה בכתובות פה, הנה 3250, זה בדיוק פונקציית אנטי-דיבאגר. זה מה שהיה עד עכשיו. מה אנחנו רוצים לעשות?
עכשיו אנחנו רוצים לגלות את הקוד, איפה מתחבא הקוד שלנו. אז אנחנו נעשה את זה, Getting the secret code, איך הם קראו לזה?
סטרינג נראה לי, סיקרט סטרינג, יופי. איך אנחנו נעשה את זה? טוב, אנחנו חייבים ללכת לחפש איך זה עובד. זה לא שיש לי תשובות מוכנות. אנחנו נלך פה לפונקציית Verify.
אנחנו רואים פה ב-Verify, כשיש Success, יש לפני כן צ'ק קוד. באים, right-click, Go to declaration, לראות מה זה ה-check code הזה.
אנחנו רואים שה-check code הזה, שמקבל איזשהו סטרינג מהיוזר, שולח את זה לפונקציית בר עם אותו סטרינג. מה זה פונקציית בר? עושים right-click, Go to declaration, ומגיעים שפונקציית בר כאן, באותו קובץ, היא native. מה זה אומר?
native שיושבת בתוך dll. אוקיי, בואו נלך ל-dll, יש לנו פה את ה-dll שלנו. פתוח שזה dllipfoo.so. פונקציה, איך היא נקראת?
פונקציה שנקראת בר. בואו נחפש אותה, היא צריכה להיות באקספורטס פה היא צריכה להיות פונקציית בר והנה פונקציית בר שלנו אנחנו צריכים להבין מה זה הפונקציה הזאת איך היא פועלת ואיך מחלצים משם את הקוד דבר ראשון אני רואה שזה לא קלט שזה gni שזה קשור לג'אווה אז אני אעשה לו את זה ידנית מה לעשות שהוא לא קלט את זה אני אעשה פה ctrl c יבוא לכאן
אני אני אלחץ אותו y ובמקום אינטג'ר אני אגיד לו שזה ושימו לב שזה פוינטר למבנה מסוג gna environment ושימו לב מה יקרה כאן כשהוא יקלוט שזה זה תסתכלו פה הופה נהיה הכל ברור יופי ומה זה אחרון האחרון זה בעצם הuser input בוא נעשה rename user input שהגיע אליי מג'אווה הדבר השני זה גם משהו שקשור לgna עצמו אז
זה הuser input זה בדיוק מה שמעבירה לי ג'אווה כאן אתם רואים מערך של בתים הסוגריים הזה הדבר הזה זה בדיוק זה יופי בואו ננסה להבין מה קורה פה אני רואה פה שיש הכרזת משתנים אחרי זה מה זה 14u בוא נראה את זה בדצימלי 20 לא יודע איזשהו מספר מקבל 20
די וורד 6038 שווה שווה 2 אין לי מושג מאיפה זה הגיע אז נרשום איזשהו צ'ק רינם איזשהו צ'ק צ'ק ביט בוא נראה מה זה הצ'ק הזה לא לא בטוח שזה ביט אבל בסדר בוא נראה מה זה הצ'ק הזה איך אני בודק אני עושה איקס ומסתכל מי קורא לו מאיפה הוא הגיע אני רואה שהוא הגיע פה משלושה מקומות מבר מעינית ומעוד איזושהי פונקציה מה הקשר לעינית
הנה צ'ק ביט פלוס פלוס אז למעשה בודקים פה שהעינית הזה הופעל זאת אומרת כשהעינית הזה מופעל הצ'ק ביט הזה מקודם באחד ואז ככה בודקים שהפונקציה הזאת התבצעה ולא החלפנו אותה כאילו מישהו פה ניסה להקשות עלינו לראות שאם אני מעיף את כל העינית הזה, ה-check beat הזה לא יעלה ב-1, וברגע שהוא לא יעלה ב-1,
אנחנו לא ניכנס פה להשוואה, זה מעין security beat כזה, security check. בואו נראה גם מה זה זה. הנה, ויש לנו פה גם פונקציה של, מה זה הפונקציה הזאת?
זה מוכר לי, ה-3080. אה, זה פרידה מוניטור. טוב, אני מחליף לזה שם, אני לוחץ right-click-n. ראינו את זה, זה פרידה מוניטור.
זה זה שמזהה האם הפרידה מופעל או לא. פרידה מוניטור, אתם זוכרים זה זה? אוקיי, אז יש לנו פרידה מוניטור. הפונקציה הזאת של פרידה מוניטור גם מקדמת את הצ'קביט ב-1.
אוקיי, הצ'קביט הזה בא לבדוק שגם פרידה מוניטור הצליח. בואו נעשה לזה rename, פרידה מוניטור צ'קר, עינית, זה שמפעיל את הפרידה מוניטור.
פרידה מוניטור עינית גם מקדם אותו ב-1, אז הוא צריך להתקדם פעם אחת מפרידה מוניטור ופעם שנייה מעינית. בואו נראה עוד פעם. אתם רואים, פרידה מוניטור צריך לקדם אותו ב-1, איני צריך לקדם אותו ב-1, ואז בבר אנחנו בודקים שהוא באמת שווה ל-2.
אז נקרא לזה בשם חדש, לחצתי עוד N, All Security Security Checker, Security Check Counter. סופר כמה מנגנוני אבטחה הופעלו, Security Check Counter.
ה-Security Check Counter הזה מקודם פעם אחת בתוך פרידה מוניטור, אתם רואים כשהפרידה מוניטור הופעל, ופעם שנייה security checker הזה מופעל כשיש לנו פה אינית שהאינית עבר כמו שצריך, בקיצור דוחפים אותו בכל מקום שחשבו שאנחנו ננסה לפרוץ או לאפס אותו ואז לפני שבודקים את הקוד לפני שהבר הזה בודק הוא בודק שכל אמצעי האבטחה במקום רק אז הוא מתחיל לעבוד בוא ננסה לראות
מה הוא עושה הוא מפעיל פה איזושהי פונקציה שמקבלת v9 מה זה ה v9 הזה אין לי מושג אוקיי, נחזור לזה, GetElementByArray, פה,