𝗟 𝗲 𝗮 𝗿 𝗻 𝗘 𝘅 𝗽 𝗹 𝗼 𝗶 𝘁
𝗥 𝗬 𝗦 𝗢 𝗡
اول از همه شما باید 6 بخش اصلی رم رو بشناسید ، حالا زیرمجموعه هاشو توضیح بدم طولانی میشه ولی کاری که هر بخش انجام میده رو خیلی ساده میگم
بخش کد برنامه Text Segment چیه وقتی برنامه تبدیل به صفر و یک میشه همون کد ماشین و باینری این کد ها باید جایی تو RAM قرار بگیرن تا CPU اونارو اجرا کنه پس سیستمعامل اونارو تو یه بخش ثابت از RAM میزاره و کارش خلاصه اینه که CPU از اینجا دستور میخونه و این بخش تنها بخش قابل اجرا است حالا این برنامه ای که میگیم چیه یه سری دستوره که به گوشی و کامپیوتر میگه چه کاری انجام بده مثل برو جلو و برگرد عقب و عددها رو جمع کن و متن چاپ کن و رنگ صفحه رو عوض کن و .... این دستورها باید توسط CPU اجرا بشن حالا این بخش سه چهار تا گذینه داره که رید اونلی دیتا رو بدونید بد نیست ، بخش Read-Only Data همون چیز های ثابته مثلا : GAME OVER یا Version 1.0 اینها قرار نیست تغییر کنن پس سیستم میزارشون تو بخشی که فقط قابل خوندنه مثل نوشتن یک متن با خودکار روی یک کاغذ که پاک نمیشه ، حالا توی برنامه ها و بازی ها همینه ، همیشه توی همشون متن هایی تعریف شدن که قرار نیست تغییر کنن
حالا Data Segment چیه ببین یه بخش از حافظه ی برنامست که مخصوص متغیرهای global و static ساخته میشه ، متغیرهای global / static اگه برنامهای داشته باشی که یه عدد همیشه نگه داشته بشه مثلا تعداد امتیاز = ۰ یا اسم کاربر = "Ali" اینها باید از اول تا آخر کار برنامه زنده بمونن و پویا باشن پس سیستمعامل اینها رو در بخشی ذخیره میکند که همیشه موجوده
حالا دیتا سگمنت دو تا بخش داره:
بخش Initialized Data برای متغیرهایی که مقدار اولیه دارن
و بخش BSS که برای متغیرهایی که مقدار اولیه ندارن در اصل سیستم خودش صفرشون میکنه
حالا هیپ چیه ؟ ، هیپ ناحیهای از حافظست برای دادههایی که طول عمرشون و اندازشون معلوم نیست میخواد بمونه یا نه مثلا وقتی توی اینستا یه عکس باز میکنی اندازهاش معلوم نیست و بزرگه و عکسا دائم میان و میرن پس باید توی یه جای بزرگی ذخیره بشن که اونم هیپه ، و داده هایی که بین بخشهای مختلف برنامه به اشتراک گذاشته میشن و اینم بگیم که اختصاص و ازادسازی حافظه روی هیپ دستی انجام میشه و هیپ انعطافپذیره و بزرگتر از استکه، ولی کندتر و مستعد fragmentation و memory leak هست و عمر داده مستقل از فراخونی توابعه
استک چیه ؟ استک حافظه ایه که به ازای هر فراخوانی تابع استفاده میشه و هر بار که تابع صدا زده میشه، یک Stack Frame ساخته میشه که شامل متغیرهای محلی و پارامترها و ادرس بازگشت میشه ، و وقتی وقتی تابع تموم میشه، کل فریم یکجا آزاد و پاک میشه ، و مدیریتش کاملا خودکاره، خیلی سریع و اندازهاش محدوده و بهصورت LIFO رشد و جمع میشه و معمولا به سمت ادرس های پایینتر رشد میکنه خیلی ساده برات بگم استک جای دادههای کوچک و موقتیه مثل جمع دو عدد توی توابع یه بازی اینها فقط در لحظه استفاده میشن و چند میلیثانیه بعد پاک میشن پس میرن روی استک یه فضای سریع و کوچیک ،
بخش Memory-mapped Area
که همون ناحیه ی map شدست و این بخش جاییه که برنامه میتونه فایلها یا منابع خارجی رو مستقیم به حافظه خودش وصل کنه و به زبون ساده فرض کن یه فایل داری مثلا یه عکس یا کتابخونه ی سیستمی ، به جای اینکه کلش رو بخونی و توی RAM کپی کنی، سیستم عامل میگه که اقا باشه، من این فایل رو مثل یه تیکه از حافظه بهت نشون میدم و این کار باعث میشه برنامه خیلی سریع تر و بهینه تر به دادهها دسترسی داشته باشه
بخش فضای کرنل ، Kernel Space
این بخش مخصوص خود سیستم عامله، نه برنامه ها و ساده بگم سیستمعامل همون کرنل باید کنترل کامل روی سختافزار و مدیریت حافظه داشته باشه برای همین یه بخش جدا از حافظه داره که فقط خودش میتونه بهش دسترسی داشته باشه و برنامههای معمولی نمیتونن مستقیم وارد کرنل اسپیس بشن، چون خطرناکه و ممکنه کل سیستم کرش کنه حالا چرا جزو ۶ بخش حافظست ولی از رم جداست ؟ چون برای سیستم عامل کرنل هست و برنامه های مثل هیپ نمیتونن بهش دسترسی داشته باشن
اگر حافظه بندی تلگرام رو مثل بزنیم میتونیم بگیمتوی پارت بعدی میریم سراغ مفاهیم ، اصطلاح ها ، انواع حمله و ....
کدهای خود تلگرام میشه قسمتی از Text
کتابخونه های libwebp و libjpeg میشن جزوی از Memory-mapped
چتها و نامها و ... جزوی از Data/Heap هستن و عکسهایی که باز میشه از بخش Heap هست و متغیرهای موقت داخل توابع تلگرام جزوی از Stack هستن
@LearnExploit
@MR_RYSON
#LearnExploit
#RYSON
#shell
#RAM
#RAM_overflow
❤3
𝗟 𝗲 𝗮 𝗿 𝗻 𝗘 𝘅 𝗽 𝗹 𝗼 𝗶 𝘁
𝗥 𝗬 𝗦 𝗢 𝗡
Part 3
رسیدیم به پارت سه اینجا باید با اصطلاحایی که مربوط به آدرس ها و حملات و نوع حمله و ... آشنا بشید و معنی هاشون رو بدونید
بریم سراغ بافر
بافر یا Buffer یعنی یه فضای موقت تو حافظه که برنامه برای ذخیره داده ازش استفاده میکنه مثلا وقتی یک رشته string وارد برنامه میکنی، برنامه اون رو داخل یه بافر ذخیره میکنه ،
حالا اورفلو یعنی چی ، یعنی سرریز کردن ، زیاد شدن ، بیش از حد شدن ، بیرون ریختن داده
ببین حالا Buffer Overflow چیه اینجوری بگم که وقتی دادهای که وارد بافر میکنی بیشتر از ظرفیتش باشه باعث میشه که داده از بافر سرریز کنه و وارد بخشهای دیگه ی حافظه بشه اقا مثل اینکه بافر مثل یه لیوانه و داده زیاد همون آب اضافست وقتی بریزی سرریز میشه و این سرریز میتونه دادههای دیگر برنامه یا حتی جریان اجرای برنامه رو خراب کنه پس بافراور فلو یعنی سرریز شدن داده و بیشتر شدنش از اون حافظه ای که براش تعیین شده یه مثال بزنم از بافر اورفلوحالا ما دو نوع اورفلو داریم که در زیرتمومش رو توضیخ میدیم
مثلا یه بافر ده بایتی داریم مثلا :
[A][B][C][D][E][F][G][H][I][J]
اگر 30 بایت داخلش بریزیم
[A][B][C][D][E][F][G][H][I][J][X][X][X][X]و...
این ۲۰ بایت اضافه وارد بخشای دیگه ی RAM میشه، مثل متغیرهای دیگر یا حتی ادرس های استک این همون سرریز دیتا توی حافظه ی رمه،،
1 : Buffer Overflow
* : Stack Buffer Overflow
همونطور که از اسمش معلومه روی Stack اتفاق میوفته جایی که متغیرهای محلی و پارامترهای تابع ذخیره میشن حالا دقیقا چه اتفاقی میوفته ؟ ببین وقتی دادهای بیشتر از اندازهی بافر مثلا آرایه ، روی استک نوشته بشه، دادههای اضافی میتونن روی بخشهای دیگهی استک مثل آدرس برگشت تابع که در ادامه میگیمش ، بریزن و وقتی ریخته شد ما میتونیم مسیر اجرای برنامه رو تغییر بدیم مثلا مسیر اجرای کد مخرب اگر هم بخوام براتون مثال بزنم این کد سی رو نگاه کن
char buf[10];
gets(buf); همینجا اگه بیشتر از ده تا کاراکتر وارد بشه باعث بافر اورفلو میشه
* : Heap Buffer Overflow
این حمله هم روی Heap اتفاق میوفته جایی که حافظهی دینامیک با malloc/new گرفته میشه و وقتی دادهای بیشتر از اندازهی حافظهی تعیین شده نوشته بشه، دادههای اضافی میتونن روی بخشهای دیگهی Heap یا Metadata بریزن و باعث خراب شدن ساختار مدیریت حافظه یا دسترسی به دادههای دیگه میشه کد C زیر رو نگاه کن
char *buf = malloc(10);
strcpy(buf, "خب اگر نگاه کنی میفهمی که اینجا این رشته خیلی طولانیه"); که در نهایت باعث بافر اورفلو میشه
* Global / Static Overflow
این نوع بافر اورفلو روی Data Segment اتفاق میوفته جایی که متغیرهای global و static ذخیره میشن حالا اگه داده ای بیشتر از اندازهی تعریفشده برای متغیر global/static نوشته بشه، میتونه روی دادههای دیگه تو Data Segment که قبلا توضیح دادیم بریزه و باعث تغییر دادههای مهم برنامه یا ایجاد رفتار غیرمنتظره مثل
static char msg[5] = "ry";
strcpy(msg, "Ryson"); اینجا باعث بافر اورفلو روی بخش استاتیک میشه
* : Off-by-One Overflow
ببین وقتی برنامهنویس به اشتباه یه واحد بیشتر یا کمتر از اندازهی واقعی آرایه یا بافر استفاده کنه بهش Off-by-One میگن که در واقع یه خطای مرزی به نام Boundary Error هست که این خطا میتونه باعث بشه حتی فقط ی بایت خارج از محدوده نوشته بشه و همین یک بایت اضافه میتونه دادههای مجاور رو خراب کنه این نوع خطا معمولا روی Stack یا Heap اتفاق میوفته چون بافرها اغلب اونجا ذخیره میشن به این صورت :
char buf[10];
for (int i = 0; i <= 10; i++) {
buf[i] = 'A';
}
اینجا اشتباهه
چون اندیسهای مجاز این بافر از 0 تا 9 هستن
و شرط حلقه باید کمتر از اندازهی واقعی بافر باشه
@LearnExploit
@MR_RYSON
#LearnExploit
#RYSON
#shell
#RAM
#RAM_overflow
❤2🔥1
𝗟 𝗲 𝗮 𝗿 𝗻 𝗘 𝘅 𝗽 𝗹 𝗼 𝗶 𝘁
𝗥 𝗬 𝗦 𝗢 𝗡
رسیدیم به نوع دوم و اخر اورفلو
2 : Arithmetic Overflow
اریتیمتیک اورفلو به سرریز شدن تو عملیات های ریاضی گفته میشه مثل جمع، تفریق، ضرب و .... وقتی نتیجه ی یه محاسبه از محدوده ای که نوع داده میتونه نگه داره بیشتر یا کمتر بشه ، اریتیمتیک اورفلو اتفاق میوفته ، این نوع اورفلو میتونه روی متغیرهای عددی signed یا unsigned هم رخ بده و توی متغیرهای unsigned
وقتی مقدار از حداکثر یا حداقل رد میشه عدد به صورت wrap around برمیگرده اما توی متغیرهای signed اریتیمتیک اورفلو میتونه باعث رفتار نامشخص یا Undefined Behavior بشه و حالا این نوع اورفلو علاوه بر اینکه باعث محاسبات اشتباه میشه میتونه تو محاسبه ی اندازهی بافر، offset یا تعداد تکرار حلقهها و ... باعث ایجاد بافر اورفلو یا آسیبپذیریهای دیگه بشه مثلا
unsigned int x = 4000000000;
x = x + 10;
که نتیجهی محاسبه از محدودهی نوع داده خارج شده
و باعث اریتیمتیک اورفلو میشه
حالا اریتیمتیک اورفلو یه نوع اصلی داره اونم اینتجر اورفلو هست که :
* Integer Overflow
خب اینتجر اورفلو زیرمجموعه ی اریتیمتیک اورفلو که مربوط به سرریز عددی هست اما بافراورفلو مربوط به سرریز بافر هست
این هم دو نوع داره که :
نوع اول Signed Integer Overflow که مربوط به سرریز اعداد علامتداره
ولی نوع دوم Unsigned Integer Overflow مربوط به سرریز اعداد بدون علامت یا wrap around هست و یه نکته داره اینه که علاوه بر سرریز عددی میتونه باعث بافر اورفلو هم بشه این نوع توی عملیات ریاضی روی متغیرهای عددی اجرا میشه که وقتی نتیجه ی محاسبه بزرگتر از محدودهی نوع داده باشه، مقدار به اصلاح میپیچه که بهش میگن wrap around که در نهایت میتونه باعث محاسبات اشتباه یا حتی اسیبپذیری بشه مثلا تو محاسبه ی اندازهی بافر برای این هم مثال بزنیم که قابل فهم تر باشه
unsigned char x = 255;
x = x + 1; که مساوی صفر میشه و نتیجش اورفلو شدنه
@LearnExploit
@MR_RYSON
#LearnExploit
#RYSON
#shell
#RAM
#RAM_overflow
❤1⚡1🔥1
این سه تا باگ و خطا رو ببینید که میتونن به حملات تبدیل بشن ، که بعدش بریم سراغ اینکه که دقیقا چه اتفاقی میوفته بعد از اجرای شل کد
Format String Bug
ببین وقتی رشتهی فرمت مثل printf, scanf و ...به صورت مستقیم از ورودی کاربر گرفته بشه این اتفاق میوفته و توی Stack هست چون پارامترهای تابع روی استک ذخیره میشن و میتونیم با %x, %n و ... دادههای حافظه رو بخونیم یا تغییر بدیم مثل
char input[100];
gets(input);
printf(input);
اینجا الان داستانه چون باید
printf("%s", input)
باشه
Use-After-Free
مخففش میشه UAF و وقتی برنامه بعد از آزاد کردن حافظه free دوباره از اون اشارهگر استفاده کنه اتفاق میوفته توی Heap هم هست چون حافظهی دینامیک اونجا مدیریت میشه و میتونه دادههای قدیمی یا دادههای جدید برنامههای دیگه رو بخونه و بنویسه مثل :
char *p = malloc(10);
free(p);
strcpy(p, "RYSON");
اینجا هم مشکله استفاده بعد از ازادسازی هستش
Double Free
وقتی یه اشارهگر دوبار آزاد بشه همون free به وجود میاد این هم توی Heap هست و باعث میشه که ساختار مدیریت حافظه خراب بشه و میتونه باعثه اجرای شل کد بشه مثل
char *p = malloc(10);
free(p);
free(p);
اینجا دوباره آزاد شده
اینا همشون همگی جزو Memory Safety Bugs هستن یعنی باگ هایی که باعث میشن برنامه خارج از محدودهی امن حافظه کار بکنه
به صورت کلی این ها :
Stack Buffer Overflow
Heap Buffer Overflow
Integer Overflow
Off-by-One
Global / Static Overflow
Format String Bug
Use-After-Free
Double Free
بیشتر هیپ و استک رو خراب میکنن
@LearnExploit
@MR_RYSON
#LearnExploit
#RYSON
#shell
#RAM
#RAM_overflow
❤🔥2❤1
𝗟 𝗲 𝗮 𝗿 𝗻 𝗘 𝘅 𝗽 𝗹 𝗼 𝗶 𝘁
𝗥 𝗬 𝗦 𝗢 𝗡
Underflow
اینم بگم بعد میریم سراغ شل کده
اورفلو رو گفتیم میریم سراغ اندرفلو
قبلا گفتیم اورفلو یعنی داده بیش از ظرفیت وارد میشود و به جلو سرریز میکنه ولی اندرفلو دقیقا برعکسشه حالا یعنی چی ؟ ببین توی اندرفلو داده یا اشارهگر کمتر از حد انتظار میشه و به عقب حرکت میکنه و برمیگرده حالا توی هر دو حالت هم اور هم اندر دسترسی به بخشهای مختلف حافظه رو داریم ولی اور یکم شناخته شده تره
مثل اورفلو ما چند نوع اندرفلو داریم که خیلی سریع و خلاصه بهتون میگم :
1 : Buffer Underflow
وقتیه که برنامه انتظار داره داده ای توی بافر باشه اما کمتر از اون رو میگیره و دریافت میکنه خوندن از قبل بافر باعث دسترسی به حافظهی خارج از محدوده میشه
2 : Integer Underflow
وقتی یه عدد صحیح مثلا unsigned int کمتر از صفر بشه و به مقدار خیلی بزرگ تبدیل بشه انتجر اندرفلو اتفاق میوفته و این میتونه باعث تخصیص حافظه ی اشتباه یا محاسبات نادرست و اشتباه بشه
3 : Stack Underflow
برای وقتیه که از Stack داده ای برداشته میشه در حالی که چیزی توی اون وجود نداره و میتونه باعث دسترسی به ادرس های محدود شده بشه یا باعث بازنویسی داده های کنترلی بشه
4 : Heap Underflow
این وقتی اتفاق میوفته که اشارهگر یا عملیات روی Heap به عقب حرکت بکنه و برگرده و دادههای متادیتا یا بلوکهای دیگر را تغییر بده و این تغییر میتونه باعث نوشتن یا خوندن توی ادرس های دلخواهمون بشه
البته میتونیم بگیم دقیقا مثل اورفلو میمونه هیپ و استک هم زیرمجموعه ی بافراورفلو هستن اینم بگم هم از اورفلو هم اندرفلو انواع خیلی بیشتری داریم ولی اینا معروف ترین و اصلی ترینشونه
@LearnExploit
@MR_RYSON
#LearnExploit
#RYSON
#shell
#RAM
#RAM_overflow
❤1👍1👏1
𝗟 𝗲 𝗮 𝗿 𝗻 𝗘 𝘅 𝗽 𝗹 𝗼 𝗶 𝘁
𝗥 𝗬 𝗦 𝗢 𝗡
END PART RAM & SHELLCODE
ببین شل کد بعد از انجام اورفلو میاد سراغ اوررایت کردن
حالا اوررایت چیه
ببین اور رایت همون overwrite یعنی رونویسی ، بازنویسی
یعنی روی stack میاد باعث اوررایت شدن Return Address و Frame Pointer میشه و توی هیپ باعث اوررایت شدن Function Pointer و vtable و Heap Metadata میشه ، حالا اینا چین ؟ بیا تا توضیح بدم
1 : Stack :
* Return Address
توی استک یه داریم Return Address که اسمش روشه ، ادرسیه که بعد از تموم شدن یه تابع، CPU باید بهش برگرده حالا اگه عوض بشه برنامه به جای دلخواه میپره که میاد به سمت شل کد ما
* Frame Pointer2 : Heap
فریم پوینتر یا همون Base Pointer اینم دوباره توی استک هست و به صورت کلی اشارهگر به ابتدای Stack Frame تابع هستش و با خراب شدنش باعث دسترسی اشتباه به متغیرها میشه و بعضی وقتا مسیر رسیدن به Return Address هستش
و اما Function Pointer چیه ببین این میتونه توی Heap / Global / Stack و این سه تا باشه و متغیریه که ادرس یه تابع رو نگه میداره و اگر مقدارش عوض بشه تابع دلخواه صدا زده میشه و توی callback ها و struct ها خیلی رایجه
vtable
وی تیبل یا vtable مخفف Virtual Table و توی هیپ توی سی پلاس پلاسه و میتونیم بگیم جدولی از ادرس متدهای virtual یک کلاسه حالا اگه pointer به vtable عوض بشه ، متد جعلی اجرا میشه و هدف اصلی Heap Overflow هاست
رسیدیم به Heap Metadata که داخل Heap کنار بلوکهاست و هیپ متادیتا همون اطلاعات مدیریتی حافظه مثل size, next, prev, flags و .. هست و خراب کردنش میتونه باعث کنترل malloc/free بشه و مسیر رسیدن به Function Pointer و Arbitrary Write هستحالا هک با شل کد چجوری اتفاق میوفته ؟
ببین شل کد کلاسیک از اون همه بخش های فقط بخش هیپ و استک و شاید هم متغیر های استاتیک و گلوبال رو مورد هدف قرار بده حالا چجوری،
خیلی خیلی خلاصه بگم شل کد بعد از اینکه یه جایی از حافظه مثل استک یا هیپ باگ داشت اجرا بشه اورفلو انجام باعث سرریز شدن بافر میشه حالا بزار اینجا دقیق تر باشیم اگر کد رو جوری بنویسیم که داده طوری باشه که بعد از سرریز کردن آدرسی که توی داده اضافی نوشته بودیم بریزه روی Return Address یا و.. باعث اوررایت شدنش میشه بزار اینجوری بگم :
[Buffer: 32 bytes][Saved EBP][Return Address]
این رو فرض کن ، الان
این 32 بایت رو کسشر مینویسیم یه چیز بیمعنی فقط و فقط برای پر کردن بافر 4 بایت هم برای بازنویسی EBP میتونیم بزنیم که اختیاریه بزنی بهتره و 4 بایت هم ادرس شل کد مثلا 0xDEADBEEF و وقتی CPU دستور RET رو اجرا میکنه به جای برگشت به تابع اصلی، میپره به 0xDEADBEEF مثال کد واقعیش به این صورته :
section .text
global _start
_start:
sub esp, 32
push ebp
mov ebp, esp
mov dword [ebp + 4], 0xDEADBEEF
xor eax, eax
push eax
push 0x68732f2f
push 0x6e69622f
mov ebx, esp
mov ecx, eax
mov edx, eax
mov al, 11
int 0x80
xor eax, eax
inc eax
xor ebx, ebx
int 0x80
یا مثلا فرض کن یه تابعی یک بافر 32 بایتی داره حالا اگه ما 64 بایت بفرستیم بایتهای 33 تا 36 دقیقا روی Return Address و بقیه چیزا مثل Function Pointer و .... مینشینن مثل بالا که گفتم این چند بایت رو طوری انتخاب میکنیم که برابر با ادرس محل شلکد توی حافظه باشن وقتی تابع تموم بشه و CPU بخواد به ادرس ذخیرهشده برگرده، به جای ادرس اصلی، به محل شلکد میره همین ، توی اندرفلو هم به این صورته که باعث میشه داده های قبل از بافر یا بلوک حافظه بازنویسی و اوررایت بشن حالا ممکنه که یا Return Address، Frame Pointer، Function Pointer یا vtable تغییر بکنه
یه بار مرور میکنیم ، شل کد میره روی تارگت ، اول اورفلو یا اندرفلو میزنه تا داده بک بزنه یا سرریز کنه به بقیه ، و باعث تغییر آدرس ها مثل Return Address، Frame Pointer، Function Pointer, vtable میشه و باعث میشه به جای آدرس اصلی ، به آدرس شل کد بره و باعث اجرای شل بشه
تموم ،،،
حالا شل کد کلاسیک خیلی وقته با ASLR و Stack canary و DEP / NX bit جلوش گرفته شده و منسوخ شده که اینا هم راه بای پس و دوز زدن دارن ولی حملات جدید تر مثل
mprotectاومده و جاشونو گرفته که بعدا مقاله هاشونو مینویسیم ،
VirtualProtect
ret2libc
ROP
JOP
Logic bugs
تشکر که تا پایان این اموزش همراهی کردین و میدونم که مقاله سنگین بود ،
𝗥 𝗬 𝗦 𝗢 𝗡
@LearnExploit
@MR_RYSON
#LearnExploit
#RYSON
#shell
#RAM
#RAM_overflow
❤1👍1