PracticU

הסבר על התקפה - buffer overflow

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

הסבר על התקפה - buffer overflow

בשיעור זה אנו מסכמים ומסבירים את כל שרשרת ההתקפה של גלישת חוצץ שנבנתה בשיעורים הקודמים, ברמה מושגית בלבד. אנו מבינים מהי נקודת הכניסה היחידה של התוקף ומהי דריסה חכמה, לומדים את מבנה חוצץ הקליטה מלא והסבר על כל חלקיו, מכירים את הגנת ASLR ואת הדרך לעקוף אותה באופן מושגי באמצעות ספרייה שאינה מוגנת, ורואים בדיבאגר כיצד כל השלבים מתחברים יחד.
נושאי הסיכום המוצגים בשיעור:
1. עיקרון ההתקפה: כל הפעילות מתבצעת דרך שדה קליטה אחד, שדה שם המשתמש בחלון ההתחברות. התוקף מזין בו קלט ענק במקום שם משתמש אמיתי, והמתכנת לא בדק את גודל הקלט, ולכן הנתון נשמר במחסנית וחורג מגבולותיו, דורס את כל הנתונים בדרך ובכלל זה את כתובת החזרה שמגובה בסוף הפונקציה.
2. מתי מתקבלת השליטה: השליטה מתקבלת רק בסיום הפונקציה, כאשר המעבד שולף מהמחסנית את כתובת ההמשך. מכיוון שהכתובת דורסה, הוא שולף לא את הערך המקורי אלא את הכתובת שהתוקף הכניס, ומתחיל לבצע את הפקודות שהתוקף הכניס אל תוך המחסנית, כי המחסנית היא הנקודה היחידה שאליה יש לתוקף כניסה.
3. נקודת כניסה אחת ודריסה מבוקרת: לתוקף אין גישה לקוד התוכנה, הוא נמצא בחוץ ומזין קלט בלבד, ולכן הוא יכול להיכנס רק בנקודה אחת בזיכרון, המקום שאליו המתכנת בחר לשמור את שדה הקלט. משם הוא דורס החוצה, וחייב לדעת במדויק באיזה שלב של הדריסה הוא מגיע לאוגר EIP ולראש המחסנית, ולדרוס בצורה חכמה ומבוקרת ולא סתם מילוי.
4. מבנה חוצץ הקליטה המלא: הקלט הנשלח בנוי מכמה חלקים ברצף. קודם מילוי filler שתפקידו לדרוס את המשתנים המקומיים שהפונקציה שמרה במחסנית בזמן ריצתה, ואחריו החלק החשוב ביותר, המקום שבו הפונקציה גיבתה את כתובת החזרה, אותו דורסים בכתובת שהתוקף בוחר.
5. הגנת ASLR והדרך לעקוף אותה: אי אפשר לכתוב ב-EIP את כתובת המחסנית עצמה, מפני שהגנת ASLR של Windows, שהוצגה לפני יותר מעשור, טוענת את התוכנית בכל פעם לכתובות אחרות ולא ידוע לתוקף איזו כתובת המחסנית תקבל. הפתרון הוא לחפש בזיכרון ספרייה חיצונית שבמעמד ההידור שלה הוגדר שלא להפעיל את ההגנה, ולכן היא נטענת תמיד לאותן כתובות קבועות.
6. הפקודה שמחזירה אל המחסנית: בתוך הספרייה הלא מוגנת הזאת מחפשים פקודה שמקפיצה את המעבד אל הכתובת שבאוגר ESP, ראש המחסנית. כך נמצאת כתובת סטטית שהיא גם קבועה בכל ריצה וגם מבצעת את הקפיצה הרצויה. חשוב לזכור שכתובת כזאת נכתבת בסדר הפוך, לפי ה- Little Endian, כי כך המחשב מאחסן מספרים בזיכרון.
7. מדוע דרך הספרייה ולא ישירות: אפשר היה לשאול למה לא לשתול ב-EIP את פקודת הקפיצה עצמה. התשובה היא ש-EIP הוא תמיד מצביע לכתובת שבה נמצאת הפקודה הבאה, ולא מקום שמכיל פקודה, ולכן חייבים להפנות אותו אל כתובת קיימת שבה יושבת הפקודה הרצויה, ומשם המעבד קופץ חזרה אל ראש המחסנית.
8. ההיסט Offset: אחרי מקום כתובת החזרה ישנם ארבעה בתים שמכילים את הפרמטרים שאיתם הופעלה הפונקציה. בסיום ביצוע הפונקציה היא מנקה אותם מהמחסנית, ולכן בקלט מוכנסים ארבעה בתים מיותרים במקום הזה, שיישלפו וייעלמו בסיום הפונקציה, ורק אחריהם יצביע ראש המחסנית אל האזור הבא.
9. ה-shellcode בסוף החוצץ: אחרי ההיסט נמצא האזור הגדול שנותר מהקצאת הזיכרון, ושם שתול הקוד שרוצים להריץ, שבהקשר ההדגמה הוא קוד שפותח חלון פקודה אליו ניתן לשלוח פקודות מרחוק. כאשר הפונקציה מסיימת, היא מנקה את המילוי, את כתובת ההחזרה המדורסת ואת ההיסט, וראש המחסנית מצביע בדיוק אל תחילת הקוד השתול, ממש כאילו המעבד חזר למקום הרגיל שלו.
10. הקידוד שמסיר תווים אסורים: את הקוד השתול יוצרים בקידוד מיוחד, כעין קובץ כווץ שיודע לפתוח את עצמו בזיכרון ולשחזר את הקוד המקורי. הסיבה היא התווים האסורים: תווים שהשרת מפרש כסיום מחרוזת או סיום תקשורת וקוטעים את העברת הנתונים באמצע, ולכן הקוד מקודד כך שיכיל רק תווים מותרים ויפתח את עצמו בזיכרון.
11. ההדגמה בדיבאגר: בדיבאגר מתחברים אל תהליך השירות שרץ תחת הרשאות מערכת, והופכים להיות הדיבאגר שלו, כך שאחרי כל פקודה הריצה חוזרת אל הדיבאגר. עוצרים את הריצה, קופצים אל הכתובת הסטטית של הספרייה הלא מוגנת, מציבים בה נקודת עצירה, משחררים את הריצה ורואים שהריצה נעצרת בדיוק בנקודה שסומנה, ומשם אפשר להמשיך שורה שורה ולצפות בכל שלבי המעבר אל ראש המחסנית.
בסיום השיעור הבנו את כל שרשרת ההתקפה של גלישת חוצץ ברמה המושגית: נקודת הכניסה היחידה דרך שדה קליטה שאינו בודק גבולות, הדריסה המבוקרת של המשתנים המקומיים ושל כתובת החזרה, עקיפת הגנת ASLR בעזרת ספרייה שאינה מוגנת ובתוכה פקודת קפיצה אל ראש המחסנית, ההיסט של ארבעת הפרמטרים, והקוד השתול שנמצא בדיוק במקום שאליו יצביע ראש המחסנית בסיום הפונקציה, עם קידוד שמסיר את התווים האסורים. תודה רבה, ולהתראות בשיעור הבא.
בשיעור הבא נעסוק בנושא ביצוע בפועל של ההתקפה - buffer overflow.
SR12068HE

