题目介绍
| 题目名称 | 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上解压不出来显示密码错误,只能尝试丢到虚拟机里解压,成功解压。<!--不是很明白为什么MacOS无法解压-->
解压flag.7z,得到图片challenge.png和加密脚本encode.py。
图片恢复
encode.py:
importnumpyasnp
importcv2
importsys
importrandom
defencode(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)
foriinrange(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!")
defmain():
iflen(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函数随机扰乱每一行各列的相对顺序,实际上是伪随机。
foriinrange(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:
importnumpyasnp
importcv2
importsys
importrandom
defdecode(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)
foriinrange(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)
foriinrange(to_hide_array.shape[0]):
forjinrange(to_hide_array.shape[1]):
re[i][temp[i][j]]=to_hide_array[i][j]
cv2.imwrite('decode-'+str(seed)+'.png', re)
foriinrange(520,541):
decode(i,'challenge.png')
print("decode!")
Get Flag
运行decode.py,查看生成的图片,获得flag~












