Как решить проблему переполнения буфера при ограниченном сканировании строк и хешировании? - PullRequest
0 голосов
/ 27 марта 2019

PRE: Здесь есть только один подобный вопрос с другим алгоритмом хеширования и измененными размерами массива, но это не ответило на некоторые вопросы в моей голове, и сообщение относится к 2016 году. Проблема состоит в том, чтобы выполнить атаку переполнения буфера наПрограмма, которая получает ввод в качестве пароля, хэширует его (SHA1) и сравнивает с ним правильный хеш.(Scanf ограничен)

Вещи, которые я уже знаю:

-NUL Байт (\ x00) принимается Scanf.

-Если я введу 20 символов для ввода, нулевой терминатор перезаписывает первое правильное хеш-значение.

-Если я передаю 37 символов ввода (предел развертки), то мы перезаписываем первые 17 байтовв правильном хеше с нашим собственным и 18-м с нулевым терминатором.

Я попытался написать скрипт грубой силы Python, чтобы найти такой хеш, который соответствует последним 3 байтам, но я не понимаю,18-й байт из 20 байтов является нулевым терминатором в нашем правильном хэше.Как это сравнить?Я попытался сделать так, но не работал = "00a450" как последнее 3-байтовое представление в строке.Ниже приведен код для программы на Си и мой скрипт на python.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/sha.h>

int
main(void) {
    FILE *file;
    unsigned char flag[128];
    unsigned char correct_hash[20] = {
        0x4a, 0xc9, 0xb0, 0x57, 0xf8, 0x02, 0x12, 0x60, 0x6c, 0xea,
        0xab, 0xf3, 0xc6, 0x50, 0x5d, 0xaf, 0xed, 0x40, 0xa4, 0x50
    };
    unsigned char password[20];

    printf("Insert your password: ");
    scanf("%37s", password);
    SHA1(password, strlen((char *)password), password);
    if(memcmp(password, correct_hash, 20) == 0) {
        printf("CORRECT PASSWORD!\n");
        file = fopen("/flag", "r");
        if(file != NULL) {
            fscanf(file, "%s", flag);
            fclose(file);
            printf("Flag: %s\n", flag);
        } else {
            printf("Error while opening the flag file\n");
        }
    } else {
        printf("WRONG PASSWORD!\n");
    }
    fflush(stdout);

    return 0;
}
import hashlib
from itertools import *

st = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
hash_ending = "00a450"
found = False
for i in range(2,3):
    perms = list(map("".join, permutations(st,i)))
    for permutation in perms:
       full_hash =  hashlib.sha1(permutation.encode()).hexdigest()
       print("Testing = " + full_hash)
       if(full_hash[-6:] == hash_ending):
           found = True
           print("Full Hash = " + full_hash )
           print("Password = " + permutation)
           break
    if(found == True):
        break

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

...