这次个人赛难度真的undingable,就只能做做杂项苟着这样子,re手转行做misc警告(
拿到题目是看到有一个flag1.txt
和一个加密压缩包password.7z
file一下txt文件可以看到:
是uuencode文件,所以用python跑一下解出flag.7z
:
import uu
uu.decode('flag1.txt')
然后password.7z
的密码什么提示都没有,一度以为是从txt里找线索,后来放了hint才知道是6-8位数字,弱口令猜了一轮都没用以后果断用cRARk-7z爆破:
crark-7z -l6 -g8 -p"password.def" .\password.7z
password.def
里写的是:
##
$1 *
(定义密码规则,这里是遍历纯数字,具体可以看readme
爆破出密码是321456
解开password.7z
,得到flag.7z
的password是7324623c
。
解开能看到一张图片和一个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
有:
得到flag:flag{931549887f0a1398807eb68a656180ef}