АкушерствоАнатомияАнестезиологияВакцинопрофилактикаВалеологияВетеринарияГигиенаЗаболеванияИммунологияКардиологияНеврологияНефрологияОнкологияОториноларингологияОфтальмологияПаразитологияПедиатрияПервая помощьПсихиатрияПульмонологияРеанимацияРевматологияСтоматологияТерапияТоксикологияТравматологияУрологияФармакологияФармацевтикаФизиотерапияФтизиатрияХирургияЭндокринологияЭпидемиология

Seventh

Second

Фиксим багу с хелпом в DOS'e

Запускаем DOSBox

Пишем mount C C:\

Прописываем C:

Запускаем DOS - DOS\NC\NC.bat

 

Начало безопасности

Reverse Ingeneering

Главная задача - врыться во внутренности этой программы, восстановить программу по исходному коду.

KeyGen'ы действуют по такому же принципу. Нужно понять логику программы и сделать Кей Ген.

Читы - тоже особая программа отладки, которую пытаются скрыть создатели игры, а находчивые люди пытаются найти

эту программу и обойти защиту.

 

 

Мы будем брать какой-то exe'шник и пользоваться DisAssembler'ом IDA, чтобы понять ассемблерный код программы.

Дисассемблер - программа, которая по байт-коду даёт более менее приемлимый ассемблерный код.

Нужно сразу открывать блокнот и пробывать писать псевдокод программы и разбирать её ассемблерный код.

Код читаем поверхностно потому, что это может нас только запутать, т.к. любые компиляторы могут добалять свои

различные блоки, т.к. ему может казаться, что так быстрее. Код далеко не оптимальный потому, что код генерила

программа, а не писал человек.

 

Псевдокод, который у нас получается:

+---------------------------------------------+

| esi = malloc(100h);

| eax = 1;

| edi = -1;

|

| i = ax;

| d = esi[i - 1];

| d = d + i;

| eax++;

|

| i = 1;

| for (i < 100h);

| { |

| esi[i] = esi[i - 1]; |

| i++; |

| } |

| |

| esi[0] = 16 |

| esi[16] = /* 16 + 1 + 2 +... + 16 = */ 152 |

| |

| |

| |

| ax = esi[0]; |

| cx = esi[ax]; |

| dx = esi[cx]; |

| dl = esi[dx]; |

| |

| printf("%h, %h, %h, %h", ax, cx, dx, dl); |

+---------------------------------------------+

 

Теперь давайте рассмотрим другой пример:

 

У нас есть exe'шник, который запрашивает какой-то ключ. Вводим ему что-то, он не соглашается. Давайте

пропатчим этот exe'шник. Смотрим на код: Идёт чтение, потом шифрование... Злостный код. Читать и

анализировать это плохая идея, поэтому давайте попробуем подогнать его под себя там, чтобы он соглашался

с любым нашим паролем. Видем внизу развилку и слова Correct и Wrong. Изменим jz на jnz, тогда

получится то, что нам нужно. Смотрим, что номер нужной нам строки это 108. Смотрим, что код

jz - 74, а jnz - 75. Так как IDA не HEX редактор, а только View'er, то открываем любую программу по

редакции HEX'a и находим нашу 108 строку. Находим 74ое значение и заменяем его на 75. Получаем, что

программа соглашается любым нашим паролем, кроме правильного. TADAM.

 

Предположим, что нам всё-таки интересно, что же хочет от нас программа. Давайте поверхностно прочтём

тот кусок кода, который мы пропустили. После недолгих рассуждений мы понимаем, что нам

нужно узнать, что в итоге получается в esi. Хорошая идея - воспользоваться дебагером. Идём до надписи

test esi, esi. Там находим нужный нам регистр, о которой мы узнаём из анализа кода в дебаггере.

От дебаггера фактически защитится нельзя, но при этом нужно знать логику программы. Не зная этого

мы не сможем понять, где и что именно нам нужно. Единственный его недостаток, то что он модифицирует exe'шник

и добавляет свой однобайтовый код, где же ему остановится. Программа может заскандалить и сказать то,

что она больше не будет работать, проверяя контрольную сумму, скажем через какой-нибудь хэш md5.

 

Теперь рассмотрим уязвимость к переполнению. В частности к переполению стэка. Смысл этого способа в том, что

если мы выделили 5 байт, а записали 6 байт, то мы тем самым можем случайно перезаписать адрес возврата. Шестой

символ строки может перезатереть этот самый адрес потому, что адрес всегда лежит сверху. Борятся с этим добавляя

сверху "канорейку" - случайное чилсо, которое запоминается предварительно и поэтому, если мы будем перезатирать

сам адрес возврата, то мы скорее всего перезатрём и канорейку.

_______________________________________________Кусочек чуть-чуть не доделан;D _________________________________

Теперь пример №3.

Будем рассматривать опять же дезассемблированный код, и опять тоже будем писать какой-нибудь псевдо-код.

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

if (agrc**!+ "") {

 

}

else {

printf("Usage:..");

die();

}

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

