[SMC+OpenSSL]r3ctf nSMC

Un1corn發表於2024-07-18

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 進行加密。
img
此題載入了前兩個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()的地址處
img

附加一道簡單的smc
img
patch一下
img
之後將這個函式的部分全部u掉,之後p(如果直接p可能會識別不出來,導致不能反編譯)