START XSS QUEST
Там какой-то хекс-код, копируем его в хекс-редактор, сохраняем; это 7Z
#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);
}