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 и переопределенный байт как терминатор строки в правильном хеше и его значение при сравнении.