פתירת אתגר protostar | stack1!

פתירת אתגר protostar | stack1!

הכנה:

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

הבא נקרא את קוד המקור שקיבלנו:

שימו לב לכך שהערך char buffer[64];, מוגבל ל64 בייטים.
המשמעות לכך שהוא יכול להחזיק עד 64 בייטים.
ושימו לב לפונקציה strcpy(buffer, argv[1]);.
שבעצם מעתיקה את argv[1], לתוך buffer.
מכיוון, שאין לנו אמצעי מניעה שלא יגרום לנו להכניס פחות או עד 64 בייטים שbuffer יכול להחזיק.
נוכל להכניס יותר מ64 בייטים לbuffer.
אך מה יקרה אם נמלא את buffer, יותר מ64 בייטים?
מכיוון, שהשטח של buffer בזיכרון מוגבל ל64 בייטים.
מה שיקרה אם נעבור את הגבול של ה64 בייטים הוא: שנגלוש לכתובות אחרות בstack, ונוכל לכתוב ערכים שונים שנמצאים שם ומאוחסנים אחריו.
מכיוון, שהמטרה שלנו באתגר היא לכתוב את modified שיהיה שווה ל0x61626364.
נצטרך, להכניס יותר מ64 בייטים בשביל להגיע לכתובת של הערך modified שממוקם אחרי buffer. בשביל לשכתב את modified, לכתובת הרצויה.
לדוגמא אם נרצה לכתוב את modified עם האות B ארבע פעמים.
תחילה נכניס את התוכנה לדיבאגגר בשם gdb, כדי שיהיה לנו יותר נוח לעוד איתו ואוכל להראות לכם כיצד השינוי בstack חל.
אכניס לתוכנה את הפקודה:

לאחר מכן נסתכל מה קורה בstack.

מכיוון שהstack, מוצג לנו כhex אז 41 = A ו42 =B.
אנו רואים שמילאנו מספר כתובות בstack ששיכות לbuffer. ולאחר 64 A, אנו מגיעים לכתובת של הערך modified ויכולים לשכתב אותו. ולאחר 64 A מגיע ה4 B ושם modified שוכתב.
וההודעה שקיבלנו היא:

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

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

כתיבת תגובה

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