这次个人赛难度真的undingable,就只能做做杂项苟着这样子,re手转行做misc警告(
拿到题目是看到有一个flag1.txt和一个加密压缩包password.7z
file一下txt文件可以看到:
是uuencode文件,所以用python跑一下解出flag.7z:
1 2 import  uuuu.decode('flag1.txt' ) 
然后password.7z的密码什么提示都没有,一度以为是从txt里找线索,后来放了hint才知道是6-8位数字,弱口令猜了一轮都没用以后果断用cRARk-7z 爆破:
1 crark-7z  -l6  -g8  -p "password.def"  .\password.7 z 
password.def里写的是:
(定义密码规则,这里是遍历纯数字,具体可以看readme
爆破出密码是321456
解开password.7z,得到flag.7z的password是7324623c。
解开能看到一张图片和一个encode.py,很容易就猜到是flag的图片经过encode.py以后得到的challenge.png,所以我们需要对着encode.py写逆算法。
简单分析一下encode.py:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 import  numpy as  npimport  cv2import  sysimport  randomdef  encode (image ):    i = random.randint(520 ,540 )     np.random.seed(i)           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])           gray = cv2.cvtColor(to_hide_array, cv2.COLOR_BGR2GRAY)      cv2.imwrite('challenge.png' , gray)      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的工作机制,大概就是对某个长度的一维数组进行位置上 的随机乱序,而对相同的随机数种子和相同长度的数组来说打乱的效果是一样的,它不关心数组的数据是啥,只关心什么位置的该被打乱到什么位置。
所以关键乱序部分的逆算法是:
1 2 3 4 5 6 7 8 9 for  i in  range (to_hide_array.shape[0 ]):         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) 
接下来就剩爆破520-540这个随机数种子了,注意random.randint的区间是前闭后闭,不要爆破少了(
exp:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 import  numpy as  npimport  cv2import  sysimport  randomdef  decode (image,x ):    np.random.seed(x)          to_hide = cv2.imread(image)     to_hide_array = np.asarray(to_hide)     for  i in  range (to_hide_array.shape[0 ]):                  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 )          for  i in  range (520 ,541 ):         decode(sys.argv[1 ],i) if  __name__ == '__main__' :    main() 
可以解出challenge540.png有:
得到flag:flag{931549887f0a1398807eb68a656180ef}