题目介绍
题目名称 | 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.7z
。flag.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~