[HDCTF 2023]enc

文章描述了一个技术解密过程,涉及32位程序中使用Tea加密算法(标准和自定义)以及随后的RC4加密。作者提到通过VisualStudio运行程序,并使用IDA工具分析代码,揭示了SMC和花指令的可能加密策略。
摘要由CSDN通过智能技术生成

32位

这里后面运行这个程序居然要 Visual Studio,不然运行不了

IDA打开,直接锁定main函数

看见v9,四个32位,就想到了tea加密

标准tea

from ctypes import *
#tea
def decrypt(v, k):
    v0 = c_uint32(v[0])
    v1 = c_uint32(v[1])
    delta = 0x9e3779b9
    sum1 = c_uint32(delta * 32)
    for i in range(32):
        v1.value -= ((v0.value << 4) + k[2]) ^ (v0.value + sum1.value) ^ ((v0.value >> 5) + k[3])
        v0.value -= ((v1.value << 4) + k[0]) ^ (v1.value + sum1.value) ^ ((v1.value >> 5) + k[1])
        sum1.value -= delta
    return v0.value, v1.value
if __name__ == '__main__':
    a = [1627184887, 37149676]
    k = [18, 52, 86, 120]
    print("解密后数据:", decrypt(a,k))

4是直接赋值的,3就是我们输入的

但是这只是第一关,下面还有一个函数

我们进sub411302发现是这个,两种可能

smc和花指令

我们看汇编,这是正常的

那么就是smc自加密了

动调

再次编译下这个函数就ok了

int __cdecl sub_41D000(char *Str)
{
  char v2; // [esp+0h] [ebp-558h]
  size_t m; // [esp+190h] [ebp-3C8h]
  BOOL v4; // [esp+19Ch] [ebp-3BCh]
  int k; // [esp+1A8h] [ebp-3B0h]
  int v6; // [esp+1B4h] [ebp-3A4h]
  int v7; // [esp+1C0h] [ebp-398h]
  int i; // [esp+1CCh] [ebp-38Ch]
  int j; // [esp+1CCh] [ebp-38Ch]
  int v10; // [esp+1CCh] [ebp-38Ch]
  char v11; // [esp+1DBh] [ebp-37Dh]
  char v12; // [esp+1DBh] [ebp-37Dh]
  char v13[540]; // [esp+1E4h] [ebp-374h]
  char v14[24]; // [esp+400h] [ebp-158h] BYREF
  int v15; // [esp+418h] [ebp-140h]
  char v16[264]; // [esp+424h] [ebp-134h] BYREF
  char v17[40]; // [esp+52Ch] [ebp-2Ch] BYREF

  __CheckForDebuggerJustMyCode(&unk_425036);
  v17[0] = 15;
  v17[1] = -108;
  v17[2] = -82;
  v17[3] = -14;
  v17[4] = -64;
  v17[5] = 87;
  v17[6] = -62;
  v17[7] = -32;
  v17[8] = -102;
  v17[9] = 69;
  v17[10] = 55;
  v17[11] = 80;
  v17[12] = -11;
  v17[13] = -96;
  v17[14] = 94;
  v17[15] = -53;
  v17[16] = 44;
  v17[17] = 22;
  v17[18] = 40;
  v17[19] = 41;
  v17[20] = -2;
  v17[21] = -1;
  v17[22] = 51;
  v17[23] = 70;
  v17[24] = 14;
  v17[25] = 87;
  v17[26] = -126;
  v17[27] = 34;
  v17[28] = 82;
  v17[29] = 38;
  v17[30] = 43;
  v17[31] = 110;
  v17[32] = -28;
  v17[33] = -126;
  v17[34] = 36;
  j_memset(v16, 0, 0x100u);
  v15 = j_strlen(Str);
  strcpy(v14, "you_are_master");
  v13[531] = 0;
  v6 = 0;
  for ( i = 0; i < 256; ++i )
  {
    v13[i + 264] = i;
    v13[i] = v14[i % j_strlen(v14)];
  }
  for ( j = 0; j < 256; ++j )
  {
    v6 = (v13[j] + v6 + v13[j + 264]) % 256;
    v11 = v13[j + 264];
    v13[j + 264] = v13[v6 + 264];
    v13[v6 + 264] = v11;
  }
  v7 = 0;
  v10 = 0;
  for ( k = 0; k < v15; ++k )
  {
    v10 = (v10 + 1) % 256;
    v7 = (v7 + v13[v10 + 264]) % 256;
    v12 = v13[v10 + 264];
    v13[v10 + 264] = v13[v7 + 264];
    v13[v7 + 264] = v12;
    v16[k] = v13[(v13[v7 + 264] + v13[v10 + 264]) % 256 + 264] ^ Str[k];
  }
  v4 = j_strlen(Str) == 35;
  for ( m = 0; m < j_strlen(v17); ++m )
  {
    if ( v17[m] != v16[m] )
    {
      v4 = 0;
      break;
    }
  }
  if ( v4 )
    return sub_41114F("right!!!!", v2);
  else
    return sub_41114F("please try agin~", v2);
}

进入是一个RC4加密算法

from Crypto.Cipher import ARC4
# 假设这是经过RC4加密的数据
encrypt_data = [15, 148, 174, 242, 192, 87, 194, 224, 154, 69,
                55, 80, 245, 160, 94, 203, 44, 22, 40, 41,
                254, 255, 51, 70, 14, 87, 130, 34, 82, 38,
                43, 110, 228, 130, 36]
key = 'you_are_master'
encrypt_data_bytes = bytes("HDCTF{y0u_ar3_rc4_t3a_smc_m4ster!!}")
key_bytes = bytes(key, 'utf-8')
cipher = ARC4.new(key_bytes)
decrypted_data = cipher.encrypt(encrypt_data_bytes)
# 输出解密后的数据
try:
    print(decrypted_data.decode('utf-8'))  # 尝试以UTF-8格式解码
except UnicodeDecodeError:
    print("无法以UTF-8解码,原始数据可能不是以UTF-8编码。请检查原始数据的编码方式。")
# 如果你知道原始数据的具体编码方式,替换上面的 'utf-8' 为你知道的编码方式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Nickname

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值