【wp】2021春秋杯-BabySteg

这次个人赛难度真的undingable,就只能做做杂项苟着这样子,re手转行做misc警告(

拿到题目是看到有一个flag1.txt和一个加密压缩包password.7z

image-20210530112533087

file一下txt文件可以看到:

image-20210529173411746

是uuencode文件,所以用python跑一下解出flag.7z

import uu uu.decode('flag1.txt')

image-20210530113906002

然后password.7z的密码什么提示都没有,一度以为是从txt里找线索,后来放了hint才知道是6-8位数字,弱口令猜了一轮都没用以后果断用cRARk-7z爆破:

crark-7z -l6 -g8 -p"password.def" .\password.7z

password.def里写的是:

## $1 *

(定义密码规则,这里是遍历纯数字,具体可以看readme

爆破出密码是321456

image-20210530114325506

解开password.7z,得到flag.7z的password是7324623c

image-20210530114623211

解开能看到一张图片和一个encode.py,很容易就猜到是flag的图片经过encode.py以后得到的challenge.png,所以我们需要对着encode.py写逆算法。

简单分析一下encode.py

# encode.py import numpy as np import cv2 import sys import random def encode(image): i = random.randint(520,540) np.random.seed(i) #用一个520-540的种子初始化随机函数,注意random.randint的区间是前闭后闭 # image = 1298 * 695 to_hide = cv2.imread(image) to_hide_array = np.asarray(to_hide) #把flag图片读进成ndarray for i in range(to_hide_array.shape[0]): np.random.shuffle(to_hide_array[i]) #对ndarray进行乱序 gray = cv2.cvtColor(to_hide_array, cv2.COLOR_BGR2GRAY) #生成灰度图片 cv2.imwrite('challenge.png', gray) #写入challenge.png中 print("encode!") def main(): if len(sys.argv) != 2: print('error!') exit(1) encode(sys.argv[1]) if __name__ == '__main__': main()

逻辑很清晰,就是用了一个乱序对flag图片进行了处理。

这里涉及到np.random.shuffle的工作机制,大概就是对某个长度的一维数组进行位置上的随机乱序,而对相同的随机数种子和相同长度的数组来说打乱的效果是一样的,它不关心数组的数据是啥,只关心什么位置的该被打乱到什么位置。

所以关键乱序部分的逆算法是:

for i in range(to_hide_array.shape[0]): # np.random.shuffle(to_hide_array[i]) length=to_hide_array.shape[1] l=[ll for ll in range(length)] #构造一个跟to_hide_array[i]相同长度的数组l tmps=[-1 for _ in range(length)] #临时数组,用来填还原的结果 np.random.shuffle(l) #对l进行乱序处理 for j in range(length): tmps[l[j]]=to_hide_array[i][j] #乱序前在j位置的数在乱序后会被转到l[j],所以根据l[j]->j来还原顺序 to_hide_array[i]=np.asarray(tmps)

接下来就剩爆破520-540这个随机数种子了,注意random.randint的区间是前闭后闭,不要爆破少了(

exp:

import numpy as np import cv2 import sys import random def decode(image,x): np.random.seed(x) # image = 1298 * 695 to_hide = cv2.imread(image) to_hide_array = np.asarray(to_hide) for i in range(to_hide_array.shape[0]): # np.random.shuffle(to_hide_array[i]) length=to_hide_array.shape[1] l=[ll for ll in range(length)] tmps=[-1 for _ in range(length)] np.random.shuffle(l) for j in range(length): tmps[l[j]]=to_hide_array[i][j] to_hide_array[i]=np.asarray(tmps) gray = cv2.cvtColor(to_hide_array, cv2.COLOR_BGR2GRAY) cv2.imwrite('challenge'+str(x)+'.png', gray) print('challenge'+str(x)+'.png',"decode!") def main(): if len(sys.argv) != 2: print('error!') exit(1) # decode(sys.argv[1],520) for i in range(520,541): decode(sys.argv[1],i) if __name__ == '__main__': main()

可以解出challenge540.png有:

challenge540

得到flag:flag{931549887f0a1398807eb68a656180ef}


__EOF__

本文作者c10udlnk
本文链接https://www.cnblogs.com/c10udlnk/p/14827644.html
关于博主:欢迎关注我的个人博客-> https://c10udlnk.top/
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   c10udlnk  阅读(578)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
点击右上角即可分享
微信分享提示