大题目是加密,
如果没见过的话,那就得慢慢看代码了。
查看IDA代码,有三个函数很重要。
第一个函数和外部因素没有关系,所以只需要动态调试拿到函数的结果就可以了,可以拿到一个256长度的数组。
第二个函数做了异或操作。
第三个函数根据特征猜测是base64换表加密。
三个函数还原python代码大概如下:
import string
#第一个函数
s1 = []
str = 'Please input the flag:\n'
for i in range(256):
s1.append(i)
a2 = 0
j = 0
for i in range(256):
a1 = s1[i]
a2 = (ord(str[j]) + a2 + s1[i]) & 0xff
s1[i] = s1[a2]
s1[a2] = a1
j += 1
if j >= len(str):
j = 0
#第二个函数
str_tmp = string.printable
flag = ''
cmp = [0xf5, 0x7d, 0xcb, 0xc6, 0xe2, 0x80, 0x1a, 0xfe, 0x70, 0xcc, 0xe4, 0x1f, 0x80, 0xdd, 0x3b, 0x5e, 0xd3, 0xbb, 0x8d]
a2 = 0
for i in range(len(cmp)):
a1 = s1[i + 1]
a2 = (a2 + a1) & 0xff
a3 = s1[a2]
s1[i + 1] = a3
s1[a2] = a1
for x in str_tmp:
tmp = ord(x) ^ (s1[(a1 + a3) & 0xff])
if tmp == cmp[i]:
flag += x
break
print(flag)
#第三个函数
import base64
s1 = 'nczo2VXpPshL4wUgjH6DEG39yr+aOYWCfBeN5lb8v7QdxZuAMq/J0tTI1RkSimKF'
s2 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
data = 'm9ILquhnXARMJUjCfw0S9ZUSNj=='
result = base64.b64decode(data.translate(str.maketrans(s1, s2)).encode('utf-8'))
print(result)
感觉这个题可以直接复制伪代码到VS里当做C语言运行,那样方便很多。
解出来flag是CTF{RC4_4Nd_Ba5E64}
原来RC4是这个东西啊,都没看过RC4加密,RC4部分纯逆向代码,也算练习了一下吧。还好flag给了所用的加密,要不我逆出来也不知道它是RC4。