Bufferin Daşması Necə Yerinə Yetirilir (Mərhələli Şəkildə İzah)
Buffer Overflow nədir? Stack nədir ? Stack anlayışı nədir? Stack anlayışının analizi necə həyata keçirilir?
Telegram kanalına qoşularaq bu və digər mövzular üzrə quizlərdə iştirak edə bilərsiniz!
Telegram (Kanal): https://t.me/xakeraz_official
Bufferin (Stack) Daşması
Biz əvvəlki paylaşımımızda SimpleBuffer.c proqramını yaratdıq və o proqram stackin dolması üçün zəifliyi mövcud idi. Paylaşıma aşağıdakı linkdən keçid edə bilərsiniz:
Bir proqramçı ilə kibertəhlükəsizlik mütəxəsisi arasında fərq buradan yaranır.Proqramçı bufferin daşması zəifliyini görmür, bunu ya ona əvvəlcədən deməli ya dakı səhvini sonradan aşkarlamaq lazımdır. Əvvəlki paylaşımdakı Kopyalama funksiyasına yaxşıca fikir verin:
void copy(char* message)
{
//simvol massivini teyin edirik
char buffer[15];
//argumentden gelen metni buffer masivine kopyalayiriq
strcpy(buffer, message);
}
Funksiya kopyalama işi üçün kommanda sətrində məlumat qəbul edir. Bəs bu məlumatı kim verir və idarə edir? Əlbəttə ki, istifadəçi. Bəs bu istifadəçi kiber təhlükəsizlik mütəxəsisi olarsa və ya xaker ?
Əgər siz kopyalama funksiyasına yaxşıca fikir versəniz görə bilərsiniz ki, funksiyanın arqument olaraq qəbul etdiyi məlumat 15 simvoldan çox olmamalıdır. Bəs istifadəçi burada 15 simvoldan çox məlumat daxil edərsə, nə baş verər?
İmmunity Debugger proqramını açırıq və əvvəlki paylaşımda yaratdığımız SimpleBuffer.exe proqramını File Open açırıq. Arqument hissəsinə 15 simvoldan az olmayaraq A ( Burada istədiyiniz hərfi seçə bilərsiniz) hərfini yazırıq. Daha sonra isə Run deyərək proqramı icra edirik.
Proqram Run edildikdən sonra əvvəlki paylaşımda qeyd etdiyimiz saxlama nöqtəsinə gəlib çıxacayıq.
00401489 |. C74424 1C 0100>MOV DWORD PTR SS:[ESP+1C],1
İndiki mərhələdə biz bir ədəd daha saxlama nöqtəsi əlavə edəcəyik. Bu nöqtə bufferə kopyalama əməliyyatından sonra olan NOP instruksiyasındadır.
00401473 |. E8 E8250000 CALL <JMP.&msvcrt.strcpy> ; \strcpy
00401478 |. 90 NOP
Nöqtəni qeyd etdikdən sonra birdaha Run edirik və artıq bufferi A hərfləri ilə doldurduq.
0061FECC 00401478 x@. SimpleBu.00401478
0061FED0 0061FEE1 áşa. ASCII "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
0061FED4 00B82D18 -¸. ASCII "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
0061FED8 004012E0 à@. SimpleBu.<ModuleEntryPoint>
0061FEDC 00000000 ....
0061FEE0 41414160 `AAA
0061FEE4 41414141 AAAA
0061FEE8 41414141 AAAA
0061FEEC 41414141 AAAA
0061FEF0 41414141 AAAA
0061FEF4 41414141 AAAA
0061FEF8 41414141 AAAA
0061FEFC 00414141 AAA.
Daha sonra Run etdikdə isə xəta ilə qarşılacayıq. Xəta isə belə görsənir:

Bu hissədə proqram uşaq kimi nə edəcəyini bilmir. O həmin adresin oxunmadığını bildirir. Əlbəttə həmin adres oxuna bilməz,çünki adres səhvdir.
Təsəvvür edinki, həmin oxumayan adres yerinə həqiqi adres yazılacaqdır. O zaman proqram onu qeyri-şərtsiz icra edəcəkdir. Belə oldu xakerlər həmin bu stackin daşması ilə hədəfdən shell əldə edirlər. Bunun necə yerinə yetirildiyini isə yalnız təhsil məqsədi ilə növbəti paylaşımlarda görəcəyik.
Bizi izləyin:
Telegram (Kanal): https://t.me/xakeraz_official
Paylaşımların səliqəli yığılmış halı: https://t.me/xakerazgroup
Fikir və şərhləriniz : https://t.me/xakerazchat