פתרון אתגר protostar|stack4

פתרון אתגר protostar|stack4

הכנה:

אפתור היום את אתגרי protostar, שהם אתגרי אקספלואיטציה בינארית בלינוקס.
סדרת אתגרים זו נמצאת באתר:exploit-exercises.com, שמציג שלל אתגרים באקספלואיטציה בינארית. חוץ מאתגרי protostar.
בשביל לפתור את האתגר, נדרש מכם להוריד מכונה וירטואלית של האתגר ולהתקין אותה.
מומלץ לקרוא לפני קריאת פוסט זה, את הפוסטים הקודמים בקטוגוריית protostar.
ניגש לפתרון האתגר:
ראשית, נצפה בקוד המקור שניתן לנו:

View post on imgur.com

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

זיהוי המטרה:

אנו מבינים שהמטרה שלנו היא להשתמש בפירצה שזיהנו, ולגרום לתוכנה להפעיל את הפונקציה win.

דרך לפתרון:

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

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

אוגרים: האוגרים הם יחידות זכרון בני 32 ביט כל אחת היושבות במעבד ומבצעות את כל עבודות החישוב. להרחבה על אוגרים – https://he.wikibooks.org/wiki/%D7%90%D7%A1%D7%9E%D7%91%D7%9C%D7%99_x86/%D7%94%D7%90%D7%95%D7%92%D7%A8%D7%99%D7%9D

האוגר IP\EIP: מצביע על הפקודה הבאה לביצוע. אי אפשר לדרוס אותו.

הRET: שולף מהstack את כתובת החזרה וחוזר מהפונקציה, לפקודה הבאה לביצוע(משנה את EIP מהכתובת של ביצוע הפונקציה, לכתובת של הפקודה הבאה).

RET ממוקם בstack, וניתן לשכתב אותו.

כך נראה המבנה של הstack, בקריאה לפונקציה main בתוכנה שלנו:

View post on imgur.com

נחזור לפתרון:

כיוון, שאנו יכולים לשכתב כתובות שונות שנמצאות בstack. אנו יכולים בנוסף לשכתב את RET, וכך נשנה את EIP לכתובת של הפונקציה win.

וכתוצאה מכך שEIP, יצביע לכתובת של הפונקציה win. הפונקציה win תפעל.

ראשית, נמצא כעבור כמה בייטים נשכתב את RET.

ניתן פקודה לתוכנה, שתכניס 76 בייטים שיוצגו כאות A ו4 בייטים שיוצגו כאות B. משום שRET מכיל 4 בייטים, נוכל לזהות היכן RET נמצא. אם הכתובת של EIP(שתשתנה בהתאם למה שRET שווה) תהיה שווה לBBBB, נדע שאנו משכתבים את RET לאחר 76 בייטים.

הכתובות בstack יהיו מוצגות כHEX. כך ש B = 42 ו- A =41.

View post on imgur.com

לאחר שאימתנו כי אכן, לאחר 76 בייטים אנו משכתבים את RET. נצטרך למצוא את הכתובת של הפונקציה win, ולשכתב את RET איתה.

בעזרת הפקודה nm stack4, נגלה היכן הכתובת של הפונקציה win נמצאת.

View post on imgur.com

לאחר שגילינו את הכתובת של win, נכין את האקספלואיט שלנו. שיהיה מורכב מ76 בייטים, ולאחר מכן הכתובת של win שאיתה נשכתב את RET.

האקספלואיט:

View post on imgur.com

קיבלנו את הודעת ההצלחה ופתרנו את האתגר.

מקווה שנהנתם, אפק.

 




One thought on “פתרון אתגר protostar|stack4

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *