• XSS.stack #1 – первый литературный журнал от юзеров форума

Конкурс #0. ][ak квест #2021

Там какой-то хекс-код, копируем его в хекс-редактор, сохраняем; это 7Z

Все проще, чем я думал, так то я читал подсказки на форуме и зациклился сразу на ссылке в хексе пропустив вначале 7Z, а так я пробовал переименовывать в формат .exe. В общем, ваши подсказки только сбили с толку.?
 
Немного не успел с решением из-за отсутствия времени.
Если кому интересно, привожу листинг программы для дешифровки криптованых файлов.
В начале программы в константах не забываем менять имя входного и выходного файла.
при желании можно прикрутить автоматический декриптор через FindFirstFile, FindNextFile (исключив нешифруемые папки и расширения файлов)

код можно написать значительно упростив и уменьшив количество строк, написано так - для лучшего(возможно) понимания и на скорую руку
ошибки и исключения не обрабатываются
как минимум нужно освободить не освобожденную память и закрыть не закрытые хэндлы
но код рабочий, можно посмотреть на котиков

C++:
#pragma comment(lib, "crypt32.lib")
#pragma warning(disable : 4996)

#include <stdio.h>
#include <string.h>
#include <windows.h>

// НАШИ КОНСТАНТЫ
// приватный ключ получен из публичного, при известных p, q, e
// https://reverse-pub.ru/2016/09/12/взлом-короткого-ключа-rsa/
LPCSTR PrivateKey = "MIH0AgEAAjEA31xPiBbXugvqLab52xRnjj1dLMdlurOekhtVQcM0Z0L9LtMiSmnqZIZDAlqYpee9AgMBAAECMGEMH7Y2jpbUdHRPd4Ib1H615NT+8hFz1uNBAww30Xti08qQYhdicorhgtuG9rDRoQIZAPEieybQ3PKyH744AgSSCSVsel1xaWepeQIZAO0hUuNxBKuhApNQ7EG9JKvNbl8u8pijZQIZALEP67Qt6//+EdcAk2K9xR+IzzVsQMTQqQIZALirQP/7XiXDCFxtovA3Or3JCHF8AFW6uQIZANvy+ZOnb5LMIDJB42AYHqHT0OTHVmQnHQ==";
// входной файл для дешифровки
LPCSTR EncryptedFileName = "c:\\1\\4.jpg.\[govnoloker2020@covid.me\].KVEST";
// выходной файл
LPCSTR DecryptedFileName = "c:\\1\\4.jpg";

