Сейчас на форуме: tyns777, Lohmaty (+6 невидимых)

 eXeL@B —› Вопросы новичков —› Как подобрать добавочные байты, чтобы сошлась MD5 сумма файла?
<< . 1 . 2 . 3 . >>
Посл.ответ Сообщение

Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 23 июня 2018 19:20
· Личное сообщение · #1

Прошу немного просветить про МД5.
Вобщем есть прошивка под контроллер. В ней проверяется целостность байт по следующей схеме:
Считается MD5 сумма, заданного количества байт (все полезные байты прошивки). Потом эта сумма криптуется алгоритмом RSA с 1760 битным ключем. Менять RSA ключи нельзя, они проверяются. (Вернее можно, но придется прошивку в корне переписать).
Что я хочу сделать. Увеличить размер проверяемых байт (например) на размер блока МД5, 64 байта. И подобрать эти последние добавленные байты, так чтобы сумма МД5 нового файла прошивки сошлась с суммой оригинальной прошивки.
Соответственно вопросы:
1. Не преувеличиваю-ли я размер добавляемых байт? Может достаточно добавить 4 - 16 байт?
2. Есть какие-то известные брутфорсы, которые допускают ввести начальную МД5, отличную от стандартной (0123456789ABCDEFFEDCBA9876543210), и считающую размер в битах для финального блока не от нуля, а от заданного размера?



Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 23 июня 2018 22:15
· Личное сообщение · #2

Там точно не участвует размер кода? - Откуда такая уверенность?
Я выше писал, что этот размер я поменяю, на какой надо. Цифры этого размера не учавствуют в формировании МД5, эти цифры прописаны в конце лицензии полученной из МД5. Их можно просто изменить и все, даже МД5 под них не придется корректировать.
И проверками занимается код из этой самой прошивки?
Даже немного сложнее, полная прошивка разбита на бут и саму прошивку. Проверка МД5, для байт из бут-области, идет из обоих этих частей. На данный момент я пофиксил эти проверки, все работает. Но мне придется каждый раз править файл именно прошивки, который обновляет прошивку в контроллере, чтобы все работало как надо. Поэтому и надо подогнать МД5 бут-байт, чтобы контроллер спокойно обновлялся стоковой прошивкой.
Взял бы уже реализацию мд5 на понятном тебе языке да посмотрел.
Где-ж его взять-то? Автор BarsWF не пишет на Делфи. Да я в принципе понимаю алгоритм МД5. Я даже себе утилитку сам написал, для подсчета этого хеш, без всяких исходников и доп-модулей. У меня желание переписать именно BarsWF под ввод начального вектора и начального размера. Это, насколько мне известно, самый быстрый брутер. Если перепишу, то уж комп с нужной видюхой ATI или nVidia точно найду. И буду брутить на них.




Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 23 июня 2018 22:18
· Личное сообщение · #3

Kuzya69 пишет:
Где-ж его взять-то? Автор BarsWF не пишет на Делфи. Да я в принципе понимаю алгоритм МД5. Я даже себе утилитку сам написал, для подсчета этого хеш, без всяких исходников и доп-модулей. У меня желание переписать именно BarsWF под ввод начального вектора и начального размера. Это, насколько мне известно, самый быстрый брутер. Если перепишу, то уж комп с нужной видюхой ATI или nVidia точно найду. И буду брутить на них.
Ну так загляни в алгоритм для куды например в md5_kernel.cu, ничего знакомого не видишь?

-----
2 оттенка серого




Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 23 июня 2018 22:28 · Поправил: dosprog
· Личное сообщение · #4

Разберись с алгоритмом на Си.
Арифметика там практически такая же, как и в Паскале.
Вопросы и отпадут

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


А хочешь - можешь взять семпл у паскальщиков
- не проверял: --> Link <--





Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 23 июня 2018 22:33 · Поправил: Kuzya69
· Личное сообщение · #5

