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!}