
הטקסט המלא של הדקות הראשונות בהרצאה «התקפה buffer overflow - אוגר EIP» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אנחנו ממשיכים עם ההתקפה של ה-Buffer Overflow. לאחר שבנינו את הפאזר שבאמצעותו גרמנו לאפליקציה SyncPrize לקרוס, וראינו שיש לנו פוטנציאל לתקיפה, אנחנו רוצים להמשיך ולנסות לשכפל את התקיפה, כאשר עכשיו במקום לשלוח את כל ה-2,000 תווים, נשלח רק 800. קריסה קורית בין 700 ל-800.
החלון השמאלי העליון מראה לי פה את הפקודות בשפת אסמבלר, כן, שפת מכונה. רק את הדברים האלה המעבד מבין. כן, שפת אסמבלי, בסוף זה מתורגם ל-0 ו-1.
כן, אתם רואים, יש פה מוב, יש פה אינס, יש פה קול, כן, קריאה לפונקציה. וזה החלון השמאלי העליון, קוד באסמבלי. החלון הימני העליון זה הרגיסטרים, האוגרים.
פה אני יכול לראות את הרגיסטרים ברגע שאני אריץ את ה-Immunity, כן, ברגע שאני מבצע ה-Touch ל-Immunity, כן, ברגע שאני עושה פה ה-Touch, אתם רואים הסיניק פריז באדום, זה אומר שהוא כבר ב-Touch, אז מה שקורה זה שהאפליקציה עוצרת, כן, שימו לב בפאוס.
ואם אני רוצה להמשיך את הריצה שלה, אני צריך ללחוץ על F9. אוקיי, כרגע האפליקציה רצה. בסדר? אז פה אנחנו נראה את הרגיסטרים, פה, החלון הזה הימני התחתון, אנחנו נראה את הסטאק, כן, את המחסנית עצמה, מה שדיברנו בהקדמה, ופה זה הדאמפ, כן, פה אנחנו נראה את כל ה-X הדצימלי, כן,
שהאפליקציה, אם אנחנו רוצים למצוא סטרינג למשל בתוך הקוד, אני יכול לבצע פה חיפוש, כן, לסטרינג, לסרצ' פור, ואני יכול למצוא ביינר סטרינג, זה מחולק לשלוש עמודות, העמודה הכי שמאלית זה הכתובת של תא הזיכרון, פה זה ה-X הדאמפ, כן,
הייצוג ה-X הנצימאלי, ופה זה הייצוג האסקי, כן, שזה קצת יותר מוכר לנו, גם מהווייר שארק. פה אני יכול לראות ממש את התווים ולנסות לעשות חיפוש בסטרינגים.
זה המידע שהם מכילים מהכתובות הזיכרון. אז בואו נשכפל את הקריסה, אז ניכנס לקאלי לינוקס. אוקיי, ויש לי פה כבר סקריפט, סינק פריז 01. אם אני אפתח אותו אני אראה שבמקום אלפיים שהיה לי מקודם היה לי פה לולה בווייל שעוברת כל פעם שולחת 100 ואז עוד 100 זה כבר 200 ואז עוד 100 300 וראינו שמתוך האלפיים
זה קורס בין 700 ל-800 אז אני רוצה כרגע לשלוח ישר בבת אחת במכה אחת 800a ואז אני אראה את האפליקציה קורסת בואו נבדוק את זה פה יש לי את הבקשה העצמה כן יש לי פה את הבאפר שכרגע אני לא צריך להגדיל אותו אני יודע בדיוק שהגודל שלו הוא בסקריפט הקודם שראינו עם הלולת while, בואו תראו אותו,
זה הפאזר שלנו. פה הצענו לולה כי לא ידענו באמת מתי היא תקרוס, כמה תווים. לקחנו ריזיקה של 2000, ואחרי 800 זה קרס, ופה בוופר כל פעם הוספנו 100. כרגע אני לא צריך את זה, מה שאני עושה, אני שולח ישר 800. אז
בואו נשים פה את הקציה, אורר, כן, יש לי פה את הווימוור, וכרגע שימו לב, הוא ב-F9, כלומר הוא בריצה, ואני אשלח את הקריפט הזה, אני אפעיל אותו.
מה שיקרה, אני אשלח בבת אחת את כל ה-800, בואו תראו איך זה קורס מיד. עושה את זה, עושה ככה, וככה. בואו נלחץ פה על Enter, ונעבור לפה מהר, והנה הקריסה, כן? הקריסה קרתה ממש בשנייה אחת, כי בבת אחת שלחנו 800 תווים, אז ראינו את הקריסה, סנדינג, ומודיע שהודענו.
אז הצלחנו לשחזר את הקריסה, אבל עדיין יש לנו בעיה, אנחנו לא יודעים איפה בדיוק זה קרס, כן, שימו לב פה, אני רואה שה-EIP שלי, כן, שלחנו שמונה מוטבים, והצלחנו לגרום להשתלט על ההוראה הבאה, שהיא 41 באקסה, זה הטב A, כן, באסקי, ארבע פעמים A,
הצלחנו לשלוט על ה-EIP, אבל אין לנו מושג איפה בדיוק, כן, בין ה-700 ל-800, איפה בדיוק, אנחנו צריכים לדעת בדיוק כמה תווים בדיוק לשלוח, ואז, אני לא אקדים את המאוחר, בסרטים הבאים נבין למה זה הכרחי.
המספר המדויק, כי אנחנו כרגע שולטים פה על תאים בזיכרון, ואני אהיה חייב לדעת את התא המדויק, כי אם אני רוצה, בואו, כבר התחלנו לדבר על זה, אז נגיד, אם אני לא רוצה ש-EIP יהיה A, כן, אני רוצה ש-EIP תהיה איזו הוראה של להפעיל קוד זדוני מסוים, או לקפוץ, לבצע איזה ג'אמפ לקוד זדוני שנמצא בכתובת זיכרון כזאת וכזאת,
וכרגע זה לא טוב לי אם אני לא יודע בדיוק, כן? אני צריך שה-EIP שלי, שהשלב הבא בתוכנית יפעיל את הקוד הזדוני שלי, וככה אני אדע לנצל את החולשה.
לכן אני חייב בדיוק להבין איפה מתוך ה-800 תווים של ה-A, איזה בדיוק תווים אלה, איזה מספר הם במערך, אם זה 710 עד 714 או שזה 792 עד 796, אני צריך לדעת בדיוק כי אני צריך לשלוט על AP ברמה של להכניס פה משהו זדוני או לקפוץ לטאב הזיכרון אחר שהוא משהו זדוני, אז אני יכול לעשות דבר כזה.
קודם כל, לפני הכל, אני צריך לטעון את הסינפריז מחדש כי אחרי קריסה יש פה Access Violation, אני חייב לטעון אותו מחדש, יש פה את הסרוויס, נבצע סטארט ו-Immunity דיבאגר, אני מריץ אותו כאדמיניסטרטור, כן? כי זה רץ בהרשאות סיסטם ואם לא נריץ באדמיניסטרטור לא נראה את ה-SyncBreeze,
כן? אני מתכוון שלא נראה את ה-SyncBreeze פה ב-Attach. אז אני כרגע מציע טאץ' ל-SyncBreeze וזכרו, ברגע שעושים הטאץ', התוכנה הוא מביא את התוכנה ל-Immunity, כן?
הוא מריץ את הקוד בתוך ה-immunity אבל הוא בפאוז. ואם אני רוצה להגיד לתוכנה לרוץ, אני אומר F9. F9 עכשיו זה כביכול, יש לי את הפייג' הזה של הלוגין והוא מחכה שיכניסו לו שם וסיסמה.
כן, במקרה שלנו, כן, כל אפליקציה ומה שהיא מבצעת. אז אני רוצה להבין מה נופל על ה-EIP מכל המחוזת הארוכה. אז יש דרך שאפשר לעשות את זה, זה ליצור סטרינג שכל אות בסטרינג לא חוזרת על עצמה, שכל תו לא חוזר על עצמו.
אז בזכות זה שנבצע סטרינג שכל תו שם הוא ייחודי, אנחנו נוכל להבין, ברגע שנראה את ההוראה הבאה, את הארבעה תווים הבאים, נוכל להבין את המיקום של התווים, של הארבעה תווים האלה של ה-AP בתוך ה-800 תווים שאנחנו הולכים כרגע ליצור.
אז אני כרגע עובר ל-Kali Linux, בקאלי לינוקס יש כלי שנקרא msf-pattern-create, נקרא msf-pattern, יש קריאט, קריאט זה כרגע ליצור את הסטרינג, את המחרוזת הארוכה הזאת, כן, מה שהתפקיד שלו, של ה-msf-pattern-create, הכלי הזה זה ליצור מחרוזת עם תווים שלא חוזרים על עצמם,
בסדר? כי אם יש לי תווים שחוזרים על עצמם כמו ה-aaa הארוך, זה לא נותן לי כלום, כי אני לא יודע מה התווים הייחודיים שנפלו על ה-eap.
ניצור כרגע מינוס L, כן, זה האורך של המחרוזת. 800, אני רוצה 800 תווים כי הקריסה הייתה בין 700 ל-800, זכרו?
ומקודם שכפלנו את הקריסה אבל עם 800, אנחנו לא יודעים איפה זה בין 700 ל-800. כרגע אני מבקש 800 תווים ואני לוחץ על Enter. שימו לב, 800 תווים שאף תו לא חוזר על עצמו ברצף, כן, זאת הכוונה, שהוא לא חוזר על עצמו ברצף.
למשל פה ה-a חוזר על עצמו אבל לא ברצף וככה אני אוכל לראות איזה בדיוק רצף של תווים נופלים לי על ה-eip שזה ההוראה הבאה שהקוד אמור לבצע.
מה שאני עושה עכשיו אני רוצה להחליף אני רוצה להכניס לעדכן את הסקריפט שלי עם ה-800 תווים האלה כן אני למעשה מעתיק את כל התווים האלה עושה קופי כן אני כבר עשיתי את זה מקודם.
פותח את הליפפד ואני רוצה לראות את הטינק בריז 0.2. שימו לב שפה באינפוט באפר זה האינפוט זכרו שאנחנו מבצעים את הלוגין שמשתמש כלשהו וסיסמה שהיא האורך של כל התווים האלה זאת למעשה המחרוזת הארוכה כן אני עדיין שולח 800 תווים אבל לא תווים דומים כן לא את ה-800 פעמים תו a אלא אני שולח מותבים שהם ייחודיים.
אז עדכנו את הסקריפט שלנו, ואני מזכיר שהבאנו את הסינקבריז למצב של הפעלה, ועכשיו נשלח את הסקריפט הזה ונראה על מה EIP יצביע לנו.
ננקה מסך, סינקבריז 02, זה הסקריפט המעודכן עם השמונה מותבים שיצרנו עם ה-MSF create pattern.
אני לא יכול להראות פה מסך מול מסך, אז בואו נריץ את זה ונעבור כרגע כאן, שימו לב התוכנה קרסה access violation when executing כן כי הוא חרג מגבולות הבאפר שלו מגבולות הזיכרון ושימו לב eip מצביע על הכתובת הזאת כן זה הייצוג ב-x הדצימאלי 42 30 61 42 זה הייצוג ה-x הדצימאלי אני רוצה לראות את הייצוג של