NSSRound22-Reverse专项赛

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; /* set up */
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];
// v为要加密的数据是两个32位无符号整数
// k为加密解密密钥,为4个32位无符号整数,即密钥长度为128位
for (int m = 0; m < 8; m += 2) {//flag不全的话有可能是10
sum = 0x9E3779B9 * num;
for (i = 0; i < 32; i++) { /* basic cycle start */
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;
} /* end cycle */
}

for (int i = 0; i < 8; i++) {
for (int m = 0; m <= 3; m++) {
printf("%c", (v5[i] >> (8 * m)) & 0xff);
}
}

return 0;
}
//NS5_R0Un6_z2_apK

魔改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)
#NSSCTF{V3ry_4z_1ib_W1th_4pk}

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


NSSRound22-Reverse专项赛
https://j1ya-22.github.io/2024/04/28/NSSRound22Reverse专项赛/
作者
j1ya
发布于
2024年4月28日
许可协议