第一个是一个 AES

key 是

0x35, 0x77, 0x40, 0x2E, 0xCC, 0xA4, 0x4A, 0x3F, 0x9A, 0xB7, 
0x21, 0x82, 0xF9, 0xB0, 0x1F, 0x35

从后往前看

__int64 __fastcall sub_4020F7(__int64 result)
{
  int v1; // r8d
  int v2; // ecx
  int v3; // ecx
  int var38[16]; // [rsp+8h] [rbp-38h]
  int i; // [rsp+38h] [rbp-8h]
  unsigned int v7; // [rsp+3Ch] [rbp-4h]
 
  v7 = 1;
  for ( i = 0; i <= 15; ++i )
  {
    var38[11] = *(_DWORD *)(48i64 * i + result);
    var38[10] = *(_DWORD *)(48i64 * i + result + 4);
    var38[9] = *(_DWORD *)(48i64 * i + result + 8);
    var38[8] = *(_DWORD *)(48i64 * i + result + 12);
    var38[7] = *(_DWORD *)(48i64 * i + result + 16);
    var38[6] = *(_DWORD *)(48i64 * i + result + 20);
    var38[5] = *(_DWORD *)(48i64 * i + result + 24);
    var38[4] = *(_DWORD *)(48i64 * i + result + 28);
    var38[3] = *(_DWORD *)(48i64 * i + result + 32);
    var38[2] = *(_DWORD *)(48i64 * i + result + 36);
    var38[1] = *(_DWORD *)(48i64 * i + result + 40);
    var38[0] = *(_DWORD *)(48i64 * i + result + 44);
    v1 = var38[2] & var38[3] & var38[4] & (var38[6] == 0) & (var38[7] == 0) & var38[8] & ((var38[9] | var38[10] | var38[11]) == 0) & (var38[5] == 0) & (var38[1] == 0) | var38[2] & var38[4] & var38[6] & (var38[8] == 0) & (var38[9] == 0) & var38[11] & (var38[10] == 0) & (var38[7] == 0) & (var38[5] == 0) & (var38[3] == 0) & (var38[1] == 0) | var38[1] & (var38[3] == 0) & (var38[4] == 0) & (var38[5] == 0) & var38[6] & var38[7] & (unsigned __int8)(var38[9] & var38[10] & LOBYTE(var38[11])) & (var38[8] == 0) & (var38[2] == 0);
    v2 = var38[0] & var38[1] & var38[3] & var38[4] & var38[5] & var38[6] & var38[7] & (var38[9] == 0) & (unsigned __int8)(var38[10] & LOBYTE(var38[11])) & (var38[8] == 0) & (var38[2] == 0) | (var38[1] == 0) & (var38[2] == 0) & var38[3] & var38[4] & var38[5] & var38[7] & var38[8] & var38[10] & (var38[11] == 0) & (var38[9] == 0) & (var38[6] == 0) & (var38[0] == 0) | var38[0] & (var38[2] == 0) & var38[3] & var38[5] & var38[7] & var38[8] & var38[9] & var38[11] & (var38[10] == 0) & (var38[6] == 0) & (var38[4] == 0) & (var38[1] == 0) | var38[0] & var38[2] & var38[3] & var38[5] & var38[6] & var38[8] & var38[9] & (*(_QWORD *)&var38[10] == 0i64) & (var38[7] == 0) & (var38[4] == 0) & (var38[1] == 0) | (v1 | var38[1] & var38[2] & (var38[4] == 0) & var38[5] & (var38[7] == 0) & var38[8] & var38[9] & var38[11] & (var38[10] == 0) & (var38[6] == 0) & (var38[3] == 0)) & (var38[0] == 0);
    v3 = var38[0] & var38[1] & (var38[3] == 0) & (var38[4] == 0) & var38[5] & (var38[7] == 0) & (var38[8] == 0) & (var38[9] == 0) & (unsigned __int8)(var38[10] & LOBYTE(var38[11])) & (var38[6] == 0) & (var38[2] == 0) | (var38[1] == 0) & (var38[2] == 0) & (var38[3] == 0) & (var38[4] == 0) & var38[5] & (var38[7] == 0) & var38[8] & ((var38[9] | var38[10] | var38[11]) == 0) & (var38[6] == 0) & (var38[0] == 0) | var38[0] & var38[1] & var38[2] & (var38[4] == 0) & (var38[5] == 0) & var38[6] & var38[7] & (var38[9] == 0) & var38[10] & (var38[11] == 0) & (var38[8] == 0) & (var38[3] == 0) | var38[0] & var38[2] & (var38[4] == 0) & (var38[5] == 0) & var38[6] & ((var38[7] | var38[8] | var38[9] | var38[10] | var38[11]) == 0) & (var38[3] == 0) & (var38[1] == 0) | var38[0] & (var38[2] == 0) & (var38[3] == 0) & var38[4] & var38[5] & var38[6] & var38[7] & (var38[9] == 0) & var38[11] & (var38[10] == 0) & (var38[8] == 0) & (var38[1] == 0) | v2;
    if ( !(var38[1] & var38[3] & var38[5] & var38[7] & (var38[9] == 0) & var38[10] & (var38[11] == 0) & (var38[8] == 0) & (var38[6] == 0) & (var38[4] == 0) & (var38[2] == 0) & (var38[0] == 0) | var38[0] & var38[1] & var38[2] & var38[3] & (var38[5] == 0) & (var38[6] == 0) & var38[7] & (var38[9] == 0) & var38[10] & (var38[11] == 0) & (var38[8] == 0) & (var38[4] == 0) | v3 | var38[1] & var38[2] & var38[3] & var38[5] & var38[7] & ((var38[8] | var38[9] | var38[10] | var38[11]) == 0) & (var38[6] == 0) & (var38[4] == 0) & (var38[0] == 0)) )
      v7 = 0;
  }
  return v7;
}
char __fastcall sub_402001(int *result, unsigned __int8 *buf)
{
  __int64 k_1; // rax
  int k; // [rsp+0h] [rbp-10h]
  int j; // [rsp+4h] [rbp-Ch]
  int i; // [rsp+8h] [rbp-8h]
  int now_i; // [rsp+Ch] [rbp-4h]
 
  for ( i = 0; i <= 15; ++i )
  {
    LOBYTE(k_1) = i;
    now_i = i;
    for ( j = 0; j <= 3; ++j )
    {
      k_1 = 11 - j;
      result[12 * i + k_1] = now_i & 1;         // 8-11 index
      now_i >>= 1;
    }
    for ( k = 0; k <= 7; ++k )
    {
      result[12 * i + 7 - k] = buf[i] & 1;      // 0-7 buf
      LOBYTE(k_1) = buf[i] >> 1;
      buf[i] = k_1;
    }
  }
  return k_1;
}

