[SMC+OpenSSL]r3ctf nSMC
SMC
参考文章:https://www.cnblogs.com/hetianlab/p/17199400.html
SMC实现的主要步骤包括:
1.读取PE文件并找到需要加密的代码段。
2.将代码段的内容进行异或加密,并更新到内存中的代码段。
3.重定向代码段的内存地址,使得加密后的代码能够正确执行。
4.执行加密后的代码段。
OpenSSL
OSSL_PROVIDER *OSSL_PROVIDER_load(OSSL_LIB_CTX *libctx, const char *name);
加载不同的provider.
默认提供者(Default Provider):
OSSL_PROVIDER *OSSL_PROVIDER_load(OSSL_LIB_CTX *libctx, "default");
提供现代、广泛使用的加密算法,包括对称加密、非对称加密、哈希函数、数字签名等。
例如,AES、RSA、SHA-2、ECDSA 等。
遗留提供者(Legacy Provider):
OSSL_PROVIDER *OSSL_PROVIDER_load(OSSL_LIB_CTX *libctx, "legacy");
用于需要支持老旧系统或遗留系统的场景,提供一些较旧的加密算法。
这些算法可能不再被推荐用于新项目,因为它们的安全性可能较低。
示例:使用 DES 进行加密。
FIPS 提供者:
OSSL_PROVIDER *OSSL_PROVIDER_load(OSSL_LIB_CTX *libctx, "fips");
用于需要符合 FIPS 标准的场景,确保使用的加密算法符合特定的安全标准。
示例:使用 FIPS 认证的 AES 进行加密。
此题加载了前两个provider
加密函数:
// 创建和初始化上下文
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
// 禁用填充
if (1 != EVP_CIPHER_CTX_set_padding(ctx, 0))
// 初始化加密操作
if (1 != EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv))
// 提供要加密的数据
EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, strlen((char *)plaintext))
// 最后一步加密操作
EVP_EncryptFinal_ex(ctx, ciphertext + len, &len)
// 清理
EVP_CIPHER_CTX_free(ctx);
SMC技术将plaintext解密,之后将解密的值fun()的地址处
附加一道简单的smc
patch一下
之后将这个函数的部分全部u掉,之后p(如果直接p可能会识别不出来,导致不能反编译)