buffer overrun

mmuse

New member
buffer overrun

היי, התחלתי ללמוד על הנושא, וראיתי דוגמא. כתוב שהמחסנית שלי אמורה להשתנות, אבל היא לא... למה? הנה התוכנית שהרצתי:
#include <stdio.h> #include <string.h> void foo(const char* input) { static char buf[10]; printf ("My stack looks like:\n%p\n%p\n%p\n%p\n%p\n%p\n\n"); strcpy(buf, input); printf("%s\n", buf); printf ("Now the stack look like:\n%p\n%p\n%p\n%p\n%p\n%p\n\n"); } void bar () { printf ("Augh! I've been acked!\n"); } int main(int argc, char* argv[]) { printf("Address of foo = %p\n", foo); printf("Address of bar = %p\n", bar); if(argc != 2) { // to keep it from being optimized away bar(); } else { foo(argv[1]); } return 0; }​
תודה !
 

vinney

Well-known member
המם... זה מאוד תלוי בקומפיילר לדעתי

אבל עקרונית static הופך את המשתנה לגלובלי מבחינת ניהול זכרון.... אם תוריד את הstatic, אני חושב שתוכל לראות שינויים.
 

mmuse

New member
הורדתי

האמת שמלכתחילה לא היה static ועדיין תמונת המחסנית לא השתנתה. אני משתמש ב ++visual c על XP, יכול להיות שזה קשור?
 

vinney

Well-known member
שיחקתי בזה עכשיו

שמתי לב שהSTACK הרבה יותר עמוק מ6*גודל מצביע, שאתה מדפיס. משתנה שהיה אצלי תקוע איזה 80 בית בתוך הSTACK, והוא בהחלט השתנה. לודע למה, זה המשחקים של הקומפיילר. לדעתי אתה לא יכול להסתמך על כאלה דברים, ולא כדאי לך לגשת למחסנית ישירות.
 

mmuse

New member
תודה ! ../images/Emo13.gif

הצלחתי בינתיים לנסות משהו קצת דומה ולהריץ פונק' שהייתה קיימת בקוד אבל לא הייתה שום קריאה אליה - והכל בעזרת הכנסת קלט לתוכנית !!!
 

mmuse

New member
ועכשיו שאלה על - Heap Overrun

הסתכלתי על דוג' שב writing secure code 2, בדף 140. הם הכניסו שם למחרוזת כתובת שאמורה להיות:
"the location of the point in the stack where the return address for BadFunc function is kept"​
למה הכוונה? איך אני מוצא את כתובת החזרה מפונק', מה שזה לא יהיה? צירפתי את הקוד של התוכנית. תודה.
 

mmuse

New member
האמת...

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

vinney

Well-known member
כדאי מאוד שתעבוד עם הקומפיילר שלהם

הדברים האלה מאוד תלויים במימוש בקומפיילרים. למה אתה צריך לעשות heap overrun? אתה לא מתעסק עם פריצות ותולעים במקרה?
 

mmuse

New member
לא ממש...

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