int main(void)
{


    HCRYPTPROV pCryptProv = NULL;
    DWORD key_length = 0, key_blob_len = 0;
    PBYTE key_binary, key_blob;
    HANDLE hHeap = NULL;
    HCRYPTKEY phKey = 0;

    hHeap = GetProcessHeap();

    // загружаем наш приватный ключ и получаем Handle нашего ключа, он нам понадибоится при вызове ->
    // функции CryptDecrypt при расшифровке файла
    CryptAcquireContextW(&pCryptProv, 0, 0, PROV_RSA_FULL, 0);
    CryptStringToBinaryA(PrivateKey, 0, CRYPT_STRING_BASE64_ANY, NULL, &key_length, NULL, NULL);
    key_binary = (PBYTE)HeapAlloc(hHeap, HEAP_ZERO_MEMORY, key_length);
    CryptStringToBinaryA(PrivateKey, 0, CRYPT_STRING_BASE64_ANY, key_binary, &key_length, NULL, NULL);
    CryptDecodeObjectEx(PKCS_7_ASN_ENCODING | X509_ASN_ENCODING, PKCS_RSA_PRIVATE_KEY, key_binary, key_length, 0, 0, 0, &key_blob_len);
    key_blob = (PBYTE)HeapAlloc(hHeap, HEAP_ZERO_MEMORY, key_blob_len);
    CryptDecodeObjectEx(PKCS_7_ASN_ENCODING | X509_ASN_ENCODING, PKCS_RSA_PRIVATE_KEY, key_binary, key_length, 0, 0, key_blob, &key_blob_len);
    if (CryptImportKey(pCryptProv, key_blob, key_blob_len, 0, 0, &phKey)) {
        printf("Private key load success.\n");
    }
    HeapFree(hHeap, 0, key_binary);
    HeapFree(hHeap, 0, key_blob);


    // открываем криптованный файл для чтения и файл для записи результата дешифровки
    HANDLE hSource, hDestination;
    hSource = CreateFileA(EncryptedFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
    hDestination = CreateFileA(DecryptedFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);


    DWORD nBytesToRead = 48; // длина блока записанного в конец файла
    DWORD SourceFileSize = GetFileSize(hSource, NULL); // получаем длину шифрованого файла
    PBYTE SecretBytes = NULL;
    PBYTE Content = NULL;
    char RSecretBytes[48];
    DWORD SizeOfContent = SourceFileSize - nBytesToRead;

    //выделяем память под наши нужды
    SecretBytes = (PBYTE)HeapAlloc(hHeap, HEAP_ZERO_MEMORY, nBytesToRead);
    Content = (PBYTE)HeapAlloc(hHeap, HEAP_ZERO_MEMORY, SourceFileSize - nBytesToRead);


    ReadFile(hSource, Content, SourceFileSize - nBytesToRead, &SourceFileSize, 0); // читаем основную часть шифрованного файла в переменную Content
    ReadFile(hSource, SecretBytes, nBytesToRead, &SourceFileSize, 0); // читаем часть с секретными кодами шифрованного файла в переменную SecretBytes

    // пишем задом наперед наши 48 байт с конца файла в перменную ReverseBytes
    // тоже самое происходит при криптовании файла
    int j = 0;
    for (int i = 47; i >= 0; i--) {
        RSecretBytes[j] = SecretBytes[i];
        j++;
    }

    // HeapFree(hHeap, 0, SecretBytes); // переменная SecretBytes нам больше не нужна
    // дешифруем строку с секретными кодами (48 байт) нашим приватным ключом
    CryptDecrypt(phKey, NULL, 1, 0, (PBYTE)RSecretBytes, &nBytesToRead);
    printf("secret codes in this line: %s.\n", RSecretBytes);

    // k1 = 000,k2 = 000,k3 = 000
    char *c;
    int n;
    char k1[4], k2[4], k3[4];
    int k_1, k_2, k_3;
    c = strchr(RSecretBytes, '=') + 2;
    n = strchr(c, ',') - c;
    strncpy(k1, c, n);
    k1[n] = '\0';
    printf("secret k1=%s.\n", k1);

    c = strchr(c, '=') + 2;
    n = strchr(c, ',') - c;
    strncpy(k2, c, n);
    k2[n] = '\0';
    printf("secret k3=%s.\n", k2);

    c = strchr(c, '=') + 2;

    strncpy(k3, c, 4);
    if (isdigit(k3[3]))
        k3[4] = '\0';
    else
        k3[3] = '\0';
    printf("secret k2=%s.\n", k3);
    k_3 = atoi(k3);
    k_2 = atoi(k2);
    k_1 = atoi(k1);


    for (int i = 0; i < SizeOfContent; i++) {
        if ((Content[i] != k_3) and (Content[i] != 0))Content[i] ^= k_3;
    }
    for (int i = 0; i < SizeOfContent; i++) {
        if ((Content[i] != k_2) and (Content[i] != 0)) Content[i] ^= k_2;
    }
    for (int i = 0; i < SizeOfContent; i++) {
        if ((Content[i] != k_1) and (Content[i] != 0)) Content[i] ^= k_1;
    }
    WriteFile(hDestination, Content, SizeOfContent, &SizeOfContent, 0);
    CloseHandle(hDestination);
}
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх