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

Вопрос по дешифровке строк через bcrypt

user_47

(L3) cache
Пользователь
Регистрация
25.06.2023
Сообщения
210
Решения
2
Реакции
93
Гарант сделки
2
Всем привет!

Пытаюсь внутри кода выполнить дешифровку строк, в которых прописаны пути до ключей реестра. Код следующий:
C++:
#include <windows.h>
#include <bcrypt.h>
#include <iostream>
#include <vector>
#include <ntstatus.h>

#pragma comment(lib, "bcrypt.lib")

void handleError(NTSTATUS status, const wchar_t* msg) {
    if (status != STATUS_SUCCESS) {
        std::cerr << "Error: " << std::hex << status << std::endl;
        std::wcout << msg;
        exit(1);
    }
}

std::vector<BYTE> aesDecrypt(const std::vector<BYTE>& ciphertext, const std::vector<BYTE>& key, const std::vector<BYTE>& iv) {
    BCRYPT_ALG_HANDLE hAlg = nullptr;
    BCRYPT_KEY_HANDLE hKey = nullptr;
    DWORD cbData = 0;
    NTSTATUS status;

    // Создание алгоритма AES
    handleError(BCryptOpenAlgorithmProvider(&hAlg, BCRYPT_AES_ALGORITHM, nullptr, 0), L"Create algoritm AES decr");

    // Создание ключа
    handleError(BCryptGenerateSymmetricKey(hAlg, &hKey, nullptr, 0, (PUCHAR)key.data(), key.size(), 0), L"Create keys decr");

    // Установка IV
    handleError(BCryptSetProperty(hKey, BCRYPT_INITIALIZATION_VECTOR, (PUCHAR)iv.data(), iv.size(), 0), L"Setup IV decr");

    // Подготовка буфера для расшифровки
    std::vector<BYTE> plaintext(ciphertext.size());

    // Расшифровка
    handleError(BCryptDecrypt(hKey, (PUCHAR)ciphertext.data(), ciphertext.size(), nullptr, (PUCHAR)iv.data(), iv.size(),
        plaintext.data(), plaintext.size(), &cbData, BCRYPT_BLOCK_PADDING), L"Decryptus");

    plaintext.resize(cbData);

    // Освобождение ресурсов
    BCryptDestroyKey(hKey);
    BCryptCloseAlgorithmProvider(hAlg, 0);

    return plaintext;
}

int main() {

    std::string key_str = "01234567890123456789012345678901";
    std::string iv_str = "0123456789012345";

    std::vector<BYTE> key(key_str.begin(), key_str.end());
    std::vector<BYTE> iv(iv_str.begin(), iv_str.end());

    // Environment
    std::vector<BYTE> subKey_crt = {
        0xb3, 0x0c, 0xf7, 0x52, 0x66, 0x6c, 0x35, 0x6b, 0xb7, 0x21, 0x16, 0xec, 0x6f, 0x60, 0xbf, 0xf2
    };

    // UserinitMprLogonScript
    std::vector<BYTE> valueName_crt = {
        0x5c, 0xff, 0xb7, 0xba, 0xac, 0x38, 0x72, 0xae, 0xac, 0x65, 0x9f, 0x69, 0x45, 0x1e, 0x04, 0xac, 0x07, 0xaf, 0x3e, 0xe0, 0x65, 0x18, 0x02, 0x79, 0xc6, 0x63, 0x9b, 0x10, 0xc1, 0xec, 0xfa, 0x1e
    };

    // C:\\folder\\mobsync.exe
    std::vector<BYTE> valueData_crt = {
        0x7a, 0xf6, 0xf6, 0x66, 0xf9, 0x41, 0x77, 0x21, 0xed, 0x77, 0xca, 0xd3, 0xb1, 0xfc, 0x31, 0xe4, 0x9a, 0x91, 0x0e, 0x71, 0x98, 0x49, 0x04, 0x4f, 0x8a, 0x6d, 0xe5, 0x2e, 0xdd, 0xd0, 0x8a, 0xa6
    };

    // Расшифровка
    std::vector<BYTE> subKey = aesDecrypt(subKey_crt, key, iv);
    std::cout << "Decrypted: \n";
    for (BYTE b : subKey) {
        std::wcout << (wchar_t)b;
    }
    std::cout << std::endl;

    std::vector<BYTE> valueName = aesDecrypt(valueName_crt, key, iv);
    for (BYTE b : valueName) {
          std::wcout << (wchar_t)b;
    }
    std::cout << std::endl;

    std::vector<BYTE> valueData = aesDecrypt(valueData_crt, key, iv);
    for (BYTE b : valueData) {
        std::wcout << (wchar_t)b;
    }
    std::cout << std::endl;

    return 0;

}



На выходе получаю такую лажу:

Снимок.JPG


Путём небольших экспериментов понимаю что функция дешифровки нормально отрабатывает только первый раз. Потом начинает гнать тарабарщину. Такое чувство как-будто что то не очищаю перед повторным использованием. Только не могу понять что именно.

Для шифровки использую AES с режимом CBC на таком сервисе: https://tophix[.]com/ru/development-tools/encrypt-text


Снимаок.JPG



Подскажите, куда копнуть?
 
Всем привет!

Подскажите, куда копнуть?
Ты передаешь iv - строку по ссылке, затем сырой указатель в винапи, данные в строке меняются
убери передачу по ссылке:
std::vector<BYTE> aesDecrypt(const std::vector<BYTE>& ciphertext, const std::vector<BYTE>& key, const std::vector<BYTE>& iv)
 


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