פרקי ההרצאה: הסבר על התקפה - buffer overflow

  1. 00:00

    עקרון דריסת הקלט בשדה login

  2. 01:35

    שתילת CMD בזיכרון התוכנה

  3. 03:30

    דריסה מבוקרת של אוגר EIP

  4. 05:22

    מבנה הבאפר וה-filler

  5. 07:16

    כתובת החזרה וה-DLL

  6. 09:07

    הוראת Jump ESP והגנת ASLR

  7. 11:11

    תפקיד ה-Offset במחסנית

  8. 13:04

    הרצה בדיבאגר Immunity

תמלול ההרצאה: הסבר על התקפה - buffer overflow

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

  1. 00:03

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

  2. 00:29

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

  3. 00:45

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

  4. 01:00

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

  5. 01:29

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

  6. 01:50

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

  7. 02:07

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

  8. 02:27

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

  9. 02:42

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

  10. 02:57

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

  11. 03:30

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

  12. 03:58

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

  13. 04:32

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

  14. 05:02

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

  15. 05:18

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

  16. 05:32

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

  17. 05:59

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

  18. 06:25

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

  19. 06:49

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

  20. 07:10

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

  21. 07:25

    זאת הכתובת שאנחנו רוצים שהפונקציה תקפוץ במקום הבעל הבית הקודם, במקום הקוד הראשי שקרה לה. אנחנו רוצים שהיא תעבור לכתובת 83.0C.0.9.10 מה יש בכתובת הזאת?

  22. 07:40

    בכתובת הזאת יושב dll ובתוך ה-dll הזה כתובה פקודה שאני צריך. הפקודה היא jump ל-ESP. זאת אומרת, תקפוץ ותבצע פקודות שיש בתוך ESP.

  23. 07:53

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

  24. 08:02

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

  25. 08:32

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

  26. 08:47

    מה אנחנו נעשה? אנחנו מחפשים כתובת בזיכרון ששייכת ל-DLL חיצוני שאין לו את ההגנה ASLR. ה-Dלל החיצוני הזה, במעמד התכנות שלו, נתנו לו פלאג לא להפעיל את ההגנת ASLR.

  27. 09:05

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

  28. 09:19

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

  29. 09:33

    דרך אגב, הכתובת רשומה בסדר הפוך, כן? זאת אומרת, יש לו סדר כתיבה הפוך ממה שאנחנו רגילים. זה נקרא Little Indian. זאת הכתובת בתוך DLL שה-Dלל הזה לא מוגן עם SLR ובכתובת הזאת תובא פקודה Jump ל-ESP, Jump ל-Stack ובתוך ה-Stack אנחנו נשתול את הקוד הזדוני שלנו, את ה-Shell קוד איפה שהאותיות D נמצאות.

  30. 10:03

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

  31. 10:25

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

  32. 10:53

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

  33. 11:15

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

  34. 11:35

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

  35. 12:00

    של המחסנית ה-ESP מצביע לכתובת של ה-Buffer של ה-D אז אנחנו הבנו איך המבנה של הזיכרון עובד הבנו שאנחנו צריכים לדלג על ארבע בתים שאיתם הפעילו את הפונקציה ואנחנו יודעים שהכתובת הבאה לביצוע אחרי ההקפצה ל-DLL וחזרה ל-ESP ה-Jump ESP ייקח אותנו לכתובת של ה-D, של ה-Buffer

  36. 12:24

    D למעשה איפה שעוד D, שם תהיה הפקודה הראשונה שתתבצע עכשיו היינו צריכים בעצם לעלות על כל זה בשביל לדעת איפה בדיוק לשתול את הקוד הזדוני שלנו עכשיו השאלה כמה מקום יש לנו לעוד D אז יש לנו 1500 פחות כל מה שהיה למעלה וזה מספיק לנו, אנחנו לא צריכים כל כך הרבה מקום

  37. 12:45

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

  38. 13:07

    זה אומר אחרי כל פקודה היא חוזרת אליי. היא עושה פקודה, חוזרת אליי. אליי זה לדבאגר. כרגע הדבאגר, איך שהוא התחבר אליי, הוא העביר אותה לפאוז.

  39. 13:17

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

  40. 13:42

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

  41. 13:56

    למה לא יכולתי לעשות את זה ישר? מסיבה מאוד פשוטה, שאני לא יודע באיזה כתובת יהיה ESP הזה. הפקודה הזאת, Jump ESP, בשפת אסמבלר, שפת מכונה זה FFE4 זה למעשה תקן של x86 זה התקן של שפת מכונה x86 שאומר FFE4 המשמעות של זה ג'אמפ ל-ESP עכשיו תשאלו למה ב-EIP לא שלטלת ישירות את הג'אמפ ESP בשביל מה לך לקפוץ ל-DLL ואז לחזור חזרה כי בתוך ה-EIP אני שותל כתובת אני לא יכול לשתול פקודה אם

  42. 14:33

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

  43. 14:47

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

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

ההרצאה הקודמת: יצירת Payload - Shellcode

ההרצאה הבאה: ביצוע בפועל של ההתקפה - buffer overflow

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

  • התקפה מסוג CSRF - הסבר נוסף
  • הסבר מעמיק על התקפה DNS spoof
  • עצירת התקפה - SOC
  • הצפה של כתובות MAC - התקפה MAC Flooding

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

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