CTF 隐写 关于zlib的解压 2018全国大学生信息安全竞赛 picture

CTF 隐写 关于zlib的解压 2018全国大学生信息安全竞赛 picture

相信大家在做隐写时 都会遇到.png图片里有.zlib
那么如果遇到这种情况怎么处理 ,我将会用2018全国信息安全竞赛 picture 这道题来给大家举例讲解

首先我们需要先认识Python的几个函数

binascii.hexlify 和 binascii.unhexlify
binascii.hexlify() 将单个字符转化成对应码值的十六进制格式(\xxx)格式
binascii.hexlify(‘hello’)
———————–>输出 ‘68656c6c6f’

binascii.unhexlify() 两个字符为单位,看作十六进制值,转化成对应码值的字符格式
binascii.unhexlify(‘68656c6c6f’)
———————–>输出 hello

encode和decode
“hello”.encode(“hex”)
———————–>输出’68656c6c6f’

‘68656c6c6f’.decode(“hex”)
———————–>输出’hello’

zlib.decompress和zlib.compress
zlib.compress(str)用于压缩流数据
zlib.decompress(str)用于解压数据。

将这个三个函数仔细看了后,我们来做题

全国大学生信息安全大赛 picture

这是一道隐写术的题 我把照片放上来
这里写图片描述

先用linux下binwalk分析图片
这里写图片描述

发现文件里有zlib格式的文件
下面我们需要进行分离,分离之前我们必须知道.jpg格式文件开头结尾 .zlib文件开头结尾 我的另一篇文章里有介绍

那么接下里 我们打开winhex 或者 setgolve 查看
这里写图片描述
这里写图片描述

两种方法都能找到zlib的位置 那么接下来我用三种方法进行解压

    1.
from zlib import *
data = open('task-ctf_06_tgF28nL.png', 'rb').read()[0x97E4:]
print data
data = decompress(data)
print data

这是解压代码,第一种是直接对图片进行偏移读取,直接读到zlib,其实正常步骤是分理出来改成.zlib查看里面是否有文件,但是我在试过后发现没有,那我就再对zlib文件进行解压查看,了解下是什么

2.

import zlib
import binascii
import base64
id='789cad50c9929b400cfd201fc080170e39a89bc5cde2610966b9d160b7d90263ec61f9fa814a662ab75ca2523d3d49af2495fc2d2808b9008b03a9869a9fe0303eb6215b72558215578805b94a1264bd09f3a088baed63df7e7a59f29162935e778faa23fd9bd2fbca14df34762d83d48bf150b8e3ed48b1a4b813a05f13c7d919a58e8146e91154859889afba3576ca6182216ab93837d450ddf0939231b57e5a7af3ae3e1ca7f76b64814b38f8d79d786dfe36f2cd504905afc60cd85701d04235712f4851ca0f277de68afe2e3f7e42469d8d399d84a78d02b5d710fba35f465f567e1a165032d09eee35f25a2a48cc2e24317279d329a50d31eff2fb49686f4baeb85d90355a9984c63d167a66eadb8f4c7459d65c96da8e27faf94ef581515d9b735ced15b765444d3aaa078c94e3708dce6d128e3d9961438a5557bf121f460ba38e1670a4a15ce5e1583b8c370906f6f7eeb0b94c94f7babca9e734945f5e644c5424fb6f4dfa9fa20f47cb47431c9de75c90a704c3c1fcfa05c08f4f15a7c2ce'
result =binascii.unhexlify(id)
print result
result = zlib.decompress(result)
print result

这是第二种用的是binascii.unhexlify()函数

3.

import zlib
import binascii

IDAT = "789cad50c9929b400cfd201fc080170e39a89bc5cde2610966b9d160b7d90263ec61f9fa814a662ab75ca2523d3d49af2495fc2d2808b9008b03a9869a9fe0303eb6215b72558215578805b94a1264bd09f3a088baed63df7e7a59f29162935e778faa23fd9bd2fbca14df34762d83d48bf150b8e3ed48b1a4b813a05f13c7d919a58e8146e91154859889afba3576ca6182216ab93837d450ddf0939231b57e5a7af3ae3e1ca7f76b64814b38f8d79d786dfe36f2cd504905afc60cd85701d04235712f4851ca0f277de68afe2e3f7e42469d8d399d84a78d02b5d710fba35f465f567e1a165032d09eee35f25a2a48cc2e24317279d329a50d31eff2fb49686f4baeb85d90355a9984c63d167a66eadb8f4c7459d65c96da8e27faf94ef581515d9b735ced15b765444d3aaa078c94e3708dce6d128e3d9961438a5557bf121f460ba38e1670a4a15ce5e1583b8c370906f6f7eeb0b94c94f7babca9e734945f5e644c5424fb6f4dfa9fa20f47cb47431c9de75c90a704c3c1fcfa05c08f4f15a7c2ce".decode( 'hex')
print IDAT
result = zlib.decompress(IDAT)
print result

