Inf0 - 杭电ctf
https://dirtycow.cn/tag/%E6%9D%AD%E7%94%B5ctf/
-
第七届浙江省大学生网络与信息安全竞赛决赛reverse-wp
https://dirtycow.cn/269.html
2024-11-09T17:51:00+08:00
Reverse1思路:64位elfimage-20241110155524669.pngida分析image-20241110160145828.png分析这几个函数init函数初始化了一个table,一看就是rc4加密image-20241110160217367.png继续看crypt1 和 crypt2, 是魔改的rc4image-20241110160408630.pngbefore_main函数加密key,秘钥是keykeyimage-20241110162211876.pngafter_main函数使用加密之后的key作为秘钥加密了flagimage-20241110162622396.pngexp:def crypt1(s,key, key_len):
v5 = 0
v6 = 0
res = []
for i in range(key_len):
v5 = (v5 + 1) % 256
v6 = (v6 + s[v5]) % 256
v4 = s[v5]
s[v5] = s[v6]
s[v6] = v4
res.append(key[i] ^ (s[(s[v5] + s[v6]) %256]))
return res
def crypt2(s,enc,enc_len):
v5 = 0
v6 = 0
res = []
for i in range(enc_len):
v5 = (v5 + 1) % 256
v6 = (v6 + s[v5]) % 256
v4 = s[v5]
s[v5] = s[v6]
s[v6] = v4
res.append(enc[i] + s[(s[v5] + s[v6])%256])
return res
def init(s,key,key_len):
v8 = [0]*258
for i in range(256):
s[i] = i
v8[i] = key[i % key_len]
v6 =0
for j in range(256):
v6 = (v8[j] + v6 + s[j]) % 256
v4 = s[j]
s[j] = s[v6]
s[v6] = v4
s = [0]*256
key1 = [ord(b) for b in "keykey"]
key = [ord(b) for b in "ban_debug!"]
init(s,key1,len(key1))
res = crypt1(s,key,len(key))
print(res)
s2 = [0]*256
key2 = init(s2, res,len(res))
enc = [0x4E, 0x47, 0x38, 0x47, 0x62, 0x0A, 0x79, 0x6A, 0x03, 0x66,
0xC0, 0x69, 0x8D, 0x1C, 0x84, 0x0F, 0x54, 0x4A, 0x3B, 0x08,
0xE3, 0x30, 0x4F, 0xB9, 0x6C, 0xAB, 0x36, 0x24, 0x52, 0x81,
0xCF]
flag = crypt2(s2,enc,len(enc))
for i in flag:
print(chr(i%256),end="")
'''
运行结果
[105, 13, 90, 178, 64, 234, 25, 63, 47, 106]
flag{1237-12938-9372-1923-4u92}
'''
reverse2思路:有upx, 十六进制查看upx特征是否被修改image-20241110164828280.png将这三个ABC改回成UPX就能脱壳image-20241110164949354.pngida分析代码main函数中看到一个密文image-20241110165204829.png往下看 很明显的base64加密,查看a9876543210zyxw数组image-20241110165249211.png是base64换表image-20241110165347969.pngexp:赛博厨子直接一把梭image-20241110165557240.png