RE_signin

题目写opcode,在网上搜了下开始看

image-20240920154555053

1
2
写点关键的:这里意思是base=i%4
如果base==0,跳转226,下面类似的就不写了

image-20240920154726477

1
2
3
下面的意思是
temp += ((ord(flag[i]) % ord(key[i % 14]))
同理下面还有*/^操作

image-20240920154910278

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
最后分析完毕写出脚本
key = 'mrl64_l0v3Miku'
cipher = [221, -25, 9072, 94, 163, -17, 10260, 0, 198, 16, 8547, 13, 158, -22, 9701, 29, 193, 41, 5096, 13, 219, 27, 6018, 125, 172, 15, 5243, 45, 182, -19, 5292, 84, 149, -41, 10476, 4, 174, 51, 4235, 12]
flag = ''

for i in range(len(cipher)):
base = i % 4
key_char = ord(key[i % 14])
if base == 0:
flag += chr((cipher[i] - key_char) % 256)
elif base == 1:
flag += chr((cipher[i] + key_char) % 256)
elif base == 2:
flag += chr((cipher[i] // key_char) % 256)
else:
flag += chr((cipher[i] ^ key_char) % 256)
print(flag)

🎲

1
打开题目发现有dll和exe,用ilspy和ida分别试一试,ida里面没什么东西,ilspy在main函数里发现了加密函数

image-20240920155708234

1
2
这个解密函数大意就是把array里的内容先拿去加上它下标的十倍,内容随机存入output.txt
我们要做的就是根据output.txt找出array的内容,本来想着跟c一样硬去逆算法,出题人说随机种子不是固定的,之后又把output.txt去重看了下

image-20240920155950645

1
2
78 93 97 103 120 124 145 152 168 183 189 193 197 198 200 225 245 255 287 294 299 322 345
得到这样一些数字,可以发现78-0='N',93-10='S',这就是加密后的flag,随机到的顺序有区别,所以顺序是有规律的,在用py脚本把output.txt里每个出现次数求出来,从小到大就是正确的排序了最后得出答案

image-20240920160608798

calc

1
上次校赛也有,沙箱题,随便网上搜一个沙箱问题合集,nc进去,输进去发现有长度限制,找到这类问题的模板,一条一条试,发现breakpoint()就解决了

image-20240920161020452

image-20240920161145501

image-20240920161327741

1
模板来源:

image-20240920161350754