这是第三种方法用的是str.decode(‘hex’)


以上三种方法输出结果是一样的

1���IhoK��]�5Z���=zf�ۏLtY�\�ڎ'��N��Q]�s\��eDM:����p��m�=�aC�UW�F��p��\��X;�7    ��L������4�_^dLT$�oM���G�GC��\��������O���
S1ADBBQAAQAAAIkwl0yA7xr1WgAAAE4AAAAEAAAAY29kZZBLO2zwD3GMSCSMtRcZvaCKbe5rkpIsODsSDyYfFgejUaRYCwiQxf8bC4DQyABny//McbbPJBx4rUki3c3uloJ5D7yAwXo/YdJEWE+0yDcgEltLGmqErPPsSlBLAQI/ABQAAQAAAIkwl0yA7xr1WgAAAE4AAAAEACQAAAAAAAAAIAAAAAAAAABjb2RlCgAgAAAAAAABABgAAF3624Xa0wHGz/ish9rTAcbP+KyH2tMBUEsFBgAAAAABAAEAVgAAAHwAAADcAFtQeXRob24gMi43XQ0KPj4+IKh9qH2ofQ0KDQpUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6DQogIEZpbGUgIjxweXNoZWxsIzA+IiwgbGluZSAxLCBpbiA8bW9kdWxlPg0KICAgIKh9qH2ofQ0KWmVyb0RpdmlzaW9uRXJyb3I6IKh9qH2ofah9qH2ofah9qH2ofah9qH2ofah9qH2ofah9qH2ofah9qH2ofah9qH2ofah9qH2ofah9qH2ofSA8LSBwYXNzd29yZCA7KQ0KPj4+IAA=

我只是想告诉大家这三种方法的作用一样,因为网上的关于这个打代码各种各样,刚开始比较难理解
大家可能说这输出的是什么玩意 也看不懂
这道题第二个输出就是我们想看到,这道题第二个输出是一个base64的字符,这个怎么看出来的我没法告诉你,大概是你看多了慢慢就明白了

网上还有一些题接出来是3031这些
这里写图片描述
像这种题就是解出来是什么样再进行什么操作,这种30313031
他又再次进行解编码 最后形成一个二维码

咱们这个是base64,那么当然再用base64解下

import zlib
import binascii
import base64
id='789cad50c9929b400cfd201fc080170e39a89bc5cde2610966b9d160b7d90263ec61f9fa814a662ab75ca2523d3d49af2495fc2d2808b9008b03a9869a9fe0303eb6215b72558215578805b94a1264bd09f3a088baed63df7e7a59f29162935e778faa23fd9bd2fbca14df34762d83d48bf150b8e3ed48b1a4b813a05f13c7d919a58e8146e91154859889afba3576ca6182216ab93837d450ddf0939231b57e5a7af3ae3e1ca7f76b64814b38f8d79d786dfe36f2cd504905afc60cd85701d04235712f4851ca0f277de68afe2e3f7e42469d8d399d84a78d02b5d710fba35f465f567e1a165032d09eee35f25a2a48cc2e24317279d329a50d31eff2fb49686f4baeb85d90355a9984c63d167a66eadb8f4c7459d65c96da8e27faf94ef581515d9b735ced15b765444d3aaa078c94e3708dce6d128e3d9961438a5557bf121f460ba38e1670a4a15ce5e1583b8c370906f6f7eeb0b94c94f7babca9e734945f5e644c5424fb6f4dfa9fa20f47cb47431c9de75c90a704c3c1fcfa05c08f4f15a7c2ce'
result =binascii.unhexlify(id)
print result
result = zlib.decompress(result)
print result
result = base64.b64decode(result)
print result
fount = open(r"55.zlib","wb")
fount.write(result)
fount.close()

解压成一个zip文件后发现解压问题
这里写图片描述
那个问题原因password已经给你了
他想说的是ZeroDivisionError对应的是什么
百度是分母为零
那么自己操作一遍

这里写图片描述
拿到password
然后既然zip打不开,那就去找原因,怀疑对文件头尾做了手脚
这里写图片描述
果然没错,更改成50 4B

可以打开了 将password输入 得到key.txt
这里写图片描述
能看出来又是一个编码 用 UUEncode 解出flag

你问我为啥是UUEncode 我也不知道,看多了就知道了吧,我也是队友告诉的

猜你喜欢

转载自blog.csdn.net/qq_40574571/article/details/80164981