PracticU

מציאת כתובת סטטית להרצת קוד מתוך ה-STACK

בלי כתוביותעם כתוביות
PracticU › קורס סייבר למתחילים - Hacking - בדיקות חוסן תשתיתי ופריצה ל-Windows 10/11 - קורס זה נדרש למבחן ההסמכה היוקרתי OSCP › מציאת כתובת סטטית להרצת קוד מתוך ה-STACK
מילון מושגים:
מעבד - יחידת העיבוד המרכזית של המחשב, שמבצעת את הפקודות של התוכניות ומנהלת את החישובים.
מחרוזת - סוג נתונים שמייצג רצף של תווים, כלומר טקסט, ומשמש לאחסון מילים, משפטים או כל רצף סימנים.
HTTP - פרוטוקול להעברת דפי אינטרנט ונתונים בין דפדפן לשרת. הגרסה המאובטחת שלו היא HTTPS.
זיכרון - רכיב מהיר ונדיף שבו המחשב שומר נתונים ותוכניות בזמן ריצתם. תוכנו נמחק עם כיבוי המחשב.
DLL - קובץ ספרייה ב-Windows המכיל קוד ופונקציות שתוכנות שונות יכולות לטעון ולהשתמש בהן במשותף.
ספרייה - אוסף קוד מוכן, כמו פונקציות ומחלקות, שמפתחים משתמשים בו בתוכניותיהם במקום לכתוב הכול מחדש.

מציאת כתובת סטטית להרצת קוד מתוך ה-STACK