Ну так загляни в алгоритм для куды например в md5_kernel.cu, ничего знакомого не видишь?
Да НЕКОТОРЫЕ Си-шные команды я понимаю. Дворд-константы от формулы T[i] = [4294967296 * abs(sin(i))] вижу, константы сдвигов, индексов двордов..... Все вижу. Но переписать и скомпилить сам не смогу. (Может скомпилить и смогу, или попрошу кого-нибудь).
Разве вам самим не интересно заиметь такой брутер с расширенным функционалом?
Разберись с алгоритмом на Си.
Я в принципе иногда перевожу на Делфи коротенькие, и не сильно заумные Си-шные сырцы. Но тут проект явно мне не по зубам.



Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 23 июня 2018 22:41
· Личное сообщение · #6

Я нихера не понял, но в принципе есть еще вариант в автоматическом режиме делать правку - заменять RSA ключ на свой.
Да если-бы так просто, мне просто щас придется писать целый роман. Давайте примем за аксиому, что нельзя. Давайте на МД5 прицелимся. Если надо объясню. Я и так сокращаю свои посты, чтобы не писать весь алгоритм проверки, там все проверки "цепляются" друг за друга. К тому-же RSA ключей там 5 штук, и они (не все) после криптовки по AES-128 передаются в управляющую программу для проверки.



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 23 июня 2018 22:42 · Поправил: dosprog
· Личное сообщение · #7

Kuzya69 пишет:
Я в принципе иногда перевожу на Делфи коротенькие, и не сильно заумные Си-шные сырцы.

Оно, конечно, полезно, - для общего развития. - но непродуктивно по факту.

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

Kuzya69 пишет:
Разве вам самим не интересно заиметь такой брутер с расширенным функционалом?

) Тебе честно сказать?..


Смотри сам.
Оцениваю эту затею в убитый на виртуальную проблему выходной.
С непредсказуемым результатом.







Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 23 июня 2018 22:45 · Поправил: f13nd
· Личное сообщение · #8

