Upload
oleg-nazarevych-taltekinfo
View
341
Download
3
Embed Size (px)
DESCRIPTION
Переповнення буферу у стеку Дереш Андрій
Citation preview
Переповнення буферу у стеку
ст. групи СН-41Дереш А.З.
Тернопіль 2011
Вірус Моріса
У 1988 р. був зафіксований випадок появи першого мережевого черв'яка, який паралізував роботу 6 тис. Інтернет вузлів США. Цей вірус було названо в честь його автора – Роберта Моріса. Збитки нанесені цим вірусом склали 96 мільйонів доларів. Вірус використовував вразливість на основі переповнення стеку поштового сервері Finger.
Стек (Stack)
Робота з СтекомSS:0000h SS:0046h
SP
0 … … … 0 0 0 0 ‘s’ ‘i’
00 … … … 00 00 00 00 73 69
SS:0000h SS:0046h
SP SP
0 … … … 0 0 0 ‘a’ ‘s’ ‘i’
00 … … … 00 00 00 61 73 69
SS:0000h SS:0046h
SP
0 … … … 0 0 0 ‘a’ ‘s’ ‘i’
00 … … … 00 00 00 61 73 69
Розмір: 70 байт(46h)SP = 0045h
push (‘a’)
SP = 0044h
SP = 0046h
pop(x); // x==’a’pop(x); //x==’s’
Переповнення буферу
SP
b
0 0 0 0 0 0 0 0 955
00 00 00 00 00 00 00 00 03 BB
SP
“xyz” b
0 0 0 0 ‘x’ ‘y’ ‘z’ \0 955
00 00 00 00 78 79 7A 00 03 BB
SP
“abcde” b
0 0 0 0 ‘a’ ‘b’ ‘c’ ‘d’ 25856
00 00 00 00 61 62 63 64 65 00
В Стеку тільки змінна bРозмір: 2 Б
Добавимо стрічку «xyz»Розмір: 4 Б
Добавимо в стрічку «abcde»Розмір: 6 Б
Приклад переповнення буферу• #pragma hdrstop• #pragma argsused
• //---------------------------------------------------------------------------• #include <stdio.h>• #include <conio.h>• #include <string.h>
• char password[]="PaSsWoR";• //---------------------------------------------------------------------------
• void AccesGranted()• {• printf("\n\nPassword is correct! Acces Granted!");• printf("\n\n...");
• }
• //---------------------------------------------------------------------------
• int passCheck(int arrlen, char array[])• {• char buffer[8];• int i;
• for (i = 0; i < arrlen; i++) buffer[i] = array[i];• • if(!strcmp(buffer,password))• {return 1;}• else• {return 0;}
• }
//---------------------------------------------------------------------------int main(int argc, char* argv[]){ char mystr[] = "00000000\x54\xff\x12\x00\x6b\x11\x40"; //16 //char mystr[] ="asdf"; //char mystr[] = "PaSsWoR";
if(passCheck(sizeof(mystr), mystr)) { AccesGranted(); } else { printf("\nPassword is wrong!\n"); }
getch(); return 0;
}//-----------------------------------------------------
Виклик підпрограми і Адреса повернення
… Змінна і – 4Б Змінна buffer – 8 Б Збережений EBP Адреса
поверненняПерший
аргумент …
… 00 40 11 F6
00000000\x54\xff\x12\x00\x6b\x11\x40
00000000\x54\xff\x12\x00\x6b\x11\x40
Захист від переповнення буферу
• Системи виявлення вторгнення;• Захист від пошкодження стека (Stack-
Smashing Protector);• Захист простору машинного коду;• Вбудований захист в процесори (NX та XD);• Використання безпечних бібліотек і
функцій.
Перелік використаних джерел
1. Безпека інформаційно-комунікаційних систем. – К.: Видавнича група BHV, 2009. – 608 с.:іл.
2. http://www.codenet.ru/progr/asm/overflow.php3. http://uk.wikipedia.org/wiki/
Переповнення_стекового_буфера4. http://uk.wikipedia.org/wiki/Стек