בשיעור זה אנו ממשיכים את סדרת ההרצאות על חולשת גלישת חוצץ, ברמה מושגית בלבד. אנו נזכרים בהישגי השיעורים הקודמים, מבינים מדוע דרושה כתובת סטטית ויציבה כדי שהמעבד יקפוץ אל ראש המחסנית בכל ריצה, לומדים כיצד מאתרים מודול שאינו מוגן במנגנוני האקראות של מערכת ההפעלה ואינו מכיל תווים אסורים בכתובתו, ורואים כיצד מאמתים בדיבאגר שהמעבר אל ראש המחסנית אכן מתבצע.
נושאי הסיכום המוצגים בשיעור:
1. נקודת הפתיחה: עד כה בסדרה בנינו כלי בדיקה שמזרים נתונים ליישום המטרה, למדנו לשלוט באוגר EIP שמצביע על ההוראה הבאה לביצוע באמצעות תו מזהה ידוע, וזיהינו והסרנו את כל התווים האסורים שמקטעים את העברת הנתונים, כמו תווים שמשמעותם סיום מחרוזת או סיום בקשת HTTP.
2. מטרת השיעור: המטרה היא לגרום ל-EIP להצביע על המקום בזיכרון שבו נמצא ראש המחסנית, שם בשיעורים הבאים יוצב התוכן שרוצים להריץ. הדרך המקובלת היא להיעזר בהוראת אסמבלר שמשמעותה קפיצה אל האוגר ESP, אוגר ראש המחסנית.
3. מדוע אין להזין כתובת ESP ישירות: לא ניתן פשוט לכתוב ב-EIP את הכתובת שבה נמצא ראש המחסנית, מפני שהכתובת הזאת משתנה בכל ריצה של היישום. דרושה כתובת שהיא סטטית וקבועה בכל הרצה, שאינה מכילה תווים אסורים, ושאינה נתונה למנגנוני הגנה של מערכת ההפעלה כמו אקראות פריסת כתובות ASLR או מניעת הרצת נתונים DEP, שנועדו דווקא למנוע מצבים כאלה.
4. מאגר המודולים בדיבאגר: בכלי הניתוח אפשר לצפות בכל המודולים שנטענו עם היישום, כולל ספריות ה-DLL של מערכת ההפעלה שהיישום משתמש בהן. לכל מודול מוצגות כתובת הבסיס שממנה הוא מתחיל, כתובת הסוף והגודל, ודגלים שמציינים אילו מנגנוני הגנה מופעלים עבורו.
5. סינון מודולים לפי הגנות: מחפשים מודול שכל דגלי ההגנה שלו כבויים, כי מודול שההגנות מופעלות בו אינו מתאים לצורך ההדגמה. במקביל בודקים את כתובת הבסיס: אם היא מתחילה בבתים אפסים אין זה מתאים, כי האפסים הם תווים אסורים, אך אפסים בתוך הכתובת אינם בעיה כי הם אינם בתחילתה.
6. המודול שנבחר: נמצא מודול ספרייה של מערכת ההפעלה שכל דגלי ההגנה שלו כבויים וכתובת הבסיס שלו אינה מתחילה באפסים, ולכן הוא מתאים לחיפוש. בתוך המודול הזה יש לאתר הוראת אסמבלר של קפיצה אל ESP.
7. איתור ההוראה הרצויה: את ערך הבתים של הוראת הקפיצה מקבלים מכלי עזר בצד לינוקס שממיר שם הוראה לבתים שלה, ומצמצמים את החיפוש כך שיתבצע רק בתוך המודול שנבחר. החיפוש מוצא כתובת אחת ויחידה שבה יושבת ההוראה, כתובת סטטית ויציבה שאין בה תווים אסורים, ובזכות זאת בכל ריצה של היישום ידוע לאן בדיוק להפנות את ה-EIP.
8. אימות בדיבאגר: בעזרת פקודת מעבר לכתובת בדיבאגר מגיעים למקום שבו יושבת הוראת הקפיצה ומציבים בו נקודת עצירה. מריצים מחדש את סביבת הבדיקה, מחברים את כלי הניתוח ושולחים את דפוס הבדיקה המעודכן, ורואים שהריצה נעצרת בדיוק בנקודה שסומנה, כאשר ה-EIP מצביע על הכתובת הסטטית שאותרנו.
9. הקפיצה אל ראש המחסנית: בהמשך צעד אחד מראה שהמעבד מבצע את הוראת הקפיצה ומגיע אל ראש המחסנית, המקום שבו בשיעורים הקודמים הוצבו תווי מילוי לבדיקה. בהרצאה הבאה במקום תווי המילוי יוצב תוכן אמיתי, וכך יושלם המעבר משליטה ב-EIP אל הרצת תוכן מהמחסנית.
בסיום השיעור הבנו מדוע דרושה כתובת סטטית להפניית המעבד אל ראש המחסנית, למדנו לסנן את מאגר המודולים לפי מנגנוני ההגנה ASLR ו-DEP ולפי תווים אסורים בכתובת הבסיס, איתרנו בתוך המודול המתאים כתובת סטטית של הוראת קפיצה אל ESP, ואימתנו בדיבאגר שה-EIP מגיע אליה ומשם קופץ אל ראש המחסנית. תודה רבה, ולהתראות בשיעור הבא.
בשיעור הבא נעסוק בנושא יצירת Payload - Shellcode.
SR12066HE

פרקי ההרצאה: מציאת כתובת סטטית להרצת קוד מתוך ה-STACK

  1. 00:00

    חזרה על שליטה באוגר EIP

  2. 01:16

    עקרון ה-Jump ESP

  3. 02:07

    הצורך בכתובת סטטית

  4. 03:02

    בדיקת מודולים שנטענו

  5. 03:57

    בדיקת הגנות ASLR במודול

  6. 04:53

    הימנעות מכתובות עם bad characters

  7. 05:50

    בחירת מודול מתאים

  8. 06:52

    חיפוש ההוראה עם הכלי msf

