[Misc]2022DASCTF Apr X FATE 防疫挑战赛 wp
1. 熟悉的猫
解压得到两个文件
flag.zip 需解压密码 先放着
kdbx 文件用 keepass 读 也是要密码
len5 猜测是爆破 crunch 生成 5 位字典
hashcat 爆破 // 也有用 passware 的 有兴趣可以自行尝试
ps: 这里还蛮有意思的 刚开始用虚拟机跑 报错硬件问题跑不了 拿到真实机跑了一小会 风扇蹭蹭转还挺爽
跑出密码 13152
里面的内容是jbRw5PB2kFmor6IeYYil
,用该密码解压压缩包。得到一个 hint 和一张图片
ps: 图像加密要了老命 当时不清楚具体是什么加密方式 到这里就干不下去了
根据图片特征和题目,猜测为猫脸变换,这里只给了一串数字根据积累能联想到可能有两种解密的方式。
均尝试后发现没有反应或者报错,因此我想用脚本解。发现出题人塞了个零宽进去
这里给了一个 22*160,试了下发现不是猫脸的参数,因此尝试去解 k,用 tupper 自指发现貌似有点规律
搜个脚本 改下参数
def Tuppers_Self_Referential_Formula():
k = 92898203278702907929705938676672021500394791427205757369123489204565300324859717082409892641951206664564991991489354661871425872649524078000948199832659815275909285198829276929014694628110159824930931595166203271443269827449505707655085842563682060910813942504507936625555735585913273575050118552353192682955310220323463465408645422334101446471078933149287336241772448338428740302833855616421538520769267636119285948674549756604384946996184385407505456168240123319785800909933214695711828013483981731933773017336944656397583872267126767778549745087854794302808950100966582558761224454242018467578959766617176016660101690140279961968740323327369347164623746391335756442566959352876706364265509834319910419399748338894746638758652286771979896573695823608678008814861640308571256880794312652055957150464513950305355055495262375870102898500643010471425931450046440860841589302890250456138060738689526283389256801969190204127358098408264204643882520969704221896973544620102494391269663693407573658064279947688509910028257209987991480259150865283245150325813888942058
# 这里替换为你自己的K值
def f(x, y):
d = ((-22 * x) - (y % 22))
e = reduce(lambda x, y: x * y, [2 for x in range(-d)]) if d else 1
g = ((y // 22) // e) % 2
return 0.5 < g
for y in range(k + 21, k - 1, -1):
line = ""
for x in range(0, 160):
if f(x, y):
line += " ■"
else:
line += " "
print(line)
if __name__ == '__main__':
Tuppers_Self_Referential_Formula()
跑出 121 144 两个参数
然后再用猫脸脚本去解,改下参数
import cv2
import numpy as np
def arnold_decode(image, shuffle_times, a, b):
""" decode for rgb image that encoded by Arnold
Args:
image: rgb image encoded by Arnold
shuffle_times: how many times to shuffle
Returns:
decode image
"""
# 1:创建新图像
decode_image = np.zeros(shape=image.shape,dtype=int)
# 2:计算N
h, w = image.shape[0], image.shape[1]
N = h # 或N=w
# 3:遍历像素坐标变换
for time in range(shuffle_times):
for ori_x in range(h):
for ori_y in range(w):
# 按照公式坐标变换
new_x = ((a * b + 1) * ori_x + (-b) * ori_y) % N
new_y = ((-a) * ori_x + ori_y) % N
decode_image[new_x, new_y, :] = image[ori_x, ori_y, :]
return decode_image
img = cv2.imread("flag.png") #变换的图片
a = 121
b = 144
st = 1
pic = arnold_decode(img,st,a,b)
cv2.imwrite('flag2.png',pic) #保存得到的图片
得到 flag 图片
DASCTF{751476c0-6cff-497f-9541-83ede0ebc5a0}
反思:
**1. 题名熟悉的猫 -> 猫脸置换 **
2. 积累 -> tupper 自指 零宽隐写 新工具使用
2.SimpleFlow
开局一个流量包
ctrl+f:flag 碰碰运气 查到有 flag.txt 和 flag.zip 两个文件
包进 foremost 提取出 flag.zip 解压需密码
回到 flag.txt 的 tcp 流 -> 追踪 tcp 流
拿到密码 压缩包里拿到 flag
3. 冰墩墩
十万个文件 随便打开几个看看
里面发现 start.txt 应该是从这里开始
发现前部分得数据是15
位,左边补零转 16 进制得0x504B
,能想到是压缩包,写了个脚本逐个读取文件,将数据拼接并写入文件。用到 zfill
zfill 的功能
- 为字符串定义长度,如不满足,缺少的部分用 0 填补
zfill 的用法
- 用法:
newstr = string.zfill(width)
- 参数:
width
新字符串希望的宽度
zfill 的注意事项
- 与字符串的字符无关
- 如果定义长度小等于当前字符串长度,则不发生变化
import re
path = 'D:\\BinDunDun\\'
regex_next = "is (.*?\\.txt)"
regex_data = "(.*?) =>"
next_file = 'start.txt'
final_data = ''
while True:
context = open(path + next_file).read()
try:
file_data = re.findall(regex_data, context)[0]
data = file_data.zfill(16)
final_data += data
except Exception as e:
print(context)
print('no data!')
try:
next_file = re.findall(regex_next, context)[0]
if next_file == 'end.txt':
break
except Exception as e:
print(context)
print('no next!!')
break
print(final_data)
with open(path+'final.zip','wb') as fp:
fp.write(int(final_data,2).to_bytes(len(final_data),'big'))
fp.close()
跑完得到压缩包
WINHEX 看一下
改 FFD8FF 拿到 jpg 是个冰墩墩
** 用剑龙逆一下 pyc 文件 **
python .\stegosaurus.py -x .\BinDunDun.pyc
得到BingD@nD@n_in_BeiJing_Winter_Olympics
** 用 jphs05 解出 **REFTQ1RGe0dvb2RfSm9kX0dpdmVfVGhlX0ZGRkZMQGdfVG9fWW91IX0
base64 解码得到 flag