Форум сайта python.su
user555В этой 57-й строке у тебя N равно 4, похоже на опечатку.
57 Возвращаюсь к строке 52, беру следующее значение N=4 и передаю CWS=60 в цикл N.
user555Выходные данные не сокращай, запиши все строки.
Выходные данные
Отредактировано py.user.next (Июнь 30, 2024 00:46:43)
Офлайн
user555
CWS - размер буфера в байтах. Размер буфера меняется как в большую, так и в меньшую сторону.
Офлайн
xam1816Точно так, но суть исследования чуть-чуть другая. Если желаете опишу. После того, как пересчитаю полученные результаты, а то я от своих детских ошибок уже красный сижу перед монитором.
Как я понял cws - это количество байт, которые сервер может отправлять клиенту без подтверждения, что клиент их принял, дойдя до этого числа сервер останавливает передачу и ждет подтверждения от клиента
user555Исправил.
В этой 57-й строке у тебя N равно 4, похоже на опечатку.
py.user.nextДополнил. Еще раз проверил.
Выходные данные не сокращай, запиши все строки.
Отредактировано user555 (Июнь 30, 2024 01:52:09)
Офлайн
user555Из предыдущих сообщений понял что идея в том, когда серверу выделено образно 1000 байт он отправил только 500,и злоумышленник этим воспользовался и передал своих еще 500. Если клиент отправил обратно ASK - подтверждение что прочитал 1000 (500 сервер + 500 злоумышленник), то значит атака удалась. Стоит вопрос возможно ли это
Точно так, но суть исследования чуть-чуть другая. Если желаете опишу.
Офлайн
xam1816Верно. Суть оценить доступные окна, для каждого пакета данных (в моем пример это строки с port1=443), потом нужно учесть время работы скрипта по модификации перехваченного пакета, плюс оценить задержку на передачу и понять в пределах сетевой сессии, насколько это будет успешно, сервер ведь тоже в этот момент продолжает передачу. И может получиться так, что окно на которое рассчитывает злоумышленник уже закроется полезными данными. Оценить эту возможность при проводном подключении и через сеть подвижной мобильной связи, так как сама суть работы сетей подвижной мобильной связи заставляет работать с большими окнами, что бы утилизировать канал связи более эффективно.
Из предыдущих сообщений понял что идея в том, когда серверу выделено образно 1000 байт он отправил только 500,и злоумышленник этим воспользовался и передал своих еще 500. Если клиент отправил обратно ASK - подтверждение что прочитал 1000 (500 сервер + 500 злоумышленник), то значит атака удалась. Стоит вопрос возможно ли это
Отредактировано user555 (Июнь 30, 2024 02:46:08)
Офлайн
user555Пока что так фиксируем алгоритм, входные данные и выходные данные.
Входные данные:Выходные данныеNo. Time port1 Seq CWS
1 0.01 53023 - 50
2 0.02 443 0 -
3 0.03 53023 - 55
4 0.04 443 49 -
5 0.05 53023 - 60
6 0.06 443 100 -
7 0.07 53023 - 70
8 0.08 443 140 -
9 0.09 53023 - 100
10 0.10 53023 - 100
11 0.11 443 210 -
12 0.12 443 240 -
13 0.13 443 270 -
14 0.14 53023 - 105
15 0.15 443 300 -
16 0.16 53023 - 150
17 0.17 443 400 -
18 0.18 443 550 -
19 0.19 53023 - 160
20 0.20 443 650 -
21 0.21 443 670 -
22 0.22 443 700 -
23 0.23 53023 - 170
24 0.24 443 800 -
25 0.25 443 850 -
26 0.26 53023 - 100
27 0.27 443 900 -
28 0.28 443 920 -
29 0.29 53023 - 100
30 0.30 443 940 -Алгоритм:0.02 # для 02-й строки - разность Time между 04-й строкой и 02-й строкой
0.02 # для 04-й строки - разность Time между 06-й строкой и 04-й строкой
0.02 # для 06-й строки - разность Time между 08-й строкой и 06-й строкой
0.04 # для 08-й строки - разность Time между 12-й строкой и 08-й строкой
0.04 # для 11-й строки - разность Time между 15-й строкой и 11-й строкой
0.03 # для 12-й строки - разность Time между 15-й строкой и 12-й строкой
0.04 # для 13-й строки - разность Time между 17-й строкой и 13-й строкой
0.02 # для 15-й строки - разность Time между 17-й строкой и 15-й строкой
0.01 # для 17-й строки - разность Time между 18-й строкой и 17-й строкой
0.04 # для 18-й строки - разность Time между 22-й строкой и 18-й строкой
0.04 # для 20-й строки - разность Time между 24-й строкой и 20-й строкой
0.03 # для 21-й строки - разность Time между 24-й строкой и 21-й строкой
0.03 # для 22-й строки - разность Time между 25-й строкой и 22-й строкой
0.03 # для 24-й строки - разность Time между 27-й строкой и 24-й строкой
0.05 # для 25-й строки - разность Time между 30-й строкой и 25-й строкой
0.03 # для 27-й строки - разность Time между 30-й строкой и 27-й строкой
0.02 # для 28-й строки - разность Time между 30-й строкой и 28-й строкой
0.00 # для 30-й строки - разность Time между 30-й строкой и 30-й строкой
01 Получаю общее количество строк в датафрейме. Значение 30.
02 Задаю начальное значение CWS = 1073725440 (максимально возможное согласно спецификации), передаю его в цикл I в качестве начального.
03 Запускаю цикл для I от 1 до 30 и значением CWS.
04 I=1 (первый шаг цикла на строке 03)
05 Цикл I=1 начат со значением CWS=1073725440.
06 Если в строке I=1 значение port1 равно 53023, извлекаю из неё значение CWS.
07 Присваиваю CWS=50.
08 Возвращаюсь к строке 03, беру следующее значение I=2 и передаю в цикл I значение CWS=50.
09 I=2 (следующий шаг цикла на строке 03)
10 Цикл I=2 начат со CWS=50.
11 Если в строке I=2 значение port1 равно 443, извлекаю значения TimeI и seqI.
12 Time2 = 0.02, seq2 = 0
13 Передаю в цикл N значение CWS из цикла I. Начальное значение CWS=50 в цикле N.
14 Запускаю цикл N от N=I+1 до 30 и значенем CWS. от 3 до 30.
15 N=3 (первый шаг цикла на строке 14)
16 Цикл N=3 начат со значением CWS=50.
17 Если в строке N=3 значение port1 равно 53023, извлекаю значение CWS.
18 Присваиваю CWS=55.
19 Возвращаюсь к строке 14, беру следующее значение N=4 и передаю CWS=55 в цикл N.
20 N=4 (следующий шаг цикла на строке 14)
21 Цикл N=4 начат со значением CWS=55.
22 Если в строке N=4 значение port1 равно 443, извлекаю значения seqN.
23 seq4 = 49
24 Проверяю условие seqN-seqi <= CWS. seq4-seq2 <= CWS. 49-0 <= 55. Условие соблюдается.
25 Если условие соблюдается возращаюсь к строке 14 и беру следующее значение N=5.
26 N=5 (следующий шаг цикла на строке 14)
27 Цикл N=5 начат со значением CWS=55.
28 Если в строке N=5 значение port1 равно 53023, извлекаю значение CWS.
29 Присваиваю CWS=60.
30 Возвращаюсь к строке 14, беру следующее значение N=6 и передаю CWS=60 в цикл N.
31 N=6 (следующий шаг цикла на строке 14)
32 Цикл N=6 начат со значением CWS=60.
33 Если в строке N=6 значение port1 равно 443, извлекаю значения seqN.
34 seq6 = 100
35 Проверяю условие seqN-seqi <= CWS. seq6-seq2 <= CWS. 100-0 <= 60. Условие не соблюдается.
36 Ищу в цикле N (цикл N , начинающийся в строке 14), строку в которой условие соблюдалось последний раз.
37 Это строка N=4.
38 В строке 4 извлекаю значение Time4 = 0.04.
39 Вычисляю TimeN-TimeI. Time4-Time2=0.02
40 Вывожу значение в файл csv.
41 Возвращаюсь к строке 03 со следующим значением I=3.
42 I=3 (следующий шаг цикла на строке 03)
43 Цикл I=3 начат со CWS=50. (В цикл I другое значение CWS не передавалось)
44 Если в строке I=3 значение port1 равно 53023, то извлекаю из неё значение CWS.
45 Присваиваю CWS=55
46 Возвращаюсь к строке 03, беру следующее значение I=4 и передаю в цикл I значение CWS=55.
47 I=4 (следующий шаг цикла на строке 03)
48 Цикл I=4 начат со значением CWS=55.
49 Если в строке I=4 значение port1 равно 443, извлекаю значения TimeI и seqI.
50 Time4 = 0.04, seq4 = 49
51 Передаю в цикл N значение CWS из цикла I. Начальное значение CWS=55 в цикле N.
52 Запускаю цикл N от N=I+1 до 30 и значенем CWS. от 5 до 30.
53 N=5 (первый шаг цикла на строке 52)
54 Цикл N=5 начат со значением CWS=55.
55 Если в строке N=5 значение port1 равно 53023, извлекаю значение CWS.
56 Присваиваю CWS=60.
57 Возвращаюсь к строке 52, беру следующее значение N=6 и передаю CWS=60 в цикл N.
58 N=6 (следующий шаг цикла на строке 52)
59 Цикл N=6 начат со значением CWS=60.
60 Если в строке N=6 значение port1 равно 443, извлекаю значения seqN.
61 seq6 = 100
62 Проверяю условие seqN-seqi <= CWS. seq6-seq4 <= CWS. 100-49 <= 60. Условие соблюдается.
63 Если условие соблюдается возращаюсь к строке 52 и беру следующее значение N=7.
64 N=7 (следующий шаг цикла на строке 52)
65 Цикл N=7 начат со значением CWS=60.
66 Если в строке N=7 значение port1 равно 53023, извлекаю значение CWS.
67 Присваиваю CWS=70.
68 Возвращаюсь к строке 52, беру следующее значение N=8 и передаю CWS=70 в цикл N.
69 N=8 (следующий шаг цикла на строке 52)
70 Цикл N=8 начат со значением CWS=70.
71 Если в строке N=8 значение port1 равно 443, извлекаю значение seqN.
72 seq8 = 140
73 Проверяю условие seqN-seqi <= CWS. seq8-seq4 <= CWS. 140-49 <= 70. Условие не соблюдается.
74 Ищу в цикле N (цикл N , начинающийся в строке 52), строку в которой условие соблюдалось последний раз.
75 Это строка N=6.
76 В строке 6 извлекаю значение Time6 = 0.06.
77 Вычисляю TimeN-TimeI. Time6-Time4=0.02
78 Вывожу значение в файл csv.
79 Возвращаюсь к строке 03 со следующим значением I=5.
80 I=5 (следующий шаг цикла на строке 03)
81 Цикл I=5 начат со значением CWS=55. (В цикл I другое значение CWS не передавалось)
…
>>> def read_data(ifname): ... #data = pd.read_csv(ifname, delimiter=',') ... print('Read csv data from', ifname) ... data = 'csv data' ... return data ... >>> def clear_data(data): ... print('Clear data') ... return 'clean data' ... >>> def search_data(data): ... print('Search data') ... return 'found data' ... >>> def write_result(ofname, data): ... print('Write data to', ofname) ... >>> def run_all(): ... data = read_data('data.csv') ... data_clean = clear_data(data) ... data_found = search_data(data_clean) ... write_result('data_out.txt', data_found) ... >>> run_all() Read csv data from data.csv Clear data Search data Write data to data_out.txt >>>
Отредактировано py.user.next (Июнь 30, 2024 07:19:27)
Офлайн
py.user.next
Спасибо за подсказки.
Тогда я это всё переварю, сформирую второй алгоритм. Разработаю код. Проверю как он выполняется. Посмотрю сколько времени это занимает.
Только один вопрос у меня созрел, прежде чем я начну.
Понятно, что для начала мне лучше организовать работу с данными последовательно, что бы не запутаться.
Я так и собираюсь сделать.
Но нельзя ли функцию очистку исключить, задачу с переполнением решить введением в первоначальный алгоритм простой проверки условия seqN-seqi <= 0 в цикле N (строки 16, 26, 36, 61, 71), так как переполнение может возникнуть только в цикле N при определенных значениях I.
В тот момент, когда обнаружу, что например левая сторона условия seqN-seqi <= CWS приняла отрицательное или 0 значение, добавлю к seqN значение 4294967296. И буду это делать тогда, когда будет это переполнение в цикле N.
Например блок данные, в которых имеется переполнение:
No. Time port1 Seq CWS 100920 456.20 53023 - 100 100921 456.21 443 4294967294 - 100922 456.22 53023 - 100 100923 456.23 443 4294967295 - 100924 456.24 443 50 - 100925 456.25 443 130 - 100926 456.26 53023 - 100 100927 456.27 443 150 - 100928 456.28 443 170 - 100929 456.29 53023 - 100 100930 456.30 443 200 - 100931 456.31 443 210 - 100932 456.32 53023 - 100 100933 456.33 443 250 - 100934 456.34 443 255 -
Отредактировано user555 (Июнь 30, 2024 15:23:57)
Офлайн
user5551. Сделай код алгоритма “Поиск”.
Но нельзя ли функцию очистку исключить, задачу с переполнением решить введением в первоначальный алгоритм простой проверки условия seqN-seqi <= 0 в цикле N (строки 16, 26, 36, 61, 71), так как переполнение может возникнуть только в цикле N при определенных значениях I.
Отредактировано py.user.next (Июнь 30, 2024 20:23:01)
Офлайн
py.user.next
1. Сделай код алгоритма “Поиск”.
import pandas as pd data = pd.read_csv("data2.csv", delimiter=";") CWS = 1073725440 count = data.shape[0] for i in range(0, count): port = data.at[i, "port1"] if port == 53023: CWS = int(data.at[i, "CWS"]) elif port == 443 and i != count - 1: TimeI = float(data.at[i, "Time"]) SeqI = int(data.at[i, "Seq"]) CWSN = CWS for n in range(i + 1, count): port = data.at[n, "port1"] if port == 53023: CWSN = int(data.at[n, "CWS"]) if port == 443: SeqN = int(data.at[n, "Seq"]) Seq = SeqN - SeqI if Seq <= CWSN: ok = n if Seq >= CWSN or n == count - 1: TimeN = float(data.at[ok, "Time"]) # SeqOK = int(data.at[ok, "Seq"]) - SeqI T = TimeN - TimeI print(round(T, 5)) # print(round(T, 5),"| разница м/у",f"{i+1:02}", "-й и",f"{ok+1:02}","-й стр.","| нач. зн-е CWS=",f"{CWS:03}","| кон-е знач-е CWS=",f"{CWSN:03}","| кол-во перед-х данных",SeqOK,) break elif port == 443 and i == count - 1: T = 0.00 # print(round(T, 5), " |", i + 1, "-я - последняя строка значение CWS=", CWS) print(round(T, 5))
0.02 #| разница м/у 02 -й и 04 -й стр. | нач. зн-е CWS= 050 | кон-е знач-е CWS= 060 | кол-во перед-х данных 49 0.02 #| разница м/у 04 -й и 06 -й стр. | нач. зн-е CWS= 055 | кон-е знач-е CWS= 070 | кол-во перед-х данных 51 0.02 #| разница м/у 06 -й и 08 -й стр. | нач. зн-е CWS= 060 | кон-е знач-е CWS= 100 | кол-во перед-х данных 40 0.04 #| разница м/у 08 -й и 12 -й стр. | нач. зн-е CWS= 070 | кон-е знач-е CWS= 100 | кол-во перед-х данных 100 0.04 #| разница м/у 11 -й и 15 -й стр. | нач. зн-е CWS= 100 | кон-е знач-е CWS= 150 | кол-во перед-х данных 90 0.03 #| разница м/у 12 -й и 15 -й стр. | нач. зн-е CWS= 100 | кон-е знач-е CWS= 150 | кол-во перед-х данных 60 0.04 #| разница м/у 13 -й и 17 -й стр. | нач. зн-е CWS= 100 | кон-е знач-е CWS= 150 | кол-во перед-х данных 130 0.02 #| разница м/у 15 -й и 17 -й стр. | нач. зн-е CWS= 105 | кон-е знач-е CWS= 150 | кол-во перед-х данных 100 0.01 #| разница м/у 17 -й и 18 -й стр. | нач. зн-е CWS= 150 | кон-е знач-е CWS= 150 | кол-во перед-х данных 150 0.04 #| разница м/у 18 -й и 22 -й стр. | нач. зн-е CWS= 150 | кон-е знач-е CWS= 170 | кол-во перед-х данных 150 0.04 #| разница м/у 20 -й и 24 -й стр. | нач. зн-е CWS= 160 | кон-е знач-е CWS= 170 | кол-во перед-х данных 150 0.03 #| разница м/у 21 -й и 24 -й стр. | нач. зн-е CWS= 160 | кон-е знач-е CWS= 170 | кол-во перед-х данных 130 0.03 #| разница м/у 22 -й и 25 -й стр. | нач. зн-е CWS= 160 | кон-е знач-е CWS= 100 | кол-во перед-х данных 150 0.03 #| разница м/у 24 -й и 27 -й стр. | нач. зн-е CWS= 170 | кон-е знач-е CWS= 100 | кол-во перед-х данных 100 0.05 #| разница м/у 25 -й и 30 -й стр. | нач. зн-е CWS= 170 | кон-е знач-е CWS= 100 | кол-во перед-х данных 90 0.03 #| разница м/у 27 -й и 30 -й стр. | нач. зн-е CWS= 100 | кон-е знач-е CWS= 100 | кол-во перед-х данных 40 0.02 #| разница м/у 28 -й и 30 -й стр. | нач. зн-е CWS= 100 | кон-е знач-е CWS= 100 | кол-во перед-х данных 20 0.0 #| 30 -я - последняя строка значение CWS= 100
py.user.nextФункции так просто мне пока не сдаются, буду изучать. Поэтому алгоритм “Очистка” пока не будем рассматривать.
2. В алгоритме “Очистка” сделай временный код, который просто удаляет строки с переполнением.
3. Функцию алгоритма “Очистка” сделай в виде генераторной фунции.
py.user.next
1. Имя CSV-файла поступает в алгоритм “Чтение”.
2. Прочитанные CSV-данные поступают в алгоритм “Поиск”.
3. Найденные данные и имя файла результата поступают в алгоритм “Запись”.
py.user.nextЕсли Вы мне поведали про моноширинные шрифты, просветите тогда пожалуйста, что тут (в моём коде) будет функция и как она будет возвращать данные из алгоритма “Поиск” в алгоритм “Запись”.
Тут пример того, как записать на функциях это
py.user.nextП.С. а еще расскажите как Вы убираете пробел вначале кода или данных, у Вас его нет, а у меня есть, хотя я его не ставлю?
(Кстати, видишь, да, она ровненькая? Это потому, что я её выравнивал в редакторе с моноширинным шрифтом, а потом вставлял на форум через буфер обмена.)
Отредактировано user555 (Июль 1, 2024 23:44:33)
Офлайн
user555Тут движок форума самодельный, поэтому тут много всяких ошибок, которые тяжело исправлять. Нельзя просто взять и скачать обновления, чтобы исправить ошибки, потому что обновлений нет, их надо делать самому. Поэтому тут ошибки эти есть и они не исправляются, так как это тяжело делать.
П.С. а еще расскажите как Вы убираете пробел вначале кода или данных, у Вас его нет, а у меня есть, хотя я его не ставлю?
print("Hello 1") print("Hello 2") print("Hello 3")
[code python]пробел
строка кода на питоне
строка кода на питоне
строка кода на питоне
[/code]
[code python]пробел
строка кода на питоне
пробел
строка кода на питоне
пробел
строка кода на питоне
[/code]
[code]
строка данных
строка данных
строка данных
[/code]
Отредактировано py.user.next (Июль 2, 2024 03:48:03)
Офлайн