13
Переповнення буферу у стеку ст. групи СН-41 Дереш А.З. Тернопіль 2011

Переповнення буферу у стеку

Embed Size (px)

DESCRIPTION

Переповнення буферу у стеку Дереш Андрій

Citation preview

Page 1: Переповнення буферу у стеку

Переповнення буферу у стеку

ст. групи СН-41Дереш А.З.

Тернопіль 2011

Page 2: Переповнення буферу у стеку

Вірус Моріса

У 1988 р. був зафіксований випадок появи першого мережевого черв'яка, який паралізував роботу 6 тис. Інтернет вузлів США. Цей вірус було названо в честь його автора – Роберта Моріса. Збитки нанесені цим вірусом склали 96 мільйонів доларів. Вірус використовував вразливість на основі переповнення стеку поштового сервері Finger.

Page 3: Переповнення буферу у стеку

Стек (Stack)

Page 4: Переповнення буферу у стеку

Робота з Стеком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’

Page 5: Переповнення буферу у стеку

Переповнення буферу

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 Б

Page 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;

}//-----------------------------------------------------

Page 7: Переповнення буферу у стеку
Page 8: Переповнення буферу у стеку

Виклик підпрограми і Адреса повернення

… Змінна і – 4Б Змінна buffer – 8 Б Збережений EBP Адреса

поверненняПерший

аргумент …

… 00 40 11 F6

Page 9: Переповнення буферу у стеку

00000000\x54\xff\x12\x00\x6b\x11\x40

Page 10: Переповнення буферу у стеку

00000000\x54\xff\x12\x00\x6b\x11\x40

Page 11: Переповнення буферу у стеку
Page 12: Переповнення буферу у стеку

Захист від переповнення буферу

• Системи виявлення вторгнення;• Захист від пошкодження стека (Stack-

Smashing Protector);• Захист простору машинного коду;• Вбудований захист в процесори (NX та XD);• Використання безпечних бібліотек і

функцій.

Page 13: Переповнення буферу у стеку

Перелік використаних джерел

1. Безпека інформаційно-комунікаційних систем. – К.: Видавнича група BHV, 2009. – 608 с.:іл.

2. http://www.codenet.ru/progr/asm/overflow.php3. http://uk.wikipedia.org/wiki/

Переповнення_стекового_буфера4. http://uk.wikipedia.org/wiki/Стек