【write up】2021春秋杯-BabySteg

题目介绍


题目名称Baby_steg
类型Misc



题目分析


题目提供了一个7z的加密压缩包password.7z 、一个txt文件flag1.txt

flag1.txt内容:

在这里插入图片描述


password.7z内容:


在这里插入图片描述



通过flag1.txt内容中flag.7z 盲猜是个7z压缩文件。



解题过程


修改后缀

flag1.txt后缀改为7z,打开之后发现…(盲猜正确)

在这里插入图片描述



那么这题至此就可以放弃了。


尝试把它丢进windows虚拟机,使用WinRAR成功打开。(这锅Mac OS背)发现存在一个加密压缩包flag.7zflag.7z内存在一张png格式图片challenge.png和一个python脚本文件encode.py

在这里插入图片描述
在这里插入图片描述

猜测password.7z里的password.txt文件存在解压flag.7z的密码。



7z压缩包密码破解

计算Hash值

使用John的脚本7z2john.pl计算出password.7z的hash值。

在这里插入图片描述

password.7z的hash值:

$7z$2$19$0$$16$abc477f84f711f5530432e64418c8392$3167568243$16$12$40a31f0f88ac7b9a9acdc6cbb7d23f23$8$00


Hashcat密码爆破

使用hashcat进行密码爆破(Mac OS的终端会对$进行转义,因此hash值处需加上\):

在这里插入图片描述



Hashcat停止运行,破解成功。打开pass.txt得到压缩包password.7z的解压密码321456

在这里插入图片描述



解压password.7z,打开password.txt,得到flag.7z的解压密码7324623c。然而现实…

在这里插入图片描述



那么这题至此又可以放弃了。



发现password.7z在MacOS上解压不出来显示密码错误,只能尝试丢到虚拟机里解压,成功解压。

在这里插入图片描述


解压flag.7z,得到图片challenge.png和加密脚本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)
    # 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])  
        
    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()


脚本分析
#选取520-540的一个随机数,并确定为随机种子。
i = random.randint(520,540)
    np.random.seed(i)
#导入图片,将图片像素转换为三维矩阵。
to_hide = cv2.imread(image)
to_hide_array = np.asarray(to_hide)
#利用shuffle函数随机扰乱每一行各列的相对顺序,实际上是伪随机。
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)



解密脚本编写

decode.py

import numpy as np
import cv2
import sys
import random

def decode(seed,image):
    np.random.seed(seed)
    to_hide = cv2.imread(image)
    to_hide_array = np.asarray(to_hide)
    temp = [list(range(to_hide_array.shape[1]))]*to_hide_array.shape[0]
    temp = np.asarray(temp)
    
    for i in range(to_hide_array.shape[0]):
        np.random.shuffle(temp[i])
    
    re = [[[0,0,0]]*to_hide_array.shape[1]]*to_hide_array.shape[0]
    re = np.asarray(re)
    
    for i in range(to_hide_array.shape[0]):
        for j in range(to_hide_array.shape[1]):
            re[i][temp[i][j]]=to_hide_array[i][j]
    
    cv2.imwrite('decode-'+str(seed)+'.png', re)


for i in range(520,541):
    decode(i,'challenge.png')
    print("decode!")



Get Flag

运行decode.py,查看生成的图片,获得flag~

在这里插入图片描述

在这里插入图片描述

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值