把输入按位拆开,前 8 bits 放在 0-7(大的在前面),后面 8-11 放 index 的 bits

那就反转过来 3-11 是我们想要的数据,写个 z3 求解出来:

from z3 import *
res = []
for i in range(16):
	sol = Solver()
	v5 = [BitVec(f"v{i}", 1) for i in range(12)]
 
	v1 = v5[2] & v5[3] & v5[4] & (~v5[6]) & (~v5[7]) & v5[8] & (~(v5[9] | v5[10] | v5[11])) & (~v5[5]) & (~v5[1]) | v5[2] & v5[4] & v5[6] & (~v5[8]) & (~v5[9]) & v5[11] & (~v5[10]) & (~v5[7]) & (~v5[5]) & (~v5[3]) & (~v5[1]) | v5[1] & (~v5[3]) & (~v5[4]) & (~v5[5]) & v5[6] & v5[7] & (v5[9] & v5[10] & v5[11]) & (~v5[8]) & (~v5[2])
	v2 = v5[0] & v5[1] & v5[3] & v5[4] & v5[5] & v5[6] & v5[7] & (~v5[9]) & v5[10] & v5[11] & (~v5[8]) & (~v5[2]) | (~v5[1]) & (~v5[2]) & v5[3] & v5[4] & v5[5] & v5[7] & v5[8] & v5[10] & (~v5[11]) & (~v5[9]) & (~v5[6]) & (~v5[0]) | v5[0] & (~v5[2]) & v5[3] & v5[5] & v5[7] & v5[8] & v5[9] & v5[11] & (~v5[10]) & (~v5[6]) & (~v5[4]) & (~v5[1]) | v5[0] & v5[2] & v5[3] & v5[5] & v5[6] & v5[8] & v5[9] & (~v5[10]) & (~v5[11]) & (~v5[7]) & (~v5[4]) & (~v5[1]) | (v1 | v5[1] & v5[2] & (~v5[4]) & v5[5] & (~v5[7]) & v5[8] & v5[9] & v5[11] & (~v5[10]) & (~v5[6]) & (~v5[3])) & (~v5[0])
	v3 = v5[0] & v5[1] & (~v5[3]) & (~v5[4]) & v5[5] & (~v5[7]) & (~v5[8]) & (~v5[9]) & v5[10] & v5[11] & (~v5[6]) & (~v5[2]) | (~v5[1]) & (~v5[2]) & (~v5[3]) & (~v5[4]) & v5[5] & (~v5[7]) & v5[8] & (~(v5[9] | v5[10] | v5[11])) & (~v5[6]) & (~v5[0]) | v5[0] & v5[1] & v5[2] & (~v5[4]) & (~v5[5]) & v5[6] & v5[7] & (~v5[9]) & v5[10] & (~v5[11]) & (~v5[8]) & (~v5[3]) | v5[0] & v5[2] & (~v5[4]) & (~v5[5]) & v5[6] & (~(v5[7] | v5[8] | v5[9] | v5[10] | v5[11])) & (~v5[3]) & (~v5[1]) | v5[0] & (~v5[2]) & (~v5[3]) & v5[4] & v5[5] & v5[6] & v5[7] & (~v5[9]) & v5[11] & (~v5[10]) & (~v5[8]) & (~v5[1]) | v2
	v4 = v5[1] & v5[3] & v5[5] & v5[7] & (~v5[9]) & v5[10] & (~v5[11]) & (~v5[8]) & (~v5[6]) & (~v5[4]) & (~v5[2]) & (~v5[0]) | v5[0] & v5[1] & v5[2] & v5[3] & (~v5[5]) & (~v5[6]) & v5[7] & (~v5[9]) & v5[10] & (~v5[11]) & (~v5[8]) & (~v5[4]) | v3 | v5[1] & v5[2] & v5[3] & v5[5] & v5[7] & (~(v5[8] | v5[9] | v5[10] | v5[11])) & (~v5[6]) & (~v5[4]) & (~v5[0])
 
	sol.add(v4 == 1)
	sol.add(v5[0] == i&1)
	sol.add(v5[1] == (i>>1)&1)
	sol.add(v5[2] == (i>>2)&1)
	sol.add(v5[3] == (i>>3)&1)
 
	sol.check()
	mod = sol.model()
	# print(mod)
	x = 0
	for j in range(11, 3, -1):
		x = (x << 1) | (mod[v5[j]].as_long())
	res.append(x)
print(res)
for _ in res:
	print(hex(_)[2:], end=" ")
18, 143, 236, 194, 133, 4, 178, 76, 91, 186, 74, 207, 17, 54, 10, 72
12 8f ec c2 85 4 b2 4c 5b ba 4a cf 11 36 a 48
35 77 40 2E CC A4 4A 3F 9A B7 21 82 F9 B0 1F 35

好像 no-padding 才是对的

4d87ef03-77bb-491a-80f5-4620245807c4