Авторские статьи подделка контрольных сумм

Discussion in 'Статьи' started by yeti, 7 Jun 2007.

  1. yeti

    yeti Elder - Старейшина

    Joined:
    27 Dec 2006
    Messages:
    179
    Likes Received:
    234
    Reputations:
    346
    Само слово коллизия - это столкновение противоположных сил, интересов, взглядов. Так написано в словаре. ну а я хочу рассмотреть коллизию в 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/ ) ссылка на подборку плагинов для нее..

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

    [​IMG]

    По сути, в 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:::::::::::::::::::::::::::::::::D
    контрольная сумма равняется CRC_OK

    теперь мы изменим некоторые байты:
    A:::::x:::::::::::::::::::::::::xxx::::x:x:D
    Но в чем беда - контрольная сумма отличается..

    Давайте найдем себе кусочек байтов, которые можно изменить без зазрения совести?
    Походу, байты лучше всего вставлять посередине. Это мы и продемонстрируем:
    A:::::x::::::B_12_3_4_C::::::xxx:::x:x:D
    Это шаблон, ткак сказать. а теперь нам надо просто подсчитать контрольные суммы этих 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.. Посмотрим..
     
    9 people like this.
  2. -=lebed=-

    -=lebed=- хэшкрякер

    Joined:
    21 Jun 2006
    Messages:
    3,804
    Likes Received:
    1,960
    Reputations:
    594
    Причём тут протрояненыый форум и контрольная сумма? Имхо контрольная сумма относится к файлу (одному!). Ну если ты имелла ввиду скрипт один (например на php) тогда да...
    И вообще твоя статья очень смахивает на Криса Касперски (я уже читал) а вот кстате она: http://www.xakep.ru//magazine/xa/090/122/4.asp

    ЗЫ MD5 и MD6 подделать нельзя, но коллизии попытаться найти можно MD5(pass1)=MD5(pass2)
     
    #2 -=lebed=-, 7 Jun 2007
    Last edited: 7 Jun 2007
  3. yeti

    yeti Elder - Старейшина

    Joined:
    27 Dec 2006
    Messages:
    179
    Likes Received:
    234
    Reputations:
    346
    -=lebed=-, честно говоря, я ее впервые вижу. Ту статью..

    ПС: а то, что на форумах тоже система защиты же.. И смотрит контрольную сумму.. Хотя мне тут кое-кто сказал, что легче просто убрать проверку)
     
    1 person likes this.
  4. Thanat0z

    Thanat0z Негрин

    Joined:
    6 Dec 2006
    Messages:
    627
    Likes Received:
    498
    Reputations:
    311
    Shnurovka, а что значит этот фрагмент кода?
     
  5. yeti

    yeti Elder - Старейшина

    Joined:
    27 Dec 2006
    Messages:
    179
    Likes Received:
    234
    Reputations:
    346
    Thanat0z, я, к сожалению, не кодер.. но исходники выложила для наглядности..
     
    1 person likes this.
  6. -=lebed=-

    -=lebed=- хэшкрякер

    Joined:
    21 Jun 2006
    Messages:
    3,804
    Likes Received:
    1,960
    Reputations:
    594
    некоторые байты оказались такими же как и у Криса Касперски... гы!

    У Касперски тоже самое, но всё более понятно и подробно: читать

    Кстате тут - пример вычисления контрольной суммы (CRC32) на asm`e
     
    #6 -=lebed=-, 7 Jun 2007
    Last edited: 7 Jun 2007
  7. yeti

    yeti Elder - Старейшина

    Joined:
    27 Dec 2006
    Messages:
    179
    Likes Received:
    234
    Reputations:
    346
    -=lebed=- это пример, если ты не понял! И во всем инете он аналогичен по сути!
     
  8. -=lebed=-

    -=lebed=- хэшкрякер

    Joined:
    21 Jun 2006
    Messages:
    3,804
    Likes Received:
    1,960
    Reputations:
    594
    Шнуровка: все примеры аналогичны по сути но не по местоположению байтов, потому как это всё Крис Касперски - его примеры и его статьи http://www.insidepro.com/kk/118/118r.shtml

    ЗЫ Если честно я вообще не понимаю как можно писать что-то, в чём сама плохо разбираешься, значит не твоё, что печально...

    Скажи мне пожалуйста как вычислить контрольную сумму форума?
     
    #8 -=lebed=-, 7 Jun 2007
    Last edited: 7 Jun 2007
  9. A110ut

    A110ut Elder - Старейшина

    Joined:
    31 Dec 2005
    Messages:
    505
    Likes Received:
    263
    Reputations:
    92
    жесть
     
  10. yeti

    yeti Elder - Старейшина

    Joined:
    27 Dec 2006
    Messages:
    179
    Likes Received:
    234
    Reputations:
    346
    -=lebed=-, мля. если честно то ты по сути только наезжаешь.. Это я вижу! а вот реально больше не вижу ничего! Я конечно слегка офигела от того, что статья в чем-то похожа.. потому что я перерывала весь инет неделю - по теме материала мало. Нашла практический пример, тут что-то есть там что-то етсь. То есть статья можно сказать практическая.. А то, что я ошиблась где-то. Не робот в конце концов.. и не все знаю.. к сожалению.. и мне надоело тут уже отписываться.. если честно! так что - если вдруг что.. ставь минусы - мне не жаль.. ЭТУ статью(что ты покзал) вижу впервые. Все что хотела - сказала! Все.
     
    3 people like this.
  11. -=lebed=-

    -=lebed=- хэшкрякер

    Joined:
    21 Jun 2006
    Messages:
    3,804
    Likes Received:
    1,960
    Reputations:
    594
    взято с Вики, так что учи Шнуровка матчасть... Кстать выше я это и написал формулой (сам без вики, потом залез проверить...)
     
  12. -=lebed=-

    -=lebed=- хэшкрякер

    Joined:
    21 Jun 2006
    Messages:
    3,804
    Likes Received:
    1,960
    Reputations:
    594
    писец: неделю рыла весь инет, а я нашёл за пять минут весь исходный материал Криса Касперски... Ну раз рыла дак дай ссылки на исходный материал! А потом говори что это не Крис Касперски а мой сборник из его статей...
    Раз: http://www.insidepro.com/kk/118/118r.shtml
    Два: http://www.xakep.ru//magazine/xa/090/122/4.asp - имхо хватит... этого чтоб написать то что выше, а смысл ? Ты сама подделала контрольную сумму по своей статье? давай тогда выкладывай два файла с одинаковыми контрольными суммами, но один протрояненный а другой нет...
     
    2 people like this.
  13. yeti

    yeti Elder - Старейшина

    Joined:
    27 Dec 2006
    Messages:
    179
    Likes Received:
    234
    Reputations:
    346
    -=lebed=-, лол. а я взяла определение коллизии со словаря) с толкового словаря.. )) вики и не открывала)

    Мля. я рада что ты у нас аткой умный.. Дружишь с Крисом Касперским.. Я - нет! что дальше? Пля.. задолбал!

    ПС: ты умный.. поздравляю.. круто! иди радуйся..
     
  14. -=lebed=-

    -=lebed=- хэшкрякер

    Joined:
    21 Jun 2006
    Messages:
    3,804
    Likes Received:
    1,960
    Reputations:
    594
    + снял, если и сама старалась, потому как тут секур-форум и если люди о чём-то пишут, то берут определения не в толковом словаре...

    ЗЫ Протроянить архив не так-то просто, если он не SFX. (обычный exe c распакующим модулем). А вот просто архив протроянить интересно как ты себе представляешь? Сам архив имеет контрольную сумму - его нельзя ковырять (добавлять быйты туда) иначе не распакуется... Кроме того файл (для примера один) в архиве, если распаковать имеет свою контрольную сумму. И не факт, что подделав контрольную сумму исходного файла заархивировав мы получим контрольную сумму исходного архиива...
     
    #14 -=lebed=-, 7 Jun 2007
    Last edited: 7 Jun 2007
    1 person likes this.
  15. yeti

    yeti Elder - Старейшина

    Joined:
    27 Dec 2006
    Messages:
    179
    Likes Received:
    234
    Reputations:
    346
    -=lebed=-, ну снял и ладно.. Один к точкам придрался. второй к словарю. Красота..
     
  16. -=lebed=-

    -=lebed=- хэшкрякер

    Joined:
    21 Jun 2006
    Messages:
    3,804
    Likes Received:
    1,960
    Reputations:
    594
    Ждём твоих статей ещё! (так и хочется сказать пешы есчо!) :D
    PS А ты всегда так близко к сердцу критику принимаешь? ;) и ссылки давай на источники, какими пользуешься при написании статей, бум тебе помогать... :) (а то источники бывают хорошие и не очень).
     
    #16 -=lebed=-, 7 Jun 2007
    Last edited: 7 Jun 2007
  17. yeti

    yeti Elder - Старейшина

    Joined:
    27 Dec 2006
    Messages:
    179
    Likes Received:
    234
    Reputations:
    346
    -=lebed=- конечно я принимаю критику близко к сердцу.. куда я денусь собственно?

    Эмм.. вам весь список озвучить? могу в личку... но это очень долго!! оочень.. )) посути сначала перерываю весь инет, читаю все... потом пытаюсь писать из собственных соображений. а тут статья какоя-то. которую впервые вижу)) Лан. забей.. может пригодися кому..
     
  18. Thanat0z

    Thanat0z Негрин

    Joined:
    6 Dec 2006
    Messages:
    627
    Likes Received:
    498
    Reputations:
    311
    2 -=lebed=- - достаточно, твоя критика ясна
    2 Shnurovka - научись воспринимать критику. Вообще твои статьи отличаются абстрактностью, в том плане что не знаю кому пригодится то что в них описано, и мало кто их понимает. А самое плохое, что ты похоже сама не понимаешь о чем пишешь, такое ощущение что собраны кусочки материалов, которые написали для тебя другие люди.

    Далее посты не по теме, то есть не о статье будут удаляться, достаточно уже сказано
     
    #18 Thanat0z, 7 Jun 2007
    Last edited: 7 Jun 2007
    2 people like this.
  19. madnet

    madnet Умиротворенный

    Joined:
    9 Dec 2004
    Messages:
    868
    Likes Received:
    343
    Reputations:
    423
    Эмм, первый раз слышу что бы была проверка crc32, вообще-то, на сколько мне известно, web приложения, если используют контроль целосности, то только посредствам md5 хэшей, имхо crc юзать идиотизм.
     
    _________________________
  20. .Slip

    .Slip Elder - Старейшина

    Joined:
    16 Jan 2006
    Messages:
    1,571
    Likes Received:
    977
    Reputations:
    783
    Один вопрос. Всего один. Ты сама поняла что сюда выложила под видом своей статьи?
     
    1 person likes this.