Чуть-чуть просмотрев код мы видим, что-то про параметр с началом "xxx". Вводя туда "ххх" он нам отвечает

"You are a loser!". Вводя чуть больше с ним начинает происходить что-то не адекватное. Вводя ещё больше

символов программа вылетает с отчётом об ошибке. 12FF7D

Просмотрев код далее мы видим большую развилку. Понимаем, что там происходит сравнение строк Ivan и Smirnof.

И если сравнение происходит успешно, то программа нам говорит, что мы крутые хаккеры, чего мы и хотим добиться.

Найдём адрес этой строки про хаккеров и попытаемся туда прыгать. Места, где мы ставили брейк-поинты.

Найдём retn. Чуть-чуть по-эдитив его мы получаем то, чего мы хотим.:D

 

Third

Сети

В этом блоке, достаточно небольшом, мы будем говорить о том, какие бывают сетевые устройства, протоколы, и вообще попытаемся в этом разобраться. Какие в сети бывают устройства:

1. Наши компьютеры. PC

2. Маршуртизаторы или Роутер. Router

3. Концентратор. Hub

4. Коммутатор. Switch

5. Админ. Admin - человек, который за всем следит. (шутка)

Эти устройства нужно как-то соединять. Например, у нас есть запас каких-то машинных ресурсов, и нам нужно соединить.

Например, притер с компьютером.

Сеть - LAN (Local Area Network):

Топология сетей:

1. Шина. Bus - обычная, устаревшая сеть, состоящая из одной прямой шины.

2. Кольцо. Ring - название говорит за себя. Соединено в круг.

3. Звёздочка. Star - сеть в форме звезды, где всегда есть один главный узел, который соединяет все малые узлы.

4. Расширенная звёздочка. Extended Star. Такая же звезда, у которой на концах тоже расположены маленькие, обычные звёздочки. К тому же у неё нету самого большого узла, в отличии от звёздочки.

5. Иерархическая. Hierarchic. Сделална по типу бинарного дерева.

Так много сетей сделаны для разных задач. Кольцо будет очень неудобно делать для больших глобальных сетей,

а вот расширенную звезду сделать очень даже удобно. Для маленькой сети, где все друг друга слышат довольно

неудобно делать расширенную звезду, а обычную шину - здорово.

В сети компьютер = хост.

 

Как вообще происходит передача данных? Есть два компьютера, две сетевые карты, напихали битов - передали.

Но ведь по проводу 1 тоже может в 0 превратится! Для этого делают:

1. Шифрование

2. Протоколы.

Ребята, которые разрабатывали проект ArpaNet, который превратился в InterNet в последствии, разработали

протокол TCP/IP и ISO/OSI.

Смысл этих протоколов в том, что они состоят из 4-х уровней - Application, Transport, Internet, Network Access.

Ну и сам пользователь где-то там. Когда пользователь передаёт что-то другому пользователю, то информация идёт

как-то так:

 

 

Transmitter ->\ /-->Taker

Application | <------> | Application

Transport | |Тransport

Internet | {----} | Internet

Net Access | [----] | Net Access

\_[Inet]__/

 

На транспортном уровне мы разбиваем на сегменты всё что мы получаем сверху и начинаем их передавать.

На следущем уровне мы разбиваем их на ещё меньшие пакеты и передаём ниже. И там начинается вся работа.

Этот уровень: 1. Регулирует уровень локальной сети. 2. Занимается непосредственной передачей данных.

 

<-----> - означает протокол.

{-----} - означает общение IP-адресов.

[-----] - означает общение MAC-адресов.

 

Протоколы.

 

На кажом уровне есть свои протоколы:

1. App: HTTP, FTP/TFTP, SMTP, SSH, DNS,... - всякие протоколы асек и скайпов там же.

2. Transport: TCP, UDP.

3. Internet: IP.

4. NA: Ethernet.

Как обратится к приложению? К приложению можно обратится через порт:

HTTP - 80,

FTP - 20/21,

TFTP - 69,

SMTP - 25,

SSH - 22,

DNS - 53,...

TCP/UDP.

У этого протокола есть такая штука, которая называет "Three way handshake".

К примеру, один комп говорит другому

1. -----> syn - давай общаться

2. <----- syn/ack - принято

3. -----> ack - принято

А в UDP этого всего нету. Он просто накидал пакетов и ему всё равно.

IP.

IP тоже ничего не знает про соединение, но у него есть другая миссия - он умрёт, но доставит. Про это позже.

Ethernet.

Самая обычная топология сети.

 

Допустим мы открыли наш браузер и написали в нём http://google.com

google.com - доменное имя, http:// - протокол.

Доменное имя - это такой способ адресовать узел к какому-то человеку. Это гораздо удобнее, чем IP-adress.

Потом встал вопрос об удобстве использования. Если раньше вы набирая модем могли попасть только на один

IP-адрес, то сейчас Бог знает куда вы попадёте. Также теперь есть такая служба как DNS и теперь имеено

она сопоставляет домен и IP-адрес. И всё общение у нас происходит IP-адресами.

