Buffer Overflow چیست؟ یک راهنمای عملی
با یک مثال واقعی در C، نمودار stack و ابزارهایی برای مشاهده مستقیم، یاد بگیرید که buffer overflowها چگونه کار میکنند.
یک buffer overflow زمانی رخ میدهد که برنامهای مقدار دادهای بیشتر از ظرفیت را در یک بلوک메모ری با اندازه ثابت بنویسد. بایتهای اضافی به حافظه مجاور ریزش میکنند، و بسته به اینکه چه چیزی کنار آن buffer قرار دارد، میتوانید متغیرها را خراب کنید، برنامه را خراب کنید، یا جریان اجرا را کاملاً کنترل کنید. این یکی از قدیمیترین کلاسهای باگ در امنیت نرمافزار است و همچنان در CTFها، CVEها و firmwareهای embedded امروز ظاهر میشود.
الگوی آسیبپذیر
اینجا یک مثال کلاسیک در C است:
#include <string.h>
void greet(char *name) {
char buffer[64];
strcpy(buffer, name);
}
int main(int argc, char **argv) {
greet(argv[1]);
return 0;
}
strcpy هر رشتهای را که به آن بدهید در buffer کپی میکند، بدون هیچ بررسی محدود. اگر argv[1] بیشتر از 64 بایت باشد، کپی کردن فراتر از انتهای آرایه ادامه مییابد. در stack، buffer زیر سایر متغیرهای محلی، رجیسترهای ذخیرهشده و در نهایت آدرس بازگشتی که به CPU میگوید بعد از پایان greet() به کجا بپرد، قرار دارد. آن آدرس بازگشتی را با آدرسی که کنترل میکنید بازنویسی کنید، و شما کنترل میکنید چه چیزی بعدی اجرا شود.
چرا این هنوز compile و اجرا میشود
C و C++ بررسی مرزی خودکار را در آرایههای raw انجام نمیدهند. توابعی مانند strcpy، gets، sprintf و strcat با خوشحالی فراتر از انتهای buffer مینویسند زیرا فقط به یک null terminator یا طول منبع اهمیت میدهند، نه اندازه واقعی مقصد. این را با strncpy یا snprintf مقایسه کنید، که یک آرگومان اندازه صریح میگیرند و در آنجا متوقف میشوند. آسیبپذیری واقعاً
با کمک هوش مصنوعی نوشتهشده، بازبینی و منتشرشده توسط Michal Pilch (CISSP)، Korra Studio.
این یکی از یادداشتهای پایگاه دانش Korra Studio است — پلتفرم هر موضوع را با مربی یکبهیک جفت میکند.
شروع رایگانarrow_forward