misc题解

一、png文件。

一、直接在文件末尾。

直接十六进制编辑器查看。以MoeCTF的某道题为例。

 

 这是png文件的文件头。

 然后直接拉到文件尾部。flag白给。

二、修改图片尺寸型。

题目来自于MoeCTF的Misc。

题目就给了一张图片:(下面是截图,不是原图)

首先需要了解png文件的十六进制描述。一个png文件的组成如下。

一般开头都是:89 50 4E 47 0D 0A 1A 0A(十六进制)或者137 80 78 71 13 10 26 10(十进制)

扫描二维码关注公众号,回复: 13292752 查看本文章

然后重点关注后面众多数据块中IHDR数据块。IHDR的前四个字节是图像宽度。紧跟着的四个字节是高度。

 

 现在需要我们爆破找到正确的高度,爆破代码贴在下面。

# 爆破高
import binascii
import struct
#    记得修改文件路径
misc = open("C:\\Users\\DELL\\Desktop\\COMP\\white_album.png","rb").read()
#print(misc[0x0c:0x0f+1])
crc32_bytes = misc[0x1d:0x20+1]# 读出bytes
crc32_hex_eval = eval('0x' + crc32_bytes.hex())#bytes串 -> hex串  ->  值
print(crc32_hex_eval)
for i in range(4096):
    data = misc[0x0c:0x0f+1] + misc[0x10:0x13+1] + struct.pack('>i',i)+ misc[0x18:0x1c+1]  #IHDR数据
    crc32 = binascii.crc32(data) & 0xffffffff
    if crc32 == crc32_hex_eval : #IHDR块的crc32值
        print(i)
        print("height_hex:"+ hex(i))

 修改好的如下图。然后保存,查看图片。看样子是个PDF417码。 (由于得保密,加了点马赛克) 

 

这推荐一个在线识别网站: (CTF这块的工具很多,全部下载的话怕电脑存储不够,看着也乱,因此能在线解决的就在线解决)Barcode Reader. Free Online Web ApplicationRead Code39, Code128, PDF417, DataMatrix, QR, and other barcodes from TIF, PDF and other image documentshttps://online-barcode-reader.inliteresearch.com/

 然后就可以看到flag,这个比较友好,直接给的明文flag,有的可能还得我们转一下码才可以。

三、文件转换型。 

题目来自于XCTF的图片隐写pdf,由题意得他是图片隐写,但是他的图片是嵌入在pdf文档中的,我们要做的就是把图片从pdf中分离出来,不然没办法对图片进行处理。 

直接把pdf文档拉到010Editor会显示一堆乱码,而且末尾也不含flag,所以我们得将pdf转换成word。

在线转换网站:http://app.xunjiepdf.com/pdf2word

直接把转换后的word图片删除便可看到flag在下面。 

四、base编码系小汇总

总的来讲:base后面的数字就是他选用的可打印字符数量,比如base16编码后的字符串就是由16个不同的字符组成的字符串。

base16:编码后只含有数字0-9和大写字母A-F,共16个可打印字符。

base32:编码后只含有数字2-7和字母A-Z,共26+6=32个可打印字符。但是会含有=这个填充字符,为什么会有填充字符,下面会专门拿出来讲。

base64:编码后只含有A-Z,a-z和数字0-9,共26+26+10=62个可打印字符,另外两个字符在不同的操作系统中有不同的表示,而且这个在末尾也可能会有填充字符=。

base58:其实是base64的孪生兄弟,他不使用0和o字母大写"I",和字母小写"l",以及+和/符号,因为这些容易混淆。也是6位一分割。

base62:和base64相比只含有A-Z,a-z,数字0-9,共62个可打印字符。

base36:它的编码中包含0~9的数字,加上所有26个字母,不区分大小写,不包含任何标点,所有的字母要不全大写,要不全小写。所以加起来就是 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",

base92/91:含有92个可打印字符,是最全的字符集,他的一个标志就是基本上含有所有的符号,究竟是91还是92两个都试试就行。

为什么会有填充字符=的存在? 

    原因就是字节流的切断方式,base16是四位(因为四位二进制数正好表示0-15)一切断,base32是位一切断,base64是六位一切断。因此如下图所示,当我们用base64为他编码时,后面总会有几位是补位为0的,这时虽然他的真值是0,我们不能将他映射成0对应的字符,而是直接补上=。

未完待续 

猜你喜欢

转载自blog.csdn.net/hacker_zrq/article/details/120256502