[羊城杯 2024]你这主函数保真么 _wp

main函数确实没有什么内容

在这里插入图片描述

但是看函数名的时候可以发现有encrypt和rot13两种加密

还有tcf

在这里插入图片描述

_GLOBAL__sub_I_flag中,可以看到程序的执行逻辑,但是顺序是不对的,大概也猜得出来是什么样的顺序
在这里插入图片描述

首先输入并且判断长度

在这里插入图片描述
rot13加密
在这里插入图片描述

一维DCT加密
DCT加密的特点就是嵌套循环里面的内容
在这里插入图片描述
将加密结果存在in数组里面
在这里插入图片描述

in数组和check数组比较,check数组已知,可以直接cv2的IDCT(逆离散余弦变换)函数求解

import cv2
import numpy as np

enc=np.array([513.355, -37.7986, 8.7316, -10.7832, -1.3097, -20.5779,6.98641, -29.2989, 15.9422, 21.4138, 29.4754, -2.77161,
-6.58794, -4.22332, -7.20771, 8.83506, -4.38138, -19.3898,
18.3453, 6.88259, -14.7652, 14.6102, 24.7414, -11.6222,
 -9.754759999999999, 12.2424, 13.4343, -34.9307, -35.735,
 -20.0848, 39.689, 21.879, 26.8296],dtype=np.float32)

s=cv2.idct(enc).round().astype(int).flatten().tolist()
#离散余弦逆变换.四舍五入.转换为整型.将二维数组展平成一维数组.把 NumPy 数组转换为 Python 列表

for i in s:
    if (i > 64 and i <= 90) or (i > 96 and i <= 122):
        if 64<i<=90:
            i=(i -65 -13)%26+65
        elif 96<i<=122:
            i=(i -97-13)%26+97
    print(chr(i),end='')

在写脚本的过程中有一些小的问题,记录一下
1.enc是一个数组,这是一维的dct,但是idct()一般是处理二维,我直接用一维数组来使用idct是没有问题的,但是如果有报错的话可以将这个一维数组转换为二维

2.在我电脑上,OpenCV库只能借助cinda安装

dct参考:https://blog.csdn.net/Icathia7/article/details/132687445

wp参考:https://lentinel.icu/archives/yangchengbei2024-reverse-writeup

https://www.nssctf.cn/note/set/10362

posted @ 2025-02-08 16:10  zzz222666  阅读(58)  评论(0)    收藏  举报