X
تبلیغات
رایتل

Of 7

Copyright © 2003, Hat-Squad Security Group www.hat-squad.com

1

چیست ؟

(Buffer Overflow) سرریز بافر

نویسنده بهرنگ فولادی

Behrang@hat-squad.com

1382/8/18

www.hat-squad.com

Hat-Squad

گروه امنیتی

(

مشاور و ارائه دهنده سرویسهای امنیتی)

Service@hat-squad.com

Copyright © 2003, Hat-Squad Security Group

"

درج تمام یا قسمتی از مطالب این مقاله تنها با اجازه نویسنده آن مقدور می باشد "

Of 7

Copyright © 2003, Hat-Squad Security Group www.hat-squad.com

2

از قدیمیترین مشکلات امنیتی سیستمهای آامپیوتری بوده است

. در حال حاضر اگر به ضعفهای امنیتی نرم (Overflow Buffer) سریز بافر

1

از این ضعفها مربوط به / ثبت شده اند ،نگاهی بیاندازید ، متوجه می شوید آه حداقل 3 SecurityFocus افزارهای مختلف آه در سایتهایی مثل

Buffer Overflow

می شوند.این مشکل در تمام سیستم های عامل دیده شده است.در این مقاله با یک مثال ساده ، موضوع Buffer Overflow

و چگونگی استفاده نفوذگرها از آن جهت نفوذ به سیستم های آامپیوتری بررسی خواهد شد

آامپایل شوند

اشاره نخواهد شد

. در پایان روشهایی برای جلوگیری از این نوع(در Windows نوشته شده اند و باید تحت سیستم عامل C حملات ارائه خواهد شد.برنامه های ذآر شده در این مقاله به زبان). Unix/Linux مورد نظر است وبه سیستم های عامل دیگر مثل Win این مقاله تنها سرریز بافر در برنامه های 32

بررسی موضوع را با یک برنامه آوتاه آغاز می آنیم

:

--------------------------------------------------------------------------------------------------------------------------------------

/* big.exe */

#include <stdio.h>

int insecure_func (char *big) {

char insecure_buff[100];

strcpy(insecure_buff,big);

return 0;

}

int main (int argc, char *argv[]) {

char input_buff[1024];

gets(input_buff);

insecure_func(input_buff);

return 0;

}

-----------------------------------------------------------------------------------------------------

input_buff

با فرستادن insecure_func قرار میدهد سپس هنگامی آه تابع input_buff برنامه ابتدا رشته ورودی از صفحه آلید را در آرایه

از

خواهد شد

insecure_buff آپی خواهد آرد.نکته اصلی آوچکتر بودن اندازه insecure_buff رادر input_buff فراخوانی شود ، این تابع مقدار موجود در. (Overflow) سرریز insecure_buff ، بیشتر از 100 آاراآتر را در خود جای داده باشد input_buff است. بطوریکه اگر input_buff

پیغام خطایی شبیه مورد

زیر دریافت خواهید آرد

Enter را به عنوان ورودی به برنامه بدهید. پس از زدن آلید 'a' حال برنامه را آامپایل و اجرا آنید و بیش از 100 آاراآتر:

Of 7

Copyright © 2003, Hat-Squad Security Group www.hat-squad.com

3

پیغام خطا

ببینیم چه اتفاقی افتاده است

قرار داده و آنترل را به روال فراخوانی شده می دهد

دوباره اجرای برنامه راه به روال اصلی می دهد

دارای ساختار زیر است