У IP-адреса есть суфикс. Суфикс указывает нам на принадлежность IP-адреса какой-то области (.edu,.gov,.org,.com,.me)

 

IP разделяется на 4 части, каждая из которых содержит один байт.

NETWORK------|------HOST

192. 168. 0. 1

|

|

127. 0. 0. 1

|

7F. 00 | 0. 01

 

Адреса ещё делятся на частные и публичные.

Частные.

Каждый адрес должен быть уникален по крайней мере внутри своей локальной сети, а из других сетей они

не доступны и даже могут постарятся.

Публичные.

Публичные адреса мы берём, когда хотим, чтобы все другие нас видели. Также есть люди, которые

могут что-то предоставить миру, а некоторые не могут и не хотят. Тогда те, которые хотят,

делают себе публичные адреса. В частности сервера.

Все сети разбиты на классы. Классы бывают следующих видов.

1. Класс А.

Первый октет - Network, второй, третий и четвёртый под хоста. 128....

2. Класс B.

Первый второй - Net, третий, четвёртый - хост. 191....

3. Класс С.

... 223....

4. Класс D. }

Все под хоста. } Эти адреса не для того, чтобы посылать всем, а только для групп.

5. Класс Е. }

Маска.

Не смотря на классы мы должны как-то лучше характеризовать сети.

1 - сетевой.

0 - хост.

Таким образом, чтобы охарактеризовать какой-то компьютер мы должны знать Маску + IP.

 

255.255.000.000} & - делаем операцию побитового & и получаем адрес всей сети.

010.012.001.002}

 

Есть ещё один особенный адрес в данном случае - это 10.12.0.1, а самый старший особенный 10.12.255.255

10.12.255.255 - он принадлежит всем компьютерам, каждый компьютер поймёт, что это ему.

 

Поэтому в сети 2^x - 2, x = кол-во бит.

К тому же 255.255.255.248 = /29 - пишут сколько единиц в маске.

 

10.12.255.255 } = 10.12.1.2/29

10.12.1.2 }

 

Порты.

Порты - некоторое расширение для IP - адреса приложения.

 

Скажем пакет может быть отправлен по правильному адресу, но он может вылететь из стэка.

Организация IANA занимается назначением IP-адресов. Порты 0-1024 заняты под стандартные службы, а

1025 - 65535 - свободны для любые другие приложения.

 

Fourth

Регулярные выражения.

Это шаблоны, с которым сравнивается наша строка.

Шаблон выглядит примерно так: //

Между слешами мы можем записывать просто буквы и цифры, тогда строка будет сравниваться или 12345678

модификаторы,

которые бывают такие:

\w - все буквы и цифры.

\s - пробелы, табуляции, перевод строки...

\S - НЕ пробельный символ.

\[asd][fgh][jkl] - существуют слова первая буква которых состоит из a или s или d, вторая - f,g,h третья - j,k,l

\^f - первый символ - f

\^f* - стоит от 0 до бесконечности букв f

\^f+ - стоит от 1 до бесконечности букв f

Чтобы использовать маски нужно печатать: $a =~ /\^f/. Это означает проверить f ли первая буква в $a.

Эта штука возвращает 0 или 1, поэтому её необходимо использовать в логических выражениях.

 

Что же такое Socket?

Будем считать что это розетка с вилкой. Розетка - это сервер, а вилка - это клиент.

Мы не можем передавать данные не воткнув вилку в розетку. Тогда пойдёт электричество.

 

 

В Уроке №3 мы уже разобрались в том, какие бывают сети.

Обратимся к прошлому. В Америке существовала компания

AT&T, которая занималась телефонной связью. Она существует и сейчас, но давайте разберёмся, как она работала.

 

Когда один абонент хотел поговорить с другим абонентом, то от одного телефона сигнал проходил к такому

здоровскому столбу, который умел направлять сигнал (телефонная станция) и сигнал шёл к другому столбу,

который также адресовал сигнал на другого абонента. Это называлось channel switching (коммутация каналов).

Потом пришёл Kleinrock (один из создателей ARPANET'a) и сказал, что это здорово, но не удобно. Так как

когда один человек говорит с другим занята вся линия и больше никто разговаривать не может. Он предложил

такую штуку, как packet switching. В итоге хорошо возрасла пропускная способность потому, что эти пакеты

доставлялись довольно быстро, но при том они иногда терялись.

 

Также в прошлом уроке мы говорили про такую штуку, как ISO/OSI (Opion System Interconnection). Это был

большой стэк из семи уровней:

1. Physical 1. Please

2. Datalick 2. Do

3. Network 3. Not

4. Transport 4. Through

5. Session 5. Salami

6. Presentation 6. Pizza

7. Application 7. Away:D

1. Physical - засовывает биты в провод.

2. Presentation - проверяет и управляет сетевой картой.

3. --//--

4. - здесь речь уже идёт больше о связи программ.

5. Session - у нас уже есть некоторое соединение и здесь идёт управление этим соединением.

6. Presentation - здесь идёт речь о форматах и представлении данных - кодировках

7. --//--

При том данные идут от 1 до 7, а не наоборот.

Как накладываются уровни ISO/OSI на TCP/IP от NIC.

1. Physical } } Обор