Code:
  1.                         data[0]=(data[0]&0xffffff00)+(charset_c[s1]);
  2.  
  3.                         a=0x67452301;b=0xefcdab89;c=0x98badcfe;d=0x10325476;
  4.  
  5.                         /* Round 1 */
  6.                         FF2 (a, b, c, d, data[0], S11, 0xd76aa478,0,0); /* 1 */
  7.                         FF2 (d, a, b, c, data[1], S12, 0xe8c7b756,1,1); /* 2 */
  8.                         FF2 (c, d, a, b, data[2], S13, 0x242070db,2,2); /* 3 */
  9.                         FF2 (b, c, d, a, data[3], S14, 0xc1bdceee,3,3); /* 4 */
  10.  
  11.  
  12.                         FF2 (a, b, c, d, 0, S11, 0xf57c0faf,4,15); /* 5 */ //5th and so forth is 0
  13.                         FF2 (d, a, b, c, 0, S12, 0x4787c62a,5,15); /* 6 */
  14.                         FF2 (c, d, a, b, 0, S13, 0xa8304613,6,15); /* 7 */
  15.                         FF2 (b, c, d, a, 0, S14, 0xfd469501,7,15); /* 8 */
  16.                         FF2 (a, b, c, d, 0, S11, 0x698098d8,8,15); /* 9 */
  17.                         FF2 (d, a, b, c, 0, S12, 0x8b44f7af,9,15); /* 10 */
  18.                         FF2 (c, d, a, b, 0, S13, 0xffff5bb1,10,15); /* 11 */
  19.                         FF2 (b, c, d, a, 0, S14, 0x895cd7be,11,15); /* 12 */
  20.                         FF2 (a, b, c, d, 0, S11, 0x6b901122,12,15); /* 13 */
  21.                         FF2 (d, a, b, c, 0, S12, 0xfd987193,13,15); /* 14 */
  22.                         FF2 (c, d, a, b, len, S13, 0xa679438e,14,14); /* 15 */
  23.                         FF2 (b, c, d, a, 0, S14, 0x49b40821,15,15); /* 16 */
  24.  
  25.                         /* Round 2 */
  26.                         GG2 (a, b, c, d, data[1], S21, 0xf61e2562,16,1); /* 17 */
  27.                         GG2 (d, a, b, c, 0, S22, 0xc040b340,17,15); /* 18 */
  28.                         GG2 (c, d, a, b, 0, S23, 0x265e5a51,18,15); /* 19 */
  29.                         GG2 (b, c, d, a, data[0], S24, 0xe9b6c7aa,19,0); /* 20 */
  30.                         GG2 (a, b, c, d, 0, S21, 0xd62f105d,20,15); /* 21 */
  31.                         GG2 (d, a, b, c, 0, S22,  0x2441453,21,15); /* 22 */
  32.                         GG2 (c, d, a, b, 0, S23, 0xd8a1e681,22,15); /* 23 */
  33.                         GG2 (b, c, d, a, 0, S24, 0xe7d3fbc8,23,15); /* 24 */
  34.                         GG2 (a, b, c, d, 0, S21, 0x21e1cde6,24,15); /* 25 */
  35.                         GG2 (d, a, b, c, len, S22, 0xc33707d6,25,14); /* 26 */
  36.                         GG2 (c, d, a, b, data[3], S23, 0xf4d50d87,26,3); /* 27 */
  37.                         GG2 (b, c, d, a, 0, S24, 0x455a14ed,27,15); /* 28 */
  38.                         GG2 (a, b, c, d, 0, S21, 0xa9e3e905,28,15); /* 29 */
  39.                         GG2 (d, a, b, c, data[2], S22, 0xfcefa3f8,29,2); /* 30 */
  40.                         GG2 (c, d, a, b, 0, S23, 0x676f02d9,30,15); /* 31 */
  41.                         GG2 (b, c, d, a, 0, S24, 0x8d2a4c8a,31,15); /* 32 */
  42.  
  43.                         /* Round 3 */
  44.                         HH2 (a, b, c, d, 0, S31, 0xfffa3942,32,15); /* 33 */
  45.                         HH2 (d, a, b, c, 0, S32, 0x8771f681,33,15); /* 34 */
  46.                         HH2 (c, d, a, b, 0, S33, 0x6d9d6122,34,15); /* 35 */
  47.                         HH2 (b, c, d, a, len, S34, 0xfde5380c,35,14); /* 36 */
  48.                         HH2 (a, b, c, d, data[1], S31, 0xa4beea44,36,1); /* 37 */
  49.                         HH2 (d, a, b, c, 0, S32, 0x4bdecfa9,37,15); /* 38 */
  50.                         HH2 (c, d, a, b, 0, S33, 0xf6bb4b60,38,15); /* 39 */
  51.                         HH2 (b, c, d, a, 0, S34, 0xbebfbc70,39,15); /* 40 */
  52.                         HH2 (a, b, c, d, 0, S31, 0x289b7ec6,40,15); /* 41 */
  53.                         HH2 (d, a, b, c, data[0], S32, 0xeaa127fa,41,0); /* 42 */
  54.                         HH2 (c, d, a, b, data[3], S33, 0xd4ef3085,42,3); /* 43 */
  55.                         HH2 (b, c, d, a, 0, S34,  0x4881d05,43,15); /* 44 */
  56.                         HH2 (a, b, c, d, 0, S31, 0xd9d4d039,44,15); /* 45 */
  57.                         HH2 (d, a, b, c, 0, S32, 0xe6db99e5,45,15); /* 46 */
  58.                         if(d!=td)continue;
  59.                         HH2 (c, d, a, b, 0, S33, 0x1fa27cf8,46,15); /* 47 */
  60.                         HH2 (b, c, d, a, data[2], S34, 0xc4ac5665,47,2); /* 48 */
  61.  
  62.                         /* Round 4 */
  63.                         II2 (a, b, c, d, data[0], S41, 0xf4292244,48,0); /* 49 */


Я к тому что это просто мд5. Сишного в нем только оператор присвоения ("=") Ну может еще пара загогулин.

-----
2 оттенка серого




Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 23 июня 2018 22:58 · Поправил: Kuzya69
· Личное сообщение · #9

