华科第一届网络安全挑战赛wp
web
secure_shell
考点:exec()无回显
先测试一下能不能执行 cmd=1;sleep 4
发现反应了4秒,能执行
然后直接 cat /f* > 1.txt
最后访问/1.txt路径就行
pyssrf
考点:ssrf漏洞
打开有个提示 /get?site=
直接file读取flag
/get?site=file:///flag
misc
一闪一闪亮晶晶
考点:凯撒与base64结合,starry语言
根据提示,“凯撒大帝想学习一下Starry语言,你能帮帮他么吗”,一定跟凯撒密码和starry语言有关。
下载文件,是一串重复度非常高的字符串
JDBhJDBsJDBhJDBsJDBhJDBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhLxprJDBhJDBhJDBsJDBrJDBhJDBsLjBsJDBhMjBhJDBhLzBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzprJDthMjBhJDBhLzBhJDBhJDBhDjthJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDtLLjBsJDBhJDBvJDBhJDBsJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJDBhJDBhJDthJDphJDBhJBphLzphJDBhJDthJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphDjBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhLzBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBLJDthJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJD4hJDBhJDBhMjBsJD4hJDBhJDthJDBhJDBhJDthJDphJDBhJDBsLjphLzBhJDBhJDBvJBphJDBhLzBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhLzphJDBhDjBsJDBhJDBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhJDBhLzBLJDphJDBhJDtrJDBhJDBsJDBhJDBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJBphJDBhJDtrJDBhMjBhJD4hLzBhJDBhMjBhJDBhLzBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhDjBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBsJDBhJDBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDtrJDBhJDBhJDBLLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDthJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBhLzBhLhphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJD4hJDBhJD4hLzBhJDBhJDBvJDBhJDBsJDBhJDBhJDBsJDBrDjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphLzBhJDBhJDBvJDBhJDBsJDBhJDBhJDBLLzBhLjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBsLhphLzBhJD4hJDBhJDthJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhDjBsLjBsJDBhJDBhJD4hJDBhJDthJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJDBhJDBhJDthJDpLJDBhJDBhJDtrLjBsJDBhJDBvJDBhJDBsJDBhJDBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJBphJDthJDphJDBhJDBsLjBsJDBhMjBhJDBhLzBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhDjBhJDBhLzBhLjBhJDBhJDtrJDBhJDBsJDBhJDBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDtrJDBhJDBhJDBLLzBhLjBhJDBhLzphJDBhJD4hLzBhJDBhMjBhJDBhLzBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLhphJDBhJDBhJDthJDphJDBhJDtrJDBhJDBsJDBhJDBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhDjBhJDBsJDBrJDBhJDBsLjBhJDBhLzBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBhLzBLJDphJDBhJDtrJDBhJDBsJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJBphLzphJDBhJDBhMjBhJDBhJDBvJDBhJDBhJD4hLzBhJDBhMjBhJDBhLzBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJDBhJDBhJDthDjBrJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDBsLjBsJDBhJDBvJDBhJDBsJDBhJDBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDtrJDBhJDBhJDBLLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBsLjBsJDBhJDBhJD4hJDBhJDthJDBhJDBhJDthJDphJDBhJDBsLjBhJBphJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhLzBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJDBsDjBhLjBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJDBhJDthJDBhJDBhJDthJDphJDBLJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhMjBhJDBhMjBsJDBhMjBhJDBhLxphJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJDBhJDthJDBhDjBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDthJDBhJDBLJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhLzBhJDBhJDBhLxphJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphMjBvJD4hLzBhJDBhMjBhJDBhDjthJDBhJDBhJDthJDphJDBhJDBsLjBrJDthJDBhJD4hJDBhJDthJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJDBhJDBhJDthJDphJDBLJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJDBhJDthJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJBphJDBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDthJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhDjBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDthJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBLJDthJDphJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBsJDBhJDBhJDBsJDBrJBphJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhMjBhJDBhMjBhJDBhMjBhJDBhDj4hLzBhJDBhMjBhJDBhLzBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBLJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDthJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhLxprJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhLzBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhDjBhJDthJDphJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhLzphMjBvJDthMjBhJDBhLzBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBLJDBhJDthJDphJDBhJDBsLjBsJDBhJDBhJD4=
看到末尾的=,想到base64,所以是凯撒与base64的结合。
先用脚本爆破凯撒,将结果用base64编码
import base64
# 截取文件最前面一部分进行猜测,因为根据后面可知这一部分是近似的四字符反复重复
key = "JDBhJDBsJDBhJDBsJDBhJDBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBh"
# 遍历凯撒加密中25种的可能性
for n in range(0, 26):
str_encrypt = ""
for letter in key:
if "a" <= letter <= "z":
str_encrypt += chr((ord(letter) - ord("a") + n) % 26 + ord("a"))
elif "A" <= letter <= "Z":
str_encrypt += chr((ord(letter) - ord("A") + n) % 26 + ord("A"))
else:
str_encrypt += letter
# 输出每一种可能性最后的结果
print(base64.decodebytes(str_encrypt.encode()))
结果中发现只有当n=25时,会出现starry语言特有的+,*等符号
于是用脚本将其全部转化成starry语言
import base64
with open("C:\\Users\\Lucky\\Desktop\\华科杯\\misc\\一闪一闪亮晶晶\\flag.txt", "r", encoding="utf-8") as f: #flag.txt是凯撒密码的文本
str_encrypt = ""
n = 25
for letter in f.read():
if "a" <= letter <= "z":
str_encrypt += chr((ord(letter) - ord("a") + n) % 26 + ord("a"))
elif "A" <= letter <= "Z":
str_encrypt += chr((ord(letter) - ord("A") + n) % 26 + ord("A"))
else:
str_encrypt += letter
open("C:\\Users\\Lucky\\Desktop\\华科杯\\misc\\一闪一闪亮晶晶\\flag.starry", "wb").write(base64.decodebytes(str_encrypt.encode()))
最后用starry语言转换脚本转换就能得到flag
import sys
fp = open('C:\\Users\\Lucky\\Desktop\\华科杯\\misc\\一闪一闪亮晶晶\\flag.starry') #flag.starry是保存的starry语言文件
data = fp.read()
fs = open('C:\\Users\\Lucky\\Desktop\\华科杯\\misc\\一闪一闪亮晶晶\\f.txt', 'w') #f.txt是输出的中间文件
sub = 0
for i in data:
if i == '\n':
continue
elif i == ' ':
sub += 1
elif i == '+':
if sub == 1:
fs.write('dup\n')
sub = 0
elif sub == 2:
fs.write('swap\n')
sub = 0
elif sub == 3:
fs.write('rotate\n')
sub = 0
elif sub == 4:
fs.write('pop\n')
sub = 0
else:
fs.write('push ' + str(sub-5) + '\n')
sub = 0
elif i == '*':
if sub == 0:
fs.write('+\n')
sub = 0
elif sub == 1:
fs.write('-\n')
sub = 0
elif sub == 2:
fs.write('*\n')
sub = 0
elif sub == 3:
fs.write('/\n')
sub = 0
elif sub == 4:
fs.write('%\n')
sub = 0
else:
print('error!!!')
sub = 0
sys.exit()
elif i == '.':
if sub == 0:
fs.write('num_out\n')
sub = 0
else:
fs.write('char_out\n')
sub = 0
else:
print('error!!!!')
sys.exit()
fp.close()
fs.close()
fp = open('C:\\Users\\Lucky\\Desktop\\华科杯\\misc\\一闪一闪亮晶晶\\f.txt', 'r')
data = []
for line in fp:
line = line.strip('\n')
if line[:4] == 'push':
data.append(int(line.split(' ')[1]))
elif line == '*':
x = data[-1]
y = data[-2]
data = data[:-2]
data.append(x * y)
elif line == '+':
x = data[-1]
y = data[-2]
data = data[:-2]
data.append(x + y)
elif line == '-':
x = data[-1]
y = data[-2]
data = data[:-2]
if (x-y)<0:
data.append(y-x)
else:
data.append(x-y)
elif line == 'dup':
x = data[-1]
data.append(x)
elif line == 'char_out':
x = data[-1]
data = data[:-1]
print(chr(x),end="")
else:
print('error!!!')
sys.exit()
flag{785c45ea-d2a1-4993-8d4f-325323d5bcd9}