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

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

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

חובה לקרוא – פתרון אתגר protostar|stack4

ניגש לפתרון האתגר:
ראשית, נצפה בקוד המקור שניתן לנו:

View post on imgur.com

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

זיהוי המטרה:

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

שללקוד –  קטע קוד מתומצת המיוצג באמצעות  opcodes(קטע קוד זה מיוצג בhex), מטרת השללקוד היא לשמש לנו כpayload בניצול חולשות מבוססות זיכרון(buffer overflow.)

דרך לפתרון:

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

נשכתב את הRET שנמצא בstack, עם הכתובת שהשללקוד שלנו נמצא. וכך EIP יצביע לשללקוד שלנו, ויגרום לשללקוד לפעול.

תחילה, נמצא שללקוד שיתאים למערכת(debian 32 bit) שלנו. נעשה זאת בעזרת חיפוש קצר בגוגל.

View post on imgur.com

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

View post on imgur.com

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

בשביל להבטיח לשללקוד תהיה גישה "חלקה", נשתמש בNOP SLED, שמורכבת מההוראהNOP(no operation) שמיוצגת כ"\x90" בHEX.

ישנם 2 יתרונות בNOP SLED- הראשונה היא אם הNOP SLED מתחיל בכתובת 0x10, והשללקוד שלנו נמצא ב0x15. אם נשכתב את הRET עם הכתובת 0x10, היא תוביל לשללקוד שלנו מה שיאפשר לנו כניסה חלקה לשללקוד.

השניה היא שהstack הוא דינמי, כלומר הכתובת של הששלקוד שלנו על הstack משתנה כל הרצה של תוכנית. לכן אם הstack יהיה מלא בNOPS, רוב הסיכויים שניפול על כתובת של NOPS שמובילה לשללקוד.

View post on imgur.com

השלב הבא הוא לבדוק היכן הכתובת של הNOPS נמצאת, ולאחר מכן לכתוב את כתובת זו במקום A, שתשכתב את הRET.

View post on imgur.com

לאחר שצפינו היכן הNOPS, נבחר כתובת שתוביל לשללקוד. לדוגמא 0xbffffc90. נכניס אותה במקום הA.

לפניכם האקספלואיט שלנו:

View post on imgur.com

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

וכך פתרנו את האתגר.

 




כתיבת תגובה

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