Buffer Overflow and scanf

shirbi

New member
Buffer Overflow and scanf

כידוע ב scanf יש בעיה של Buffer Overflow - אם מבקשים ממנה לקלוט ערך לתוך כתובת של משתנה מסוג מערך של char, אז אם המשתמש יכניס יותר תווים מהגודל של המערך, אז הם יכנסו לכתובות שנמצאות מעבר למערך (ב VS6 זה יוצא לתוך המשתנים שהוצהרו לפני המערך). האם הסכנה קיימת גם כאן קולטים משתנה יחיד באמצעות x% או d%? אם כן, כיצד אפשר לנצל אותה? ליתר דיוק יש לי תוכנית כזאת:
int a; int x = ... scanf("%x",&a); ... printf("%x",a);​
ואני רוצה להכניס קלט ל scanf כך שיודפס הערך של x. האם יש דרך לעשות זאת? תודה מראש.
 

vinney

Well-known member
כן, זה קיים

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

shirbi

New member
רגע, אז לקליטת מספרים שלמים

ולא מחרוזות, ניתן להשתמש ב scanf או שגם שם היא לא בטוחה?
 

vinney

Well-known member
היא בטוחה אם אתה משתמש בה נכון.

גם למחרוזות, אם אתה מגביל את גודל הקלט.
 

shirbi

New member
אני מעוניין דווקא במקרה הספציפי הזה

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

vinney

Well-known member
לא, למה שזה לא יהיה בסדר?

scanf יודעת מה הגדלים של כל סוגי המשתנים, אם אתה מעביר בפרמטרים מצביע למשתנה מהסוג המתאים למה שיש בformat string - אין סיכוי לstack corruption, אם, לעומת זאת אתה מבלבל טיפוסים - התוצאות לא צפויות, אבל זה באג של מתכנת, לא ניצול של פרצה בscanf.
 

shirbi

New member
רגע, במקרה של s%'

יש דרך להגן עליה? לדוגמה, הכרזת על מערך בגודל 100 תווים ונתת אותו כקלט ל scanf. האם יש לך דרך למנוע מהמשתמש להכניס יותר מ 100 תווים?
 

shirbi

New member
יש קישור?

פשוט אם הבנתי נכון את המרצה שלי, אי אפשר להשתמש ב scanf בצורה בטוחה בשימוש ב s%.
 

shirbi

New member
אתה מתכוון לאופציה הזאת?

scanf("%10s",buffer);​
נראה שזה באמת פותר את הבעיה.
 

shirbi

New member
אז יש איזשהו שימוש בטוח ל s%

בלי שימוש במספר שמגביל את מספר התווים?
 

vinney

Well-known member
אז איך אפשר לקפוץ מגג של קומה 100

בלי מצנח ולא להתרסק?
 

shirbi

New member
אם יש למטה טרמפולינה חזקה?

אם אי אפשר לעשות בזה שימוש בטוח, אז למה זה קיים?
 

vinney

Well-known member
אפשר לעשות שימוש בטוח

שימוש נכון בscanf בטוח לחלוטין, בניגוד לכמה פונקציות אחרות בספריה הסטנרטית, שעדיין קיימות. לעשות קלט עם s% בלי הגבלת קלט - זה לא שימוש נכון והוא מועד לפורענות.
 
למעלה