buffer overflow

sarshalom

New member
buffer overflow

שלום,אני קורא מאמר לגבי buffer overflow כדי ללמוד את הנושא. במאמר מתואר קטע הקוד הבא:
char buffer[4028]; void main() { int i; for(i=0;i<2024;i++) buffer='A'; {

דוגמה זו מורצת על מערכת לינוקס. לאחר הידור הוא בודק את ערכי האוגרים ע"י (gdb) info all-registers ומקבל כי האוגר ebp מחזיק את הערך 0x41414141 שזה הערך ההקסאדצימלי של הערך האסקי של 'A'. ושאלתי היא,מדוע בכלל האוגרים מחזיקים את תוכן ה-buffer? מדוע תוכן ה-buffer לא ממופה לזיכרון הפיסי בלבד,או שהוא כן אך כך גם האוגרים.
 

DecayCell

New member
אני מניח שמדובר במערכת x86

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

cyberia2ooo

New member
לא מדוייק

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