Перехват ICQ паролей Константин Клягин Xakep, номер #052, стр. 052-082-3 0x0020 5018 2526 11d0 0000 2a01 7aa9 0081 0000 P.%&....*.z..... 0x0030 0001 0001 0009 3235 3139 3832 3637 3800 ......251982678. 0x0040 0200 03c2 14b2 0003 0033 4943 5120 496e .........3ICQ.In 0x0050 632e 202d 2050 726f 6475 6374 206f 6620 c..-.Product.of. 0x0060 4943 5120 2854 4d29 2e32 3030 3062 2e34 ICQ.(TM).2000b.4 0x0070 2e36 302e 312e 3332 3738 2e38 3500 1600 .60.1.3278.85... 0x0080 0201 0a00 1700 0200 0400 1800 0200 3c00 ..............<. 0x0090 1900 0200 0100 1a00 020c ce00 1400 0400 ................ 0x00a0 0000 5500 0f00 0265 6e00 0e00 0275 73 ..U....en....us За исключением мелких различий в начале пакета, основная изменяющаяся часть следует за номером клиента (UIN). К тому же, только она имеет различную длину в собранных примерах для разных паролей. Смотрим внимательнее на соответствующие куски: 0x0030 0001 0001 0009 3235 3139 3832 3637 3800 ......251982678. 0x0040 0200 068b 5ef9 f50b b500 0300 3349 4351 ....^.......3ICQ 0x0030 0001 0001 0009 3235 3139 3832 3637 3800 ......251982678. 0x0040 0200 0492 44e2 a000 0300 3349 4351 2049 ....D.....3ICQ.I 0x0030 0001 0001 0009 3235 3139 3832 3637 3800 ......251982678. 0x0040 0200 03c2 14b2 0003 0033 4943 5120 496e .........3ICQ.In Строке с номером UIN предшествует ее длина - девятка. Заканчивается строка нулем. Верится, что пароль выглядит точно так же. И действительно - правильный его вариант - "xxx123" имеет длину 6 байт, что мы и видим в первом примере. Четверка во втором равна длине строки "abcd", а в блоке из последнего примера фигурирует тройка, потому что тогда мы пытались войти с паролем "123". Наблюдаемая картина называется защитой "от дурака". Пароль передается в "слегка" зашифрованном виде, дабы его не было видно просто так с помощью снифера. Есть информация, что применяемый метод - банальный xor (исключающее "или"). Следует проверить, так ли это на самом деле. Проверка на тип шифрования Вспомним, что исключающее "или" - полностью обратимая операция (читай об этом статью "Криптография в С++" в этом же номере), поэтому, если "a xor b = c", то "a xor c = b" и "c xor b = a". Порядок параметров тоже не имеет значения (a xor b = b xor a). Шифровать таким способом пароли - то еще извращение, поскольку он приводится практически в любом детском учебнике криптографии как самый простой пример. XOR имеется в любом языке, но раз уж мы работаем в UNIX и не хотим морочить себе голову компиляцией, линковкой и прочими ненужными на данный момент операциями, выберем оптимальный набор инструментов. Возьмем Perl и напишем на нем небольшую программку. Она будет выяснять число xor для символа в каждой позиции из примера с самым длинным паролем и пытаться с его помощью расшифровать остальные два. Не забудем записать текст программы в файл и выполнить "chmod +x <имя файла>", чтобы в итоге дать права для его запуска. #!/usr/bin/perl $pass1 = "\x8b\x5e\xf9\xf5\x0b\xb5"; |