Само слово коллизия - это столкновение противоположных сил, интересов, взглядов. Так написано в словаре. ну а я хочу рассмотреть коллизию в crc32. Коллизия контрольных сумм в crc32 - отличный пример того, что нет ничего невозможного Допустим, вы протрянили форум.. Или же архив... Отлично, но вот в чем беда - контрольные суммы не совпадают.. И в этой статье я хочу написать о том, что такое и как подделать контрольные суммы.. Собственно, для начала нужен сам пример вычисления контрольной суммы.. Code: Как подсчитывается CRC32? Ниже приведены тексты программы для подсчета CRC32 заданного файла. ----------------------------------------------- crc.h typedef unsigned char uchar; /* 8 bits or more */ typedef unsigned int uint; /* 16 - 32 bits or more */ typedef unsigned short ushort; /* 16 bits or more */ typedef unsigned long ulong; /* 32 bits or more */ typedef ulong UCRC; /* CRC-32 */ #define CRC_MASK 0xFFFFFFFFUL extern UCRC crc; ----------------------------------------------- crc.c #include <stdio.h> #include "crc.h" #include <stdlib.h> /* Global variables */ UCRC crc; FILE *fp; #define BUFFERSIZE 32768U #define CRCPOLY 0xEDB88320UL /* 1110 1101 1001 1000 1000 0011 0010 0000 */ #define UPDATE_CRC(crc, c) \ crc = crctable[(uchar)crc ^ (uchar)(c)] ^ (crc >> 8) static UCRC crctable[256]; static void make_crctable( void ) { uint i, j; UCRC r; for (i = 0; i <= 255; i++) { r = i; for (j = 8; j > 0; j--) { if (r & 1) r = (r >> 1) ^ CRCPOLY; else r >>= 1; } crctable[i] = r; /* printf( "%08lx ", crctable[i] ); if( i % 8 == 7 ) printf( "\n" ); */ } } int main( int argc, char *argv[] ) { size_t len; char *buffer, *sav; if ( argc != 2 ) { printf("Usage: CRC32 <File_Name>\n" ); return 1; } if ( ( fp = fopen( argv[1], "rb" ) ) == NULL ) exit(1); make_crctable(); crc = CRC_MASK; buffer = (char *) calloc( BUFFERSIZE,1 ); sav = buffer; while ( ( len = fread(buffer,1,BUFFERSIZE,fp) ) > 0 ) { while ( len-- ) UPDATE_CRC( crc, *buffer++ ); buffer = sav; } free(buffer); len = (unsigned int)(crc>>16); printf( "File = %13s CRC32 = %04x%04x\n", argv[1], (int)~len, (int)~crc ); fclose( fp ); flushall(); return 0; } А вот более подробное описание вычисления контрольной суммы: взято описание тут Но пожалуй, надо перейти от теоризации к более практической части! рассмотрим: По сути, в самой прошивке не хранится CRC, а там хранятся лишь корректирующие байты. Но походу, если все структуры выверены на границу 4-х байт, то можно взять блок, стандартным алгоритмом подсчитать контрольную сумму. если же она не будет равняться нулю, то ищет тот блок, который подходит под нужные нам условия. В утилите: PEiD аже плагин есть специально для подделки CRC (http://slil.ru/24480346 - ссыль посеяла. поэтому залила), а также вот(http://www.secretashell.com/codomain/peid/plugins/ ) ссылка на подборку плагинов для нее.. По сути надо знать что вычислять и по каким параметрам.. Нашла таблицу - приведу ее: По сути, в Crc32 нам надо подогнать блок байт к контролируемому блоку, подогнав контрольную сумму к нужному значению. Блок равен разрядности.. То есть для CRC32 блок будет равняться 4-ем байтам.. расчитанными, или полученными с помощью брута. чтобы рассчитать эту сумму, нужен не только aлгоритм, данные из вышепредставленной таблицы, но также сведения(также необходимые) откуда и докуда защита считает контрольную сумму. Затем нам надо решить внедрять ли нам внутрь кода корректирующие байты, или же просто дописать их. И если целостность всего блока проверяется, то тогда, конечно же легче, лучше и проще нам будет дописать необходимые данные. но тогда длина контролируемого блока изменится.. Но защитные системы часто не обращают внимания на дописывание - они контролируют целостность определенного блока байтов. Я приведу исходник плагина для PEiD'а, который дописывает 4 корректирующих байта к файлу: Code: #include <stdio.h> unsigned long c,c2,p2,pol=0xEDB88320; long n,k; main() { printf("CRC32 Adjuster (c) 2001 by RElf @ HHT/2\n"); printf("Length of data: "); scanf("%ld",&n); printf("Offset to patch: "); scanf("%ld",&k); n = (n-k)<3; printf("Current CRC32: 0x"); scanf("%x",&c); printf("Desired CRC32: 0x"); scanf("%x",&c2); c ^= c2; p2 = (pol << 1) | 1; while(n--) if(c&0x80000000) c = (c<<1)^p2; else c<<=1; printf("XOR masks:%02X%02X%02X%02X\n",c&0xff,(c>>8)&0xff,(c>>16)&0xff, c>>24); } метод внедрения кода: Этот метод намного более действенен.. у него больше перспектив... При желании, можно выбить себе место для 4х байт. Можно переписать машинные команды. для начала надо найти наименее значимые биты.. Да и если учесть, что компиляторы тоже не всухую работают.. То есть они тоже вставляют куски кода.. А если это сертификат, то высвободить себе места намного проще. Но всеже, лучше мы рассмотрим пример: Например байтовое расположние у нас выглядит так: A:::::::::::::::::::::::::::::::: контрольная сумма равняется CRC_OK теперь мы изменим некоторые байты: A:::::x:::::::::::::::::::::::::xxx::::x:x Но в чем беда - контрольная сумма отличается.. Давайте найдем себе кусочек байтов, которые можно изменить без зазрения совести? Походу, байты лучше всего вставлять посередине. Это мы и продемонстрируем: A:::::x::::::B_12_3_4_C::::::xxx:::x:x Это шаблон, ткак сказать. а теперь нам надо просто подсчитать контрольные суммы этих 4-х байтов и подобрать те, что нам подходят. И в конце посчитать контрольную сумму данного блока. Так.. а теперь посмотрим поближе. Выше я разместила ссылку на PEiD и на плагины! Нам нужен плагин FixCRC(еще ссыль на плагины, вот еще на пейд ссыль ). Потом мы запускаем что-либо, жмем стрелочку. и выбираем crc32 в plugins. Затем выходим, и в хекс-редакторе, к примеру, правим файл. hex_редактор можно найти тут (http://www.handshake.de/user/chmaas/delphi/download/xvi32.zip - спасибо Дикс'у с его темой про авик)) Затем опять откурываем файл в PEiD опять смотрим контрольную сумму. Не совпадает, не так ли?Затем плагин САМ пишет нам - 4 bytes written! да, и мы можем заметить, что в конец действительно было дописано 4 корректирующих байта. Потом мы может вставлять эти волшебные 4 байта в файл, предварительно отступив 4 байта назад в хекс-редакторе. таким образом, можно корректировать не только целые файлы, но и отдельные куски кода! Чтож, мы подделали crc32 - что дальше? Никто не стоит на месте.. Завтра кто-то сможет подделать MD5, потом кто-то придумает MD6.. Посмотрим..
Причём тут протрояненыый форум и контрольная сумма? Имхо контрольная сумма относится к файлу (одному!). Ну если ты имелла ввиду скрипт один (например на php) тогда да... И вообще твоя статья очень смахивает на Криса Касперски (я уже читал) а вот кстате она: http://www.xakep.ru//magazine/xa/090/122/4.asp ЗЫ MD5 и MD6 подделать нельзя, но коллизии попытаться найти можно MD5(pass1)=MD5(pass2)
-=lebed=-, честно говоря, я ее впервые вижу. Ту статью.. ПС: а то, что на форумах тоже система защиты же.. И смотрит контрольную сумму.. Хотя мне тут кое-кто сказал, что легче просто убрать проверку)
некоторые байты оказались такими же как и у Криса Касперски... гы! У Касперски тоже самое, но всё более понятно и подробно: читать Кстате тут - пример вычисления контрольной суммы (CRC32) на asm`e
Шнуровка: все примеры аналогичны по сути но не по местоположению байтов, потому как это всё Крис Касперски - его примеры и его статьи http://www.insidepro.com/kk/118/118r.shtml ЗЫ Если честно я вообще не понимаю как можно писать что-то, в чём сама плохо разбираешься, значит не твоё, что печально... Скажи мне пожалуйста как вычислить контрольную сумму форума?
-=lebed=-, мля. если честно то ты по сути только наезжаешь.. Это я вижу! а вот реально больше не вижу ничего! Я конечно слегка офигела от того, что статья в чем-то похожа.. потому что я перерывала весь инет неделю - по теме материала мало. Нашла практический пример, тут что-то есть там что-то етсь. То есть статья можно сказать практическая.. А то, что я ошиблась где-то. Не робот в конце концов.. и не все знаю.. к сожалению.. и мне надоело тут уже отписываться.. если честно! так что - если вдруг что.. ставь минусы - мне не жаль.. ЭТУ статью(что ты покзал) вижу впервые. Все что хотела - сказала! Все.
взято с Вики, так что учи Шнуровка матчасть... Кстать выше я это и написал формулой (сам без вики, потом залез проверить...)
писец: неделю рыла весь инет, а я нашёл за пять минут весь исходный материал Криса Касперски... Ну раз рыла дак дай ссылки на исходный материал! А потом говори что это не Крис Касперски а мой сборник из его статей... Раз: http://www.insidepro.com/kk/118/118r.shtml Два: http://www.xakep.ru//magazine/xa/090/122/4.asp - имхо хватит... этого чтоб написать то что выше, а смысл ? Ты сама подделала контрольную сумму по своей статье? давай тогда выкладывай два файла с одинаковыми контрольными суммами, но один протрояненный а другой нет...
-=lebed=-, лол. а я взяла определение коллизии со словаря) с толкового словаря.. )) вики и не открывала) Мля. я рада что ты у нас аткой умный.. Дружишь с Крисом Касперским.. Я - нет! что дальше? Пля.. задолбал! ПС: ты умный.. поздравляю.. круто! иди радуйся..
+ снял, если и сама старалась, потому как тут секур-форум и если люди о чём-то пишут, то берут определения не в толковом словаре... ЗЫ Протроянить архив не так-то просто, если он не SFX. (обычный exe c распакующим модулем). А вот просто архив протроянить интересно как ты себе представляешь? Сам архив имеет контрольную сумму - его нельзя ковырять (добавлять быйты туда) иначе не распакуется... Кроме того файл (для примера один) в архиве, если распаковать имеет свою контрольную сумму. И не факт, что подделав контрольную сумму исходного файла заархивировав мы получим контрольную сумму исходного архиива...
Ждём твоих статей ещё! (так и хочется сказать пешы есчо!) PS А ты всегда так близко к сердцу критику принимаешь? и ссылки давай на источники, какими пользуешься при написании статей, бум тебе помогать... (а то источники бывают хорошие и не очень).
-=lebed=- конечно я принимаю критику близко к сердцу.. куда я денусь собственно? Эмм.. вам весь список озвучить? могу в личку... но это очень долго!! оочень.. )) посути сначала перерываю весь инет, читаю все... потом пытаюсь писать из собственных соображений. а тут статья какоя-то. которую впервые вижу)) Лан. забей.. может пригодися кому..
2 -=lebed=- - достаточно, твоя критика ясна 2 Shnurovka - научись воспринимать критику. Вообще твои статьи отличаются абстрактностью, в том плане что не знаю кому пригодится то что в них описано, и мало кто их понимает. А самое плохое, что ты похоже сама не понимаешь о чем пишешь, такое ощущение что собраны кусочки материалов, которые написали для тебя другие люди. Далее посты не по теме, то есть не о статье будут удаляться, достаточно уже сказано
Эмм, первый раз слышу что бы была проверка crc32, вообще-то, на сколько мне известно, web приложения, если используют контроль целосности, то только посредствам md5 хэшей, имхо crc юзать идиотизм.