22这个数字我很喜欢,就是出的题目难了点😥
ezapk-1
java层有XTEA
魔改异或918,得到username,负数用jeb转成16进制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
   | #include <stdio.h> #include <stdint.h>
  int main() {     uint32_t v[2] = { 1, 2 };     int num = 32;     uint32_t v0 = v[0], v1 = v[1], i;      uint32_t delta = 0x9E3779B9, sum = 0x9E3779B9 * num;     uint32_t v2[2] = { 0x3D121D26, 0x5E6189F9 }, v3[2] = { 0xC1FB278E, 0x3B494648 }, v5[10] = { 0x3c36eb49, 0x81acb0c0, 0xfac269ae, 0xca5bf9ec };     uint32_t k[4] = { 0x12345678, 0x5678abcd, 0x89ABCDEF, 0xCDEF1234 }, l = 0, r = 0;     uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3];               for (int m = 0; m < 8; m += 2) {         sum = 0x9E3779B9 * num;         for (i = 0; i < 32; i++) {                                  v5[m + 1] -= (v5[m] << 4 ^ v5[m] >> 5)  + v5[m] ^ 918 ^ k[(sum >> 11) & 3] + sum;             sum += 0x61C88647;             v5[m] -= (v5[m + 1] << 4 ^ v5[m + 1] >> 5) + v5[m + 1] ^ 918 ^ k[sum & 3] + sum;         }                                                   }
      for (int i = 0; i < 8; i++) {         for (int m = 0; m <= 3; m++) {             printf("%c", (v5[i] >> (8 * m)) & 0xff);         }     }
      return 0; }
 
 
  | 
 
魔改rc4,256变成128
一开始以为validatePassword函数还有加密,后来想如果是这样的话java层应该有密文,再去看发现上面函数只是确认密文,这样看的话java层validatePassword(str, encryptWithRC4(str2, str))两个str含义不一样
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
   | def rc4(data, key):     S = list(range(128))     j = 0     out = []
      for i in range(128):         j = (j + S[i] + key[i % len(key)]) % 128         S[i], S[j] = S[j], S[i]
      i = j = 0     for char in data:         i = (i + 1) % 128         j = (j + S[i]) % 128         S[i], S[j] = S[j], S[i]         out.append(char ^ S[(S[i] + S[j]) % 128])
      return bytes(out)
 
  data = bytes.fromhex("572e180b1a680b3e5276344b241d5b52525a043173346b1355442028") key = b'NS5_R0Un6_z2_apK' decrypted = rc4(data, key) print(decrypted)
 
 
  | 
 
EzHook-1
复现来自yuro✌和P✌
考得是Windows IAT Hook技术,本题hook了MessageBoxA函数,当执行MessageBoxA的时候会跑到另外地方
4B0函数里面一堆异或,一个个写出来不显示,后面Right?的话应该没这么简单
往main前找,找到1240,调试起来发现运行在main函数之后
1880和1840里面调用的函数是一样的,那么大概率就是一对加解密函数
细看猜测是xxtea
最后给了个弹窗,也就是说a090函数是MessageBoxA函数
调试到这里把str2赋值给a2
1
   | E4 E7 FE E3 17 1C DE 32 E6 B8 68 40 40 D8 72 FA 88 14 E1 85 CD 81 AA DE 1D E8 92 41 B8 1E 5E CF CE 49 27 22 39 7D 50 DA
 
  | 
 
通过汇编的rcx进入编辑
每16个地址change byte一次,把对应的密文填进去

运行到解密函数之后
直接就是参数a1NSSCTF{C0ngr@tulat1ons!H0Ok_bY_1t_s3lf!}