: هر گاه یک تابع از درون یک روال دیگر فراخوانی میشود ، سیستم عامل آدرس برگشت به روال فعلی را در محلی. بدین ترتیب پس از پایان روال مذآور ، سیستم عامل با (Stack)ٍ " از حافظه به نام "پشته. در مثال بالا آدرس برگشت قبل از وقوع سرریز (پیش از اجرای Stack بازیابی ادرس برگشت از: Stack اشاره دارد. بنابراین قبل از وقوع سرریز return به دستور 0 ( strcpy دستور

___________________

| |

_|___________________|

| | |

| | | *************************

100 bytes = | | insecure_buff | !!! stack grows down !!!

| | | *************************

|_|___________________|_

| | |

| return address | | = 4 bytes

|___________________|_|

|___________________|

Stack

همیشه به سمت آدرسهای پایین تر رشد می آند

باشد

x

ساختار. هنگام شروع اجرای برنامه، سیستم عامل 100 بایت برای بافر (stack) پشتهinsecure_buff بزرگتر از big در حالتی آه اندازه رشته موجود در strcpy آنار می گذارد. واضح است آه اجرا شدن دستور insecure_buffخواهد شد. اگر آمی دقت آنید ، می فهمید آه چرا آدرس برگشت بعد از سریز 616161610 (return address) ، باعث تغییر آدرس برگشت

آپی شود

. insecure_buff قرار بوده به بافر strcpy در مبنای 16 است آه توسط دستور 'a' آد اسکی آاراآتر x است . 061

مشخص شد

آه تمام برنامه ها و روالهایی آه روی یک سیستم عامل در حال اجرا هستند، در آخرین لایه، چیزی جز آدهای ماشین نیستند آه پشت سرهم

خوانده و آنترل اجرای

برنامه را به آن آدرس منتقل می آند

. اما چگونه این مشکل برای نفوذ به سیستم مورد استفاده قرار می گیرد؟ می دانیم overflow stack تا اینجا علت و چگونگی بروزEIP آامپیوتر آدرس حافظه مربوط به دستورالعمل بعدی را در طول اجرای برنامه از رجیستر CPU . خوانده و اجرا می شوند. حال اگر بتوان آدرس موجود در این رجیستر را در هر مرحله ای از اجرای برنامه به مقدار دیگری تغییر داد،

Of 7

Copyright © 2003, Hat-Squad Security Group www.hat-squad.com

4

یا سرویس پنهانی

backdoor بدون درنگ اجرای بقیه برنامه را از این آدرس جدید ادامه خواهد داد. تصور آنید در محل آدرس جدید آد یک CPU

ویا هر نوع آد مخرب دیگری قرار داشته باشد

یا آد محرب اجرا شده، آنترل سیستم مزبور را بدست

. نتیجه این خواهد شد آه آامپیوتر این آد را بجای آد برنامه اصلی آه مسیرش توسط ما عوضbackdoor شده، اجرا خواهد نمود و بدین ترتیب نفوذگر خواهد توانست با استفاده از

در سیستم هدف

. برای overflow گیرد. بنابراین نفوذگر برای رسیدن به هدف خود باید دو مساله را حل آند. اول یافتن راهی برای ایجاد

و

ها از حوصله این مقاله خارج است و نمی توان روش

... را برای یافتن روشی Ftp Server ،Mail Server ، Server Web اینکار نفوذگر ، سرویسها و برنامه های در حال اجرا روی سیستم هدف مانندoverflow آردن هر آدام از آنها آزمایش خواهد نمود. بحث یافتن overflow جهت

شده برای اجرای آد

دلخواه

overflow استانداردی را پیشنهاد آرد و بیشتر روی سعی و خطا استوار است. مرحله دوم استفاده از برنامه.

آد مورد نظر خود را روی سیستم اجرا آنیم

نامیده می شود

است آه آار مورد نظر مارا روی سیستم انجام خواهد داد و با تغییر آدرس برگشت، آنترل را به این آد خودمان می دهیم

مورد نظر خواهیم رسید

. رشته ای را big.exe برای نشان دادن روس آار نفوذگر، سعی می آنیم برنامه با استفاده از برنامه) exploit می سازیم آه شامل یک آد آوچک دستورات زبان اسمبلی (آه اصطلاحا (a به عنوان ورودی (به جای 100 آاراآتر. بدین ترتیب به نتیجه.

احتیاج داریم تا بدانیم رشته ورودی ساخته شده توسط ما در چه محلی روی آدرس برگشت ذخیره شده در انتهای

برای یافتن اندازه بافر سرریز شده است

Exploit برای نوشتن آد. Disassembler خواهد افتاد.برای دانستن این موضوع دو راه وجود دارد.روش اول استفاده از یک Stack

در این روش مجبوریم به دنبال تابعی بگردیم آه سرریز در آن اتفاق می افتد

های اسکی

. راه دوم انجام آزمون و خطا است ، ابتدا باید رشته آاراآتری از آد32 تا 255 بسازیم ، آد آوچک زیر این آار را برایمان انجام می دهد:

-------------------------------------------------------------------------------------------------------------------------------

/* ascii.exe */

#include <stdio.h>

void main(void) {

int i;

for (i=0;i<256;i++) printf("%c",i);

}

-------------------------------------------------------------------------------------------------------------------------------

این سوال پیش می آید آه چرا آاراآتر ها با آد اسکی بزرگتر از

32 را انتخاب آردیم. توجه داشته باشید آه رشته ای آه به عنوان ورودی به

strcpy

هنگام آپی آردن رشته آاراآتری به یکی از این آدها برسد آن را به عنوان انتهای رشته تلقی خواهد آرد و بقیه رشته آپی نخواهد شد

همین دلیل است آه ما بازه

اجرا می آنیم

باشد چون اگر تابع LF(0x0a) ، NULL(0x00) ،(EOF(0x1a،(CR(0x0c برنامه هدف می دهیم نباید حاوی آد های اسکی آاراآترهای. به32 تا 255 را آه شامل هیچکدام از این آدها نیست انتخاب می آنیم. حال برنامه را آامپایل آرده ، به صورت زیر:

C:\> c:\bof\big.exe | ascii.exe

Of 7

Copyright © 2003, Hat-Squad Security Group www.hat-squad.com

5

است

رشته ورودی روی آدرس برگشت می افتد

(ترتیب قرارگیری از راست به چپ است). یعنی با شروع از محل صدو چهارم x8b8a حاوی آدرس 89880 EIP این بار در پیغام خطا رجیستر. پس در رشته ای آه خواهیم ساخت محلهای 104 تا 107 حافظه (به طول 4 (x88-0x20= بافر ( 1040

بایت

) باید حاوی آدرس برگشت به آدی باشد آه می خواهیم اجرا شود.

را تشکیل دهیم

از ابتدای بافر تا محل

از محل

مارابه

پر می آنیم

مساله آخر تعیین آدرس محل حافظه است آه می خواهیم به جای آدرس برگشت واقعی قرار دهیم

می پردازیم

. در این باره دو امکان وجود دارد : Exploit مشکل اول حل شد ، حالا باید تصمیم بگریریم آه چگونه آد104 بافر Exploit -1 قرارگیری آد108 بافر به بعد Exploit -2 قرارگیری آد104 بایت محدود خواهد آرد ، به همین جهت روش دوم را انتخاب می آنیم و محلهای حافظه قبل از Exploit انتخاب روش اول اندازه آد. x یعنی 900 NOP (No Operand) آدرس صدوچهارم را نیز با آد دستور اسمبلی. ابتدا به بررسی وضعیت رجیسترها و: ( return اسمبلی (تولید شده توسط دستور 0 RET ساختار بافر درست قبل از اجرای دستور

___________________

| |

0|___________________|

| |

| | *************************

| insecure_buff | !!! stack grows down !!!

| | *************************

104|___________________|

| |<--- ESP

| return address |

108|___________________|

به محل

اجرا آنیم ، پردازنده بلافاصله آنترل را به آدرس

جستجو آنیم ، آدرس حافظه پیدا شده همان آدرسی است

104 حافظه اشاره خواهد آرد ، پس اگر بتوانیم در این لحظه ESP رجیستر RET همان طور آه می بینید ، درست قبل از اجرای دستور4 بایتی قرار داده شده در محلهای 104 تا 107 می دهد وما به منظور خود jmp esp یک دستورjmp esp (0xff0xe رسیده ایم . ابتدا باید حافظه سیستم را به دنبال آد دستور ( 4

آه بجای آدرس برگشت واقعی در محلهای

104 تا 107 بافر قرار می گیرد. با این حساب ترتیب اجرای برنامه به صورت زیر در خواهد آمد:

RET--> JMP ESP--> Our Exploit Code

های متصل به آن جستجو آرد

. بهترین راه جستجو در DLL و هم در حافظه مربوط به big.exe را می توان هم در حافظه برنامه xff0xe ترآیب 40

ویندوز را رد می آنیم و مطالعه آن را به عهده خواننده علاقه

PE

PE های متصل به برنامه است (در اینجا یکی دو فصل مربوط به فرمت فایلهای DLLمی شوند با آمک برنامه های Load در حافظه Image Base با شروع از آدرس NT سیستم در ویندوز DLL مند می گذاریم ). فایلهای

sysinternals

استفاده می آنیم آه می توانید آن را از سایت LISTDLLS می توان به آسانی این آدرس را پیدا آرد. در اینجا از برنامه Analyser

دریافت آنید

:

Of 7

Copyright © 2003, Hat-Squad Security Group www.hat-squad.com

6

C:\bof> listdlls big.exe

. . .

Base Size Version Path

0x00400000 0x27000 C:\bof\big.exe

0x77f60000 0x5c000 4.00.1381.0130 D:\WINNT\System32\ntdll.dll

0x77f00000 0x5e000 4.00.1381.0133 D:\WINNT\system32\KERNEL32.dll

های آن در حافظه را می بینیم

ها بر خلاف داخل فایل نیست

ظاهر می شود ، دستور زیر را اجرا می آنیم

. می توانیم در حافظه یا داخل هر آدام از این 3 فایل نشان داده DLL اطلاعات راجع به محل قرارگیری برنامه و. از یک Offset بگردیم . جستجو در حافظه راحتتر است چون نیازی به محاسبه jmp esp شده به دنبال آد دستور: SoftICE استفاده می آنیم و هنگام وقوع سرریز آه آنسول SoftICE مثلا Debugger

S 1000000 | ffffffff fee4

نتیجه

. xFFFFFFFF حافظه یعنی 0 Offset اولین آدرسی آه بایت اول مخالف صفر دارد) تا آخرین ) x یعنی جستجوی حافظه از آدرس 010000000

زیر حاصل خواهد شد

:

Pattern found at 0023:77f327e5 (77f327e5)

،

نیست و براحتی می توان از آن استفاده آرد

NULL(0x00) ،(EOF(0x1a،(CR(0x0c پیدا شد این آدرس حاوی هیچکدام از آدهای x77f327e در محل آدرس 50 jmp esp دستور. LF(0x0a)

نصب شده روی سیستم عامل هدف مقادیر متفاوتی خواهد بود ، یه این سبب در مواردی آه

نصب شده روی آامپیوتر هدف اطلاع پیدا آنیم و سپس آدرس درست برای آن

Service Pack توجه : آدرس فوق با توجه به ورژنService Pack می نویسیم به طریقی از شماره Remote Exploit

نویسی وجود دارند آه این مشکل را حل می آنند

. Exploit را استفاده آنیم. روشهاب پیشرفته دیگری برای Service Pack

معلوم شده است

بودن هدف متفاوت خواهد بود

زمینه مطالب و آدهای فراوانی روی وب موجود هستند آه با پیش زمینه فعلی به آسانی می توانید از آنها ایده بگیرید

2-آدرس آه باید بجای آدرس برگشت واقعی Exploit در این مرحله تمام اطلاعات لازم را در اختیار داریم : 1-محل قرارگیری آد. در این Remote یا Local است آه بر حسب Exploit قرار داده شود ، می دانیم. تنها آار باقیمانده نوشتن برنامه.

چلوگیری آنیم؟

Buffer Overflow چگونه از حملات

قبل از

به صورت

بروز نمی آرد

big.exe از ضعف حاصل از عدم تست اندازه داده ورودی استفاده می آنند. اگر برنامه نویس buffer overflow حملاتstrncpy از strcpy را چک می آرد یا بجای تابع big اندازه ورودی strcpy(insecure_buff,big); دستور. لذا مهمترین اصل در برنامه نویسی یک سرویس یا overflow استفاده می آرد، مشکل strncpy(insecure_buff,big,100);

ها چک آردن اندازه تمام ورودیها به برنامه قبل از انجام هر آاری روی داده هاست

. برای برنامه overflow برنامه مقاوم در برابر

وجود دارند آه برنامه نویس می تواند با لینک آردن این آتابخانه ها به نرم افزارش،

ها را بگیرد

StackGuard آتابخانه هایی مانند linux/unix نویسان محیط. overflow جلوی بسیاری از

Of 7

Copyright © 2003, Hat-Squad Security Group www.hat-squad.com

7

اما در اآثر موارد، به آد سورس برنامه یا سرویس نصب شده روی سیستم خود دسترسی نداریم و قادر به تشخیص ضعفهای احتمالی از طریق

بررسی سورس برنامه نیستیم همچنین اینکار از توان افراد غیر متخصص حارج می باشد

است

. چاره ای آه در بعضی سیستم های عامل مانند. همچنین این روش بصورت محدودی روی (Stack) اندیشیده شده است، ممانعت از اجرای آد در محیط پشته Linux و Sun/OS

های ارائه شده توسط تولید آننده نرم

افزار است آه در

Fix ها و Patch سیستمهای ویندوز پیاده شده است. اما بهترین و راحتترین روش برای عموم نصب تمام99 % مواقع موثر خواهد بود.

ارسال نمایید

. behrang@hat-squad.com سوالات و نظرات خود را به آدرس

: PE

دریافت اطلاعات بیشتر در مورد

http://msdn.microsoft.com/library/en-us/dnwbgen/html/msdn_peeringpe.asp?frame=true

: LISTDLLS

دریافت برنامه

http://www.sysinternals.com/