תמלול ההרצאה: מציאת כתובת סטטית להרצת קוד מתוך ה-STACK

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

  1. 00:03

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

  2. 00:22

    שימו לב, בו הצלחנו לשלוט על ה-EAB באמצעות התו שה-X הדצימאלי שלו זה 42. לאחר מכן גם התפטרנו מכל התווים הרעים שיכולים להזיק לנו לבאפר, שמבצעים כל מיני טרמינט, מסיימים את הסטרינג שלנו בגלל שהמשמעות שלהם זה לסיים העתקה של קוד ב־C של התווים של הסטרינג ב־C,

  3. 00:49

    או פוסט ריקווסט של ה־HTTP שהוא גם סוג של טרמינט. הצלחנו להעיף את כולם ולהגיע למצב שאנחנו יכולים להריץ את הבאפר שלנו ושהוא יישלח כולו אל המטרה.

  4. 01:03

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

  5. 01:20

    אנחנו יכולים למנף פה משהו שנקרא Jump ESP. Jump ESP זאת הוראה באסמבלר שכל משמעותה זה לקפוץ אל ה-ESP. ראינו שב-ESP שלנו אנחנו יכולים להכניס לשם את השייל קוד.

  6. 01:36

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

  7. 01:49

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

  8. 02:00

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

  9. 02:14

    אנחנו צריכים למצוא כתובת שהיא סטטית, שהיא לא משתנה ושאין בה תווים רעים, bad characters, ושהיא לא מוגנת בכל מיני טקשן של randomize או ASLR או DEP, זה כל מיני מנגנונים במערכת ההפעלה שבאים ומנסים למנוע מצב של buffer overflow על ידי נתינה כתובות פנדומליות.

  10. 02:37

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

  11. 03:02

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

  12. 03:23

    הכתובת בסייז יש לי פה את הבייס אדרס ואת הטופ אדרס שהמודולים האלה יכולים להשתמש בהם את הגודל של המודול יש לי פה כל מיני דגלים למשל כמו asr אוסף seh שאמורים לבוא מנסות למנוע את ה-Buffer Overflow.

  13. 03:44

    ה-eSLR זה מנגנון בווינדוס, יחסית ווינדוס 7 זה התחיל שבא ומנסה למנוע את ההתקפות של Buffer Overflow. אז אם אני רואה פה טרום, זה אומר שאני לא יכול לבצע את ההתקפה, אבל אראה פה את ה-Sync Breeze הזה, אני רואה שהכל פה False,

  14. 04:01

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

  15. 04:26

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

  16. 04:55

    כן, כן, ה-0, 0 הראשונים, כמו שאתם זוכרים, זה נקרא bad character, תווים רעים, כן, שאמורים, אני זוכר נכון, את ההעתקה של ה-string ב-C, כן, היו שם כמה תווים רעים, איזה 49 תווים שהיינו צריכים להסיר אותם מהבאפר שלנו, כן, שימו, יש את הסרטון הזה שאני מראה איך כל פעם אני מריץ את התוכנה,

  17. 05:19

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

  18. 05:33

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

  19. 05:57

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

  20. 06:12

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

  21. 06:33

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

  22. 06:52

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

לקורס המלא: קורס סייבר למתחילים אונליין

ההרצאה הקודמת: איתור תווים פסולים - Bad Characters

ההרצאה הבאה: יצירת Payload - Shellcode

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

  • Swarm - Stack
  • תיעוד של קוד
  • הגדרת Stack ב-Flutter
  • Tasks and Back Stack

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

  • קורס SOC - מיישם הגנת סייבר
  • קורס פריצה ומבדקי חדירה לתשתית ארגונית - בדיקות חוסן מתקדמות ל-Active Directory - קורס זה נדרש למבחן ההסמכה היוקרתי OSCP
  • קורס פריצה ומבדקי חדירה לאתרי אינטרנט - בדיקות חוסן לאתרים - Web Pentesting - קורס זה נדרש למבחן ההסמכה היוקרתי OSCP
  • קורס סייבר והאקינג ל-Android - פריצה לטלפונים ואפליקציות אנדרואיד - בודק חוסן - Mobile App Pentesting