很久没更新了,蛮更一下。
附件打开两个文件
kdbx文件的话,是一种windows 的密码文件,可以用KeePass软件开。
但是打开有密码,可以用passwordk kit 直接进行爆破。文件名为len5,所以选的是5位数字,得到密码13152
然后进去里面获取压缩包密码
打开压缩包,发现里面存在一个图片和一个hint
hint有一个k,猜测可能是tupper解密。
同时,这个文件存在着零宽,利用网站得到了hint:22*160
网上直接找脚本进行修改,改一下k还有默认参数,得到了两个参数121和144.
from functools import reduce
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 + 16, 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()
通过这个得到了猫脸变换的a,b值,直接带入脚本(HGAME2022也有一题类似的题,脚本可以直接用)
import matplotlib.pyplot as plt
import cv2
import numpy as np
from PIL import Image
it = cv2.imread('flag.png')
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)
# 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, :]
cv2.imwrite('flag.png', decode_image, [int(cv2.IMWRITE_PNG_COMPRESSION), 0])
return decode_image
arnold_decode(it, 1, 121, 144)
最后得到图像