隐写
文件类型识别
当文件没有后缀名或者有后缀名而无法正常打开时,根据识别出的文件类型 来修改后缀名即可正常打开文件。
File命令
file 文件名
Winhex
通过Winhex来查看文件头部,常见文件类型的头部数据如下。
PNG文件
PNG文件头
(固定)八个字节89 50 4E 47 0D 0A 1A 0A为png的文件头
(固定)四个字节00 00 00 0D(即为十进制的13)代表数据块的长度为13
(固定)四个字节49 48 44 52(即为ASCII码的IHDR)是文件头数据块的标示(IDCH)
(可变)13位数据块(IHDR)
1)前四个字节代表该图片的宽
2)后四个字节代表该图片的高
3)后五个字节依次为:
Bit depth、ColorType、Compression method、Filter method、Interlace method
(可变)剩余四字节为该png的CRC检验码,由从IDCH到IHDR的十七位字节进行crc计算得到。
CRC爆破计算原图宽高
# png crc爆破长宽
import zlib
import struct
# with open(r'./normal_png.png', 'rb') as image_data:
with open(r'./2.png', 'rb') as image_data:
bin_data = image_data.read()
data = bytearray(bin_data[12:29]) # 读出Chunk Type Code域和Chunk Data部分
print(hex(zlib.crc32(data)))
print(zlib.crc32(data))
print("===================================")
# 计算原始CRC32值
crc32Hexstr = "0x"
for i in range(4):
rep = str(hex(bin_data[i + 29])).replace("0x", "")
if len(rep) == 1:
rep = "0" + rep
crc32Hexstr += rep
# crc32Hexstr="0x401f4a01"
crc32key = eval(crc32Hexstr) # 转十进制
print("CRC32:%s(Hex) %s(Dec)" % (crc32Hexstr, crc32key))
print("============running==================")
n = 4096 # 4k分辨率
# 爆破高和宽
for w in range(n):
width = bytearray(struct.pack('>i', w)) # q为8字节,i为4字节,h为2字节
for h in range(n):
height = bytearray(struct.pack('>i', h))
for x in range(4):
data[x + 4] = width[x]
data[x + 8] = height[x]
crc32result = zlib.crc32(data)
if crc32result == crc32key:
print("width:0x%s height:0x%s" % (bytearray(width).hex(),
bytearray(height).hex()))
exit()
Web
PHP伪协议
php://filter可以获取指定文件源码。当它与包含函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,让其不执行。从而导致任意文件读取:index.php?file=php://filter/read=convert.base64-encode/resource=index.php
文章评论