Когда задолбёшься этим заниматься, придёшь сам, к чему говорю.
Да я это и сам понимаю. Просто, несколько лет назад, я вообще не умел программировать и знал слегка только Фортран в рамках институтской программы. Я поступил в институт в 1986 году. Я стараюсь изучать Си, но у меня это плохо получается (может возраст сказывается). Делфи-то мне помог один мальчишка изучить, спасибо ему.
Я к тому что это просто мд5. Сишного в нем только оператор присвоения ("=")
Верю и вижу, но тут нет начальной размерности пароля и начального вектора. А где их искать дальше, я не знаю. Тем более не знаю как их изменить, как заставить прогу принимать еще два параметра из командной строки.
Можно конечно попробовать заняться мазохизмом. Загрузить прогу в Олли, и найти там (с машинным асмом вроде особых проблем нет). Потом написать лоадер. Но это сущее извращение.
А уж как быть с CUDA я вообще в пролете.



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 23 июня 2018 23:04 · Поправил: dosprog
· Личное сообщение · #10

Ну, выложил ссылку на алго MD5 на Паскале.
Задай короткую строку и добавку к ней, переменной длины,
посчитай её (строки) md5, запомни ёе (md5), инкрементируй первый байт строки
и добавляй к ней по байту (из добавки) с перебором, пересчитвыая md5 для новой строки до получения запомненной суммы.
) О результатах, плизз, отпиши.

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





Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 23 июня 2018 23:21 · Поправил: Kuzya69
· Личное сообщение · #11

Ну, выложил ссылку на алго MD5 на паскале....
О результатах, плизз, отпиши.

Зачем все это, доказать что я знаю Делфи или МД5? В первом случае могу выложить свою реализацию, во втором - так-же докажет моя реализация. Правда у меня более короткий по количеству кода, но более медленный алгоритм, там все в циклах.. Меня он устраивает, для подсчета МД5. Но для брута он будет медленным, так-же как и выложенный вами по ссылке. Я поэтому и зацепился за BarsWF. Там как обещает автор и SSE и CUDA и поддержка AMD-ATI видюх.
по ссылке не полова.
Что такое "полова"?




Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 23 июня 2018 23:26
· Личное сообщение · #12

Kuzya69 пишет:
Что такое "полова"?

солома

-----
2 оттенка серого




Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 23 июня 2018 23:29
· Личное сообщение · #13

солома
Легче не стало. Имеется ввиду "шляпа"(соломенная) - типа плохой код?



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 23 июня 2018 23:30 · Поправил: dosprog
· Личное сообщение · #14

)) Не солома, - а то, что остаётся от молочения зерна.
То бишь херня.





Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 23 июня 2018 23:34
· Личное сообщение · #15

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



Ранг: 158.4 (ветеран), 123thx
Активность: 0.140.49
Статус: Участник

Создано: 23 июня 2018 23:44
· Личное сообщение · #16

Kuzya69 пишет:
Давайте примем за аксиому, что нельзя. Давайте на МД5 прицелимся.

Давайте. md5 - это криптографическая хеш-функция, т.е. он проектировался таким образом, чтобы подобрать данные под заданный хеш было невозможно за разумное время. Про брут 2^64 забудь - даже если перебирать со скоростью триллион хешей в секунду, на это уйдет 200 дней; если же скорость будет более реальной, скажем миллиард хешей в секунду, то и вовсе лет 500.



Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 24 июня 2018 00:03
· Личное сообщение · #17

то и вовсе лет 500.
Да что-же все про одно и то-же? Да я прекрасно понимаю сложность. Но МД5 устроен так, что изменение даже одного бита влечет лавинное изменение практически всех бит хэша. Поэтому МД5 может сойтись и на самых первых итерациях, когда ключ маленький. Тем-более мне не нужно искать "осмысленный", состоящий из печатаемых символов пароль, мне нужны чисто байты. Это конечно опять-же усложняет перебор, но и дает надежду на более раннее завершение брута.
Может кто показать в исходнике BarsWF места, где инициализируются начальный вектор, начальный размер пароля, и где вычитываются параметры командной строки, для всех шести вариантов программы (AMDBrook, CUDA, SSE2 соответственно под 32 и 64 битные версии). Буду пробовать сам победить это, если никому это не нужно.



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 24 июня 2018 00:04 · Поправил: dosprog
· Личное сообщение · #18

rmn пишет:
чтобы подобрать данные под заданный хеш было невозможно за разумное время.

..при том же размере данных..






Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 24 июня 2018 00:12
· Личное сообщение · #19