2. Datalick } 4. NA }

3. Network }3. Internet } OC

4. Transport } 2. Transport }

5. Session } }

6. Presentation } 1. Application } Приложение

7. Application } }

 

Промежуточные уровни в сети.

 

HOST

3. С.У. /- Router

2. К.у Сетевая карта- - Switch-

1. Ф.у. \- HUB -/

 

HUB - принимает исходный сигнал и выплёвывает его на всех своих выходах повторяет сигнал. Работа с проводом.

SWITCH - внутри себя создаёт некоторую виртуальную цепь, которая связывает каждого с каждым. Работает на

канальном уровне поэтому, он знает МАС-адреса

ROUTER (Modem (Модулятор/Демодулятор)) - он уже работает с IP-адресами.

 

Теперь давайте будем смотреть как МЫ рассматриваем сеть и будем смотреть - не было ли чего-нибудь лишнего?

Среда - такое место, где если один узел что-то посылает в неё, то все остальные узлы это слышат.

В одной среде соединяются два узла (больше быть не может, их в данном случае два).

В среде не возникает требования опознания собеседника, так как их там только два.

Ну тогда логика проста. Узел думает:"Если что-то говорят, а я молчу, то это говорят мне".

Типы сред.

Тип 1. Simplex - передача идёт только от одного к другому. Обратно передачи не идёт.

Тип 2. Half duplex - передача идёт по одному проводу, а приём по-другому.

Тип 3. Full duplex - передача идёт по тому же проводу, что и приём.

Это оправдывает физическую часть.

 

Теперь рассмотрим среду, где больше двух узлов, и там уже появляются MAC-адреса.

MAC - Media Access Control - шестибайтный код, который пробивается сразу на сетевой карте.

Первые три байта - производственные, а остальные три - описывают устройство.

Понятно, что для всех устройств всего мира не достаточно МАС-адресов, к тому же его не только можно перепрошить,

его можно сменить в самой операционке. Можно подключится к чужой сети и перепрошить МАС-адрес, и тем самым

получать чужие данные. Адрес FF:FF:FF:FF:FF:FF - поднимут в локальной сети все (широковещательный).Тогда понимаем,

что DataLink часть тоже оправдана.

 

Теперь рассмотрим, что у нас не одна среда, а две: A и B. В каждой из них есть несколько компьютеров, и они

и они соединены двумя маршуртизаторами. Дальше пошли подслучаи:

1. A1 передаёт A3

A1 передаёт сразу A2,A3,M1. Все, кто не А3 разворачивают пакет и понимают, что это не им и выбрасывают.

