15-12-2007, 01:02
|
|
|
חבר מתאריך: 19.10.07
הודעות: 65
|
|
Stack smashing protection.
שלום,
אני מנסה לבצע Buffer overflow על תוכנה מסויים, וזה מזהיר שיש העמסה במחסנית.
אמור לעלות seg fault אבל זה לא קורה.
הסיבה היחידה שיש היא הStack smashing protection מופעל, והשאלה שלי היא איך להוריד אותו?
מה שקורה בפועל זה דבר כזה -
כתבתי תוכנית פגיעה:
קוד:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
char str[20];
if(argc < 2) { printf("Usage: %s string", argv[0]); exit(1); }
strcpy(str, argv[1]);
printf("You entered: %s", str);
return 0;
}
עכשיו,
כשאני מריץ את זה אני מקבל:
קוד:
*** stack smashing detected ***: ./bof terminated
You entered : (כל הA שכתבתי)Aborted (core dumped)
כשאני מוסיף עוד מספר מסויים של A מופיע הדבר הבא:
קוד:
Segmentation fault (core dumped)
אח"כ כשאני מריץ עם run עם כל הA, בgdb, מה שקורה זה לפעמים זה:
קוד:
Program received signal SIGABRT, Aborted.
0xffffe410 in __kernel_vsyscall ()
ולפעמים זה:
קוד:
Program received signal SIGSEGV, Segmentation fault.
0xb7e49d5f in getenv () from /lib/tls/i686/cmov/libc.so.6
קוד:
(gdb) info reg eip
eip 0xb7dd3d5f 0xb7dd3d5f <getenv+159>
(gdb) info reg ebp
ebp 0xbfda7618 0xbfda7618
אין 0x414141, ההקס של A לא בeip ולא בebp.
שימו לב שהeip משתנה בהתאם לשגיאה, הכוונה לקטע של ה<159+getenv>- לפעמים כתוב getenv ולפעמים kernel ואני לא בטוח אם המספר קבוע.
כנראה זה מספר הA או משהו בסגנון :S
כעיקרון,
מה שאני מנסה זה לעשות overwrite, "כמו כל BOF ממוצע" ( :O), על הeip אבל הstack smashing protection חוסם אותי.
הייתי יכול להחליף את הקרנל של הלינוקס ולהוריד את האבטחה שם, אבל זה סיפור.
יש איזשהי פקודה מסויימת לבטל את זה?
תודה לכולם!
נערך לאחרונה ע"י eXeCuTeR+ בתאריך 15-12-2007 בשעה 01:08.
|