Hash Collision - pwnable.kr - решение

Hash Collision - pwnable.kr - решение

решение задания collision - pwnable.kr

что такое хеш-функция?

криптографическая хеш-функция (CHF ) - математический алгоритм, который отображает данные произвольных размер (часто называемый «сообщением») в битовый массив фиксированного размера («хеш-значение», «хеш» или «дайджест сообщения»1

Хеш-функция берёт определённую информацию и преобразует эту информацию в строку определенной длины. Исходные данные могут быть любыми, от пароля вашего аккаунта до фильмов или книг. Эта строка всегда будет иметь одинаковую длину вне зависимости от того, какого размера была входная информация.

Есть очень важный момент:

  • небольшое изменение в сообщении должно изменить значение хеш-функции настолько сильно, что новое значение хеш-функции будет не коррелировать со старым хеш-значение (лавинный эффект )1

Например2:

хеш

pwnable.kr - col

banner

Итак, у нас есть 3 файла, слева мы видим наши полномочия, где ‘s’ означает SUID3, то есть, мы можем запускать файл с правами владельца.

давайте посмотрим содержимое файла col.c

#include <stdio.h>
#include <string.h>
unsigned long hashcode = 0x21DD09EC;
unsigned long check_password(const char* p){
        int* ip = (int*)p;
        int i;
        int res=0;
        for(i=0; i<5; i++){
                res += ip[i];
        }
        return res;
}

int main(int argc, char* argv[]){
        if(argc<2){
                printf("usage : %s [passcode]\n", argv[0]);
                return 0;
        }
        if(strlen(argv[1]) != 20){
                printf("passcode length should be 20 bytes\n");
                return 0;
        }

        if(hashcode == check_password( argv[1] )){
                system("/bin/cat flag");
                return 0;
        }
        else
                printf("wrong passcode.\n");
        return 0;
}

Программа принимает в качестве аргумента строку из 20 символов. Строка предстаёт в виде 5 чисел, эти числа суммируются и их сумма проверятся со значением 0x21DD09EC.

Проблема в том, что 0x21DD09EC не делится на 5. Нам нужно задать 5 чисел, сумма которых равна 0x21DD09EC.

Давайте поделим 0x21DD09EC на 5, возьмём результат без остатка, умножим на 4 и вычтем из 0x21DD09EC.

решение-col

итак, наша строка будет выглядеть следующим образом: 0x6c5cec8 * 4 + 0x6c5cecc.

решение2-col

Список литературы:

  1. https://ru.wikibrief.org/wiki/Cryptographic_hash_function  2

  2. https://www.kaspersky.ru/blog/the-wonders-of-hashing/3633/ 

  3. https://ru.wikipedia.org/wiki/Suid