(кроме switch'a и маршуртизатора. Они сохраняют пакеты)

2. A1 передаёт B1

A1 передаёт A2, A3, M1. Все поняли, что это не им, а маршуртизатор задумался. В данном случае нам надо

будет указать МАС-адрес маршуртизатора. А дальше уже следующий маршуртизатор будет передавать.

Также есть такой процесс, как маршуртизация пакета. Алгоритм таков:

1. Прилетел пакет

2. Извлекли IP-адрес.

3. Далее маршуртизатор спрашивает:"В таблице такие IP-адреса есть?". Значит маршуртизация закончена

и отправляет пакеты в нужный порт соответвующий определённому IP-адресу.

Также сделали такую штуку, чтобы нельзя было отправить пакеты сразу на все компьютерам, которая называется "шлюз по умолчанию". Это то место, куда он отправит, если не знает куда отправить

что-либо (defaul gate away).

Посмотрим на это всё, как на сети. У нас есть сеть A и сеть B.

/-----M1----\

A B Запишем таблицы маршуртизации:

\-----M2----/ M1: 2 B M2: 1 A

1 A 2 B

A --> B

A: M1, M2

M1: B

M2: X - остановился, так как он не знает куда ему пересыласть, то есть В.

 

На самом деле хост умнее маршуртизатора. У него внутри есть таблица маршуртизации.

Кстати, у нас из-за двух маршрутизаторов повышается устойчивость, но заместо этого мы буквально чуть-чуть переплачиваем.

Также такое может быть, что один провод помялся, а другой нет. Тогда могут прийти два пакета - один плохой, другой нормальный.

Тогда может быть так, что компьютер не может знать, какой пакет у нас хороший. Но для таких экстренных случаев существует такие

штуки, как контрольные суммы, которые подсчитывают заголовки и посылают себя. Контрольная сумма подсчитывается и в итоге

мы получаем информацию о том, побит ли наш пакет или нет.

 

NAT (Netwrok Address Translation)

NAT - любое маршуртизирующее устройство.

Пусть у нас есть такая сеть с не маршуртизированными IP-адресами, скажем 10.0.0.0/8. В ней есть компьютер с адресом

10.0.0.11 и маршуртизатор(10.0.9.254), который выводит сразу в интернет и в другой сети есть другие сети, скажем с IP-адресами

89.108.1.1 и 89.108.127.168.

Что такие NAT? У NAT есть разные виды. Он бывает статический, динамический и PAT. Маршуртизатор видно снаружи. Например, у нас

есть сервер, у которого должен быть всегда открыт 80 порт. А остальные пользователи не этой сети думают, что общаются с

маршрутизатором, а у него порт 80 закрыт. Поэтому у маршрутизатора должен быть тоже открыть порт.

 

Теперь, скажем, один компьютер хочет установить соединение с другим компьютером, не в локальной сети.

Он 10.0.0.11:5001 (5001 - сгенерировалось) хочет передать 89.108.127.168:80 пакет. Это всё попадает на М и происходит вот что.

IP TCP

КТО 89.108.1.1 32100 (тоже с генерировано (любой открытый порт))

КОМУ 89.108.127.168 80

 

IP TCP

КТО 89.108.127.168 80

КОМУ 89.108.1.1 80

 

И дальше начинается соль NAT'а. Ему прислали пакет, а у него внутри такая табличка.

 

З Н А Ч Е Н И Я К Л Ю Ч И

КТО ПОПРОСИЛ С ПОРТА | ЧТО ОТКРЫЛИ (Здесь сыграл NAT)

10.0.0.11 5001 | 32100

 

 

IP TCP

КТО 89.108.127.168 80

КОМУ 10.0.0.11 5001

 

И потом уже даёт эти пакеты.

 

И только маршрутизатор знает всё о том, кто кому и что отправлял.

 

Короче говоря, NAT нужен, чтобы экономить IP-шники.

 

Fifth

Что такое информация?

Информация = данные.

Информацию можно передавать с помощью данных, но не все данные можно передать при помощи информации.

Сегодня, если мы говорим о информации, то только от данных.

Теперь перейдём к защите данных.

Есть 3 постулата защиты информации:

1. Конфидециальность - данные не дожны публично не распростронятся.

2. Целостность - данные должны доходить не изменёнными, целыми.

3. Доступность - данные должны быть доступны в любых условиях.

Есть такое понятие, как Тайна. Тайна вызывает в нас всего два чувства:

1. Мы хотим её сохранить

2. Мы хотим её узнать

Защита данных.

Существуют такие вещи, как носители, которые иногда хранят наши тайны. Чаще всего мы хотим тогда защитить эту тайну.

Тогда встаёт вопрос о защите информации.

Существует множество способов защиты информации:

1. Защита носителя:

1. Сложный, трудный способ добыть информацию.

2. Сделать носитель легко уничтожимым (Криптекс, Диск Энея)

2. Стеганография (скрываем наличие информации)

1. Невидимая информация (симпатические чернила)

2. Невидимый носитель информации (способ с отращивание волос)

3. Скрытие секретной информации в несекретной информации. (Решётка Кардана, можем передавать в картинках)

3. Криптография (Можем прятать текст в хаотическом наборе байтов)

1. Шифр простой замены

2.

3.

 

 

Примеры шифровок.

1. Диск Энея

2. Мы соединяем картинку с архивом.jpg +.rar. В итоге можем менять расширения и тем самым превращать картинку в архив и наоборот.

 

3. Линейка на ней написан алфавит в случайном порядке. Она есть и у получателя и у отправителя. Наматываем нитку на линейку

делаем нужные заметки на ней.

 

3. Квадрат Полибия. Расставляем числа на одной оси, алфавит на другой оси. Одна буква означает комбинацию букв и чисел. Ещё есть такая

вещь, как Лозунговый ключ. У нас есть ключ "Тетрадь" мы в первые клетки записываем "терадк" (без повторений букв).

 

3. Шифр перестановки. Сцитало. Берём бумагу. Наматываем бумагу на посох. Текст записывался горизонтально и снимался с палки.

Получалась белеберда. У другого человека тоже должна быть палка примерно такого же диаметра. Шифр быстро взломал Аристотель при

помощзи конуса.

 

К пункту номер 3:

Рассмотри такое понятие, как крипто система.

Пусть у нас есть - M - открытый текст. У нас есть C - криптограмма. У нас есть К - ключ. Тогда криптосистема задаётся так:

K1

M M -------> CCCCC

M M M M C

M M M <------- C

M M K2 C

CCCCC

1. Шифр Простой Замены:

Построим математическую модель. У нас есть алфавит обычного текста. У нас есть алфавит крипто-текста. У нас все преобразования

должны быть обратимыми, но не обязательно биекция. У нас есть множество ключей.

Для любого ЭМ принадлежащего СИГМА и k принадлежащего К, такое, что существует ЦЕ принадлежащее ДЕЛЬТА такое, что функция

РО(m, k) = c

 

Для простоты мы будем использовать ШПЗ, где мощности обоих множеств равны.

Частные случаи - шифр Цезаря, квадрат Полибия.

2. Таблица Тритемия.

У него была табличка. 26x26

Тритерий + Лозунг = Белазо

 

 

A B C D E F G H I K J L M N O P Q R S T U V X Y Z

B C D...... A

C D E...

D E F...

...

...

Z A B

 

Это усложнённый шифр простой замены.

3. Ave Maria = Стенография + Криптография. Каждому символу ставится в соответствие слово. Получается довольно связанный текст.

Ставим дырки нужным образом.

 

Теперь вернёмся к решётке Кардана.

У нас есть 2n дырок по каждой стороне. Мы сделали n^2 дырок. Мы просто списываем первые буквы, потом поворачиваем

продолжаем списывать, и так четыре раза! Такой шифр очень, очень сложно взломать.

 

Шифр гамминирования. Пусть у нас есть алфавит ключа, текста, зашифрованного текста, все равные по мощности.

m = m1, m2,... mn

k = k1, k2,... kn

c = c1, c2,... cn

 

ci = mi |+| ki, где |+| - это сложение по модулю n

 

m = a b c

k = a b c => c = a c e

 

Частные случаи. Шифр Вижжена. У нас есть какое-то одно слово, которые будет повторятся.

m = m1 m2.. mp m(p + 1).... mp

k = k1 k2.. kp k1 k2.... kp

 

Шифр Вернан или одноразовый блокнот.

Последовательность букв записана в блокноте и уже относительно них делаются сообщения и шифровки.

 

Шифровальные машины:

1. Устройство Уодсворта.

Берутся две шетерёнки разного диаметра. По кругу одного записывается алфавит из нескольких символов, на другом чуть

больше. Буквы, скажем совмещены на буквах A. Мы двигаем колесо и смотрим на сопостовление букв. Получается шифр простой

замены. Довольно проблематично взламывается.

2. Энигма. У нас есть клавиатура с символами и над каждой клавишей есть лампочка, которые спосбны иногда загораться.

У нас есть 3 диска, у каждого из которого 26 контактов на вход и 26 на выход. Прикаждом нажатии клавиши правый диск

поворачивается на 1. После того, как первый диск превышает 26 дисков, он поворачивается на 1, но второй

поворачивается на 2. Тогда получается, что каждый следующий символ шифруется новым шифром простой замены.

Всего здеь шифров простой замены 26^3. Немцы при том можно устанавливать в новые положения эти диски, а каждую неделю

менялись абсолютно все диски.

 

Криптоанализ.

В задачах на криптоанализ принимается так, что мы знаем шифр, мы знаем языки на которых зашифрован текст, короче мы знаем всё,

кроме расшифровки. У нас есть символы, которые часто встречаются и те, которые встречаются редко. Рассмотрим пример на

шифре простой замены и анализы частот.

 

 

Sixth

Критпоанализ

Рассмотрим нашу криптосистему. У нас есть A и B, которые переговариваются. Также у нас есть С, который хочет узнать о чём

переговариваются. Также есть такое правило Керфоргса о том, что компрементация криптосистемы не должна причинять удобства абонентам.

Рассмотрим типы атак на криптосистему:

1. Там известен только шифр системы - самая сложная атака и чаще всего невозможная.

2. Когда нам известен и открытый текст и зашифрованный текст. Здесь наша главная задача - выяснить ключ. Эта атака уже по-легче.

3. Нам известно любое кол-во зашифрованных текстов, которые соответствуют нашим открытым текстам.

Рассмотрим эти типы атак на шифре простой замены:

Атака третьего типа - очевидна.

Атака второго типа. У нас есть большой шифр-текст и какое-то маленькое слово, которое находится в этом тексте.

Атака первого типа. Она заключается в частотном анализе. Это не просто частотный анализ теста, это анализ N-грамм:

Рассмотрим пример на анализе би-грам. Анализ двух символов идущих подряд, скажем СТ встречается гораздо чаще, чем НН. Или предположем, что

у нас кто-то пишет письмо князю, то скорее всего у нас в начале идёт какая-нибудь фраза "Княже, челом бью" и т.п.

Теперь тоже самое, только с шифром гамминирования.

{0, 1...n-1}

m = m1,m2,m3... ml;

k = k1,k2,k3... kl;

c = c1,c2,c3... cl;

 

ci = mi |+| ki;

 

Допустим pi = P(mj = i)

qi = P(kj = i)

wi = P(Cj = i)

 

Тогда wi = СИГМА (ОТ j = 0 до n - 1) (p(i-j) * qj) = 1/n

Так как для любого i qi = 1/n

 

Поэтому ничего нельзя сказать о тексте знаю только его шифр.

Мы можем считать, что мы знаем всё о частотах, повторний букв, вероятности повторений букв и всевозможные ключи.

Мы сортируем ключи по вероятности и ставим их в левый столбик.

 

C1 C2 C3 C4 C5 C6 C7 C8 C9 C10...

K1

K2

K3

K4

K5

.

.

.

 

Человек будет чиать по столбцам слева на право и разгадывать шифр, а машина будет опять же отгадывать путём анализа би-грамм.

 

Рассмотрим такой случай. У нас 2 текста зашифрованные одинаковой гаммой. Что это нам даёт?

Предположим у нас c1^2 = m1^2 + k1. c1^1 = m1^1 + k1 => s = c1^2 - c1^1 = m1^2 b- m1^1.

S - это разность текстов. У нас появляются какие-то известные слова.

 

Теория Информации (Шенона)

Информация не зависит от длины сообщения.

Энтропия - среднее количество информации, которое мы може получить.

Н = СИГМА p * I(p) = СИГМА - p - log(p)

Свойства энтропии.

1. H (p1,... pn, 0) = H(p1,p2,... pn);

2. сигма - перестановка. Н (р1,... pn) = H (Pсигма(1),... Рсигма(2))

3. 0 <= Н (р1,... рn) <= log(n)

Взаимная информация(I (x <-> y)) = H(x) + H(y) - H (x,y)

 

x x1... xn

p1... pn

 

y y1... ym

p1... pm

 

x1... xn А сумма всех вероятностей в этой табличке = 1.

y1 p1 pn

....

....

ym pm pmn

 

Мы говорим, что Криптосистема сoвершенна, если I(C <-> K) = 0. То есть из шифра мы ничего не можем сказать по шифру о ключе.

H(x) = - Sum(0, 25) (pi * log(Pi))

H (x1, x2) = - Sum (0, 26^2 - 1) (pi * log (Pi))

 

1/2 H (x1, x2) - среднее кол-во информации.

1\n H(x1,... xn) - среднее кол-во информции приходящееся на один символ.

 

Значит энтропия языка Hl; = lim(n -> бескон., 1\n) * H(x1,..., xn)

 

H0 H1 H2 H3... H30

 

rus 5 4,35 3,52 3,03 1,37

 

eng 4,7 4,15 3,62 3,32 1,5

 

Неиспользуемая информация

log (СИГМА) - Hl

 

Rl = 1 - Hl / log(CИГМА) - неиспользуемая информация.

 

Zn = 2 ** (n * Hl) - кол-во осмысленных текстов длинны n.

 

Доля осмысленных сообщений - Zn / |СИГМА| ^ n = $A

 

Сколько осмысленных сообщений получится после расшифровки ~ |K| * $A = $B

 

Если $B <= 1, то мы можем однозначно текст.

 

$C = log |K| + n* Hl - n * log |СИГМА| <= 0

 

n >= log |K|/(log|СИГМА| - Hl)

Расстояние единственности N0 = верхняя граница ($C) <=

 

Seventh

 

---- ----------- / --- Web App \ Connector - DataBase

Web client Transport Web Server ---- Web App |

---- ---------- \---- Web App / Connector - DataBase

 

Всё, что у нас просиходит в интренете можно описать в общем почти двумя протоколами - HTTP и HTML.

Рассмотрим HTML.

Нас с точки зрения безопасности по большей части интресуют всякие штуки, которые вступают в интерактивный контакт с пользвователем.

Приложения могут хранить данные в полях type="hidden", могут быть различные поля типа input, textarea, button, object, script,

вот они будут нас интересовать. Потом все решили, что подключать различные библиотеки, сторонние скрипты - неудобно. Начали

делать XHTML, DHTML, ну а потом и вырос XML.

 

Теперь снову посмотрим на нашу схему.

У нас есть WebClient, который посылает запросы различные в Transport, ну а транспорт - это уже

HTTP - Hyper Text Transport Protocol. Сначала был просто HTTP/1.0, который был довольно простой, он не хранил состояние,

был формата ANCII, не хранил состояние и выходил из 80 порта. Притом, когда пользователь отправляет запрос, чтобы зайти

на страницу, то ему отвечает другая служба URL (Unified Resourse Link).

 

Что значит, что HTTP не хранит состояния? Когда мы залогиниваемся идёт передача данных на уровне сессий. Идёт передача параметров

и зная, что же происходит в протоколе мы сможем вклинится в соединние между сервером и нашим браузером. Что нам нужно чтобы

притворится клиентом? У нас злостный план, а мы притворяемся добрым и честным пользователем. Предположим у нас есть пользователь,

который посылает данные серверу, тогда нам нужно перехватить либо саму посылку пользователя, либо ответ от сервера. Что нам нужно,

для того, чтобы перехватить данные? Нам нужен и его МАС-адрес, и го IP-адрес. В сети заметно и то, и другое. Чего же нам хочется

на самом деле. Нам нужно не перехватить данные, а чтобы клиент думал, что клиент это сервер, а сервер думал, что мы это

пользователь. Это уже сложнее.

 

Ну нам же ведь нельзя просто так, чтобы человек сидел и случал, что же происходит между двумя пользователями. Нам нужно какой-то

шифрование данных. Есть такое шифрование SSL, которое погает не терять пакеты во время передачи и не даёт подслушивать всяким

плохим людям. Вот мы передали клиенту наш сертификат, а плохой человек сказал: "Эй, вот тебе сертификат!". Всёравно он сможет

только слушать, а изменять данные он по-прежнему не сможет.

 

Также есть такой механизм, как cookie. Куки передяются, как часть данных HTTP. Многие сайты для удобства пользователей используют

куки (RFC 2965). Куки это, как талон, который выдаётся сервер и каждый раз, когда мы его предъявляем сервер нас опознаёт.

Куки обычно хранятся либо в паняти, либо хешироваться на диске.

Чтоже у нас стоит под понятие хранение состояния? Это конечно авторизация. В HTTP есть следующие параметры аунтефикации:

Basic, Digest Form-based. Базовая аунтефикация происходит под шифрованием base64, которая даже обратимая. Это сделано для того,

чтобы просто сохранить целостность данных.

 

Также есть такая штука, как JavaScript, которая выполняется на клиентской машине, а не на локалхосте, что есть зло.

Некоторые такие штуки имеют SandBox, что означает, что она не может трогать другие файлы, а ограничена хорошей средой, которая

не даёт выходить за пределы того, что дано от пользователя.

 

Как мы делаем запрос к сайту. Перым делом, если мы указали доменное имя, то мы делаем запрос к серверу, выясняется IP-адрес и

уже устанавливается соединение с сервером через какой-то порт.

 

Nineth

 

 

Стеганография.

Мы уже поговорили про стеганографию прошлого и криптографию, теперь давайте перейдём к нашему времени и поговорим про

стеганографию. Существуют два способа сокрытия данных с помощью техники: на железе, среди кода.

Например у дискете неиспользуется нулевая дорожка, поэтому можно туда сокрыть информацию. Среди информации тоже можно сокрывать

информацию. Например можно подписать в конец картинки формата *.jpg какой-то код. Или в картинки формата.bmp можно тоже сокрыть

свой код изменяя последние три бита в байте, т.к. отклонение будет 1-2%, то глаз человека не заметит этого отклонения. Или

скажем заголовки, которые почти не где не используются. Туда тоже можно положить информацию при помощи утилит rdjpgcom и

wrjpgcom. Даже при сравнении файлов при помощи команды file, то она ничего не покажет. Файлы совершенно одинаковые.

Также есть такая утилита steghide, которая помогает прятать обычные файлы в файлы музыки, картинок и т.п.

steghide embed -cf DSC_0349.JPG -ef target.txt -sf res.jpg Притом даже если мы напишем hd - hexdump, то даже в хексе наших слов

не будет видно. Все данные зашифрованы алгоритмом AES.

 

Также есть такая программа называемая outguess, которая сначала сжимает фаил, а потом записываем непосредственно в картинку

изменяя пиксели. В этой шифровке имеются строгие ограничения на размер шифруемого файла - занимаемая информация должна быть

меньше процента.

Tenth

 

Существуют два вида шифров - поточные и блоковые.

Например ШПЗ - блоковый, а одноразовый блокнот - поточный потому, что ШПЗ - сразу шифрует блоки, а по блокноту или скажем в шифровке

RSA - шифруется сразу поток символов. Реализуем одноразовый блокнот на примере машинного варианта.

3 2 1 0

1 1 1 0

Как мы это делаем. Мы ксорим 3 и 2, передвигаем их влево на 1 и в последний бит записываем результат ксора. И так проделываем

много раз. Получается довольно длинная последовательность из 16-32 символов. Как её расшифровать? В большинстве слчаев

это просто система уравнений и решается всегда за линейное время. Теперь нам как-то её усложнить при помощи регистров сдвига.

 

3 2 1 0

1 1 1 0

6 5 4 3 2 1 0

.......

V V V V |

|_XOR_| |XOR| |

V__________V____

 

 

Возьмём набор случайных чисел:

_1_0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0

|-XOR------ 1_0 0 1 0 0 0 1 1 1 1 1 0 0 0 1 0 1-1

1---_1_1 0 1 0 1 0 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1-0

|XOR_1_0 1 1 0 0 1 1 0 1 0 0 0 1 1 0 1 1 1 1 0 0-1

 

RSA.

На самом деле у этой шифровки очень простая идеалогия. Она основана на простых числах. Пусть у нас есть два простых числа

p, q, n = p * q и exp. Экспонента обычно берётся либо = 3, либо 2 ** 16 + 1. Пусть у нас Х - открытый текст, Y<4096 - шифрованый

текст. y = (x ** e) mod n. А теперь про вычисления, пусть у нас x = (10 ** 50)**(2**16 + 1).

Функция Эйлера - кол-во взаимнопростых с N = (p1 - 1)(p2 - 1)... (pn - 1).

d = e **(-1). d * e = 1. (d = e ** (-1) mod Ф(n)). Ф(n) = (p - 1)(q - 1)

Zn = { 0, 1... n }.

Z(Ф(n)) = {0,1,...Ф(n);

3 + Z8 7 = 2 = 10 mod 8

Далее по расширенной Теореме x,y a,b x * a + (y * b) = 1 --> y * b = 0, x = e = 1/a --> мы можем найти Ф(n) -->

x = (y ** d) mod n

 

Бинарное возведение в степень.

Вход n, e = (en-1,... e0)

Выход z = n ** e

1) q = n

if (e0 == 1) { z = n; }

else z = 1;

2) for (i = 1, i < n, i++) {

q = q ** 2

if (e[i] == 1) z = z*q

}

 


Дата добавления: 2015-09-18 | Просмотры: 354 | Нарушение авторских прав







При использовании материала ссылка на сайт medlec.org обязательна! (0.117 сек.)