Kuzya69 пишет:
изменение даже одного бита влечет лавинное изменение практически всех бит хэша. Поэтому МД5 может сойтись и на самых первых итерациях, когда ключ маленький

Я вот этого не улавливаю, почему такой вывод? И не "практически всех", а всех. Если представить хеш-функцию (рипемд160) в виде графа и установить значения всех бит, кроме любого последнего, там несолько сотен тождеств получится из примерно 297к. Каждый вшивый бит определяет результат.

-----
2 оттенка серого




Ранг: 71.2 (постоянный), 33thx
Активность: 0.050.12
Статус: Участник

Создано: 24 июня 2018 00:13 · Поправил: kunix
· Личное сообщение · #20

Kuzya69 пишет:
Да я прекрасно понимаю сложность.

Нет, вы не понимаете
Вам тут написали, что даже 2^64 нет смысла пытаться подобрать, а вы хотите 2^128.

Kuzya69 пишет:
Поэтому МД5 может сойтись и на самых первых итерациях, когда ключ маленький.

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



Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 24 июня 2018 00:14 · Поправил: Kuzya69
· Личное сообщение · #21

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



Ранг: 158.4 (ветеран), 123thx
Активность: 0.140.49
Статус: Участник

Создано: 24 июня 2018 00:16
· Личное сообщение · #22

dosprog пишет:
..при том же размере данных..

Это не важно. Если данные меньше 5 байт, можно выкинуть последний раунд (с небольшой модификацией хеша), но и это не даст существенного прироста.

Добавлено спустя 4 минуты
Kuzya69 пишет:
Поэтому МД5 может сойтись и на самых первых итерациях, когда ключ маленький.

А может и не сойтись. И вероятность тут не 50 на 50, лол Если ты будешь брутить не последовательные, а рандомные "пароли", то это никак брут не ускорит, а только сдвинет верхнюю планку времени в бесконечность.




Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 24 июня 2018 00:23
· Личное сообщение · #23

rmn пишет:
А может и не сойтись. И вероятность тут не 50 на 50, лол
Почему? Именно 50/50, это как вероятность того, что следующий идущий на встречу прохожий может оказаться динозавром. Либо да, либо нет

-----
2 оттенка серого




Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 24 июня 2018 00:25
· Личное сообщение · #24

Если ты будешь брутить не последовательные
Конечно-же последовательные. 00..FF,0000.....FFFF, и так далее.



Ранг: 158.4 (ветеран), 123thx
Активность: 0.140.49
Статус: Участник

Создано: 24 июня 2018 00:31
· Личное сообщение · #25

Kuzya69 пишет:
и так далее

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

Добавлено спустя 5 минут
f13nd пишет:
Я вот этого не улавливаю, почему такой вывод?

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




Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 24 июня 2018 00:42 · Поправил: f13nd
· Личное сообщение · #26

rmn пишет:
1 из 340282366920938463463374607431768211456

Ну не совсем в такую лотерею. На входе многообразие 2^128+512, на выходе 2^128, коллизий должна существовать чёртова прорва. На перспективу в несколько миллионов лет шансы вполне внушительные.

-----
2 оттенка серого




Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 24 июня 2018 00:57 · Поправил: Kuzya69
· Личное сообщение · #27

Чего вас всех понесло в теорию? Если-бы можно посчитать количество коллизий для заданных начальных условий, то тогда разговор бы о сложности можно было считать аргументированным. Я тоже умею возводить 2-ку в разные степени. Но также я верю в везение.
Лучше бы подсказали про брутер.




Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 24 июня 2018 00:59
· Личное сообщение · #28

Kuzya69 пишет:
Но также я верю в везение.
Делай на дельфи из того, что дали. Скорость перебора ерунда, если за тебя топит леди Фортуна.

-----
2 оттенка серого




Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 24 июня 2018 01:09 · Поправил: Kuzya69
· Личное сообщение · #29

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




Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 24 июня 2018 01:12
· Личное сообщение · #30

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

-----
Чтобы юзер в нэте не делал,его всё равно жалко..




Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 24 июня 2018 01:17
· Личное сообщение · #31

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


<< . 1 . 2 . 3 . >>
 eXeL@B —› Вопросы новичков —› Как подобрать добавочные байты, чтобы сошлась MD5 сумма файла?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати