图片隐写linux,CTF-图片隐写-PNG图片修改宽高值的py3爆破

2023-11-23 10:30

本文主要是介绍图片隐写linux,CTF-图片隐写-PNG图片修改宽高值的py3爆破,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天拿到一个png图片隐写的题。

对于这种windows下可以打开,linux下无法打开的png文件,当然是第一时间怀疑宽和高做了手脚。

爆破crc校验所需要了解到的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)

- 前四个字节代表该图片的宽

- 后四个字节代表该图片的高

- 后五个字节依次为:

Bit depth、ColorType、Compression method、Filter method、Interlace method

- (可变)剩余四字节为该png的CRC检验码,由从IDCH到IHDR的十七位字节进行crc计算得到。

0b5d14657d2e?tdsourcetag=s_pctim_aiomsg

宽和高做了手脚的位置

但我只有手头抄的别人python2.7的脚本,放在python3下运行不了(……)

在不断的调试中发现:

有数值超过了127,ascii不认

binascii在python3下不支持unicode编码,必须输入字节码,改成b''就能运行了,但没办法payload拼接在一起爆破

python3把文本和二进制分开,字节码不能拼接

用string.encode('utf-8')倒是能运行了,但是没爆破出来,仔细一看发现编码会把超过ascii范围的譬如\xf4拆成b'\xc3\xb4'

……

搜了一圈又冷静下来,觉得字节码不能拼接就不拼接嘛……走别的路径行不行?

行。

搜到bytearray()是个好东西,相比bytes字节串,bytearray是可修改的。是的我们知道在python2里可直接str拼接,但是我决定坚守在python3里(其实就是懒得装),于是开始了数组赋值的过程。

python3.6下的代码如下

import zlib

import struct

crc32key = 0xCBD6DF8A #补上0x,winhex下copy hex value。

data = bytearray(b'\x49\x48\x44\x52\x00\x00\x01\xF4\x00\x00\x01\xF1\x08\x06\x00\x00\x00') #winhex下copy grep hex。

n = 4095 #理论上0xffffffff,但考虑到屏幕实际/cpu,0x0fff就差不多了

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,height)

return None

一开始用的n是65535,感觉要花掉一生的时间,自己手动取消了()

就算这样,本来也是没有最后这行return的,我只是把65535换成了4095。跑出结果我花了58s的时间,丢给老师,他在虚拟机里只用了3s。

想要挽回自己的尊严()

想要买台新电脑()

0b5d14657d2e?tdsourcetag=s_pctim_aiomsg

心得

今天为了做这道题把png啊struct啊crc啊bytes啊甚至py2到py3的知识全都过了一遍。基础知识还是要扎实啊,或者出问题的时候再冷静点()

其实写到这里我觉得为什么不直接rb读文件再slice一下而要手动从winhex贴呢,如此的不neat。但是好困了我要睡觉……

20170727更新:一键解决png图片crc隐写的代码

import zlib

import struct

#读文件

file = CommonFile+'2.png'

fr = open(file,'rb').read()

data = bytearray(fr[12:29])

crc32key = eval(str(fr[29:33]).replace('\\x','').replace("b'",'0x').replace("'",''))

#crc32key = 0xCBD6DF8A #补上0x,copy hex value

#data = bytearray(b'\x49\x48\x44\x52\x00\x00\x01\xF4\x00\x00\x01\xF1\x08\x06\x00\x00\x00') #hex下copy grep hex

n = 4095 #理论上0xffffffff,但考虑到屏幕实际,0x0fff就差不多了

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]

#print(data)

crc32result = zlib.crc32(data)

if crc32result == crc32key:

print(width,height)

#写文件

newpic = bytearray(fr)

for x in range(4):

newpic[x+16] = width[x]

newpic[x+20] = height[x]

fw = open(file+'.png','wb')#保存副本

fw.write(newpic)

fw.close

return None

这篇关于图片隐写linux,CTF-图片隐写-PNG图片修改宽高值的py3爆破的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/417293

相关文章

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法

《ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法》本文介绍了Elasticsearch的基本概念,包括文档和字段、索引和映射,还详细描述了如何通过Docker... 目录1、ElasticSearch概念2、ElasticSearch、Kibana和IK分词器部署

Linux流媒体服务器部署流程

《Linux流媒体服务器部署流程》文章详细介绍了流媒体服务器的部署步骤,包括更新系统、安装依赖组件、编译安装Nginx和RTMP模块、配置Nginx和FFmpeg,以及测试流媒体服务器的搭建... 目录流媒体服务器部署部署安装1.更新系统2.安装依赖组件3.解压4.编译安装(添加RTMP和openssl模块

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

Python利用PIL进行图片压缩

《Python利用PIL进行图片压缩》有时在发送一些文件如PPT、Word时,由于文件中的图片太大,导致文件也太大,无法发送,所以本文为大家介绍了Python中图片压缩的方法,需要的可以参考下... 有时在发送一些文件如PPT、Word时,由于文件中的图片太大,导致文件也太大,无法发送,所有可以对文件中的图

修改若依框架Token的过期时间问题

《修改若依框架Token的过期时间问题》本文介绍了如何修改若依框架中Token的过期时间,通过修改`application.yml`文件中的配置来实现,默认单位为分钟,希望此经验对大家有所帮助,也欢迎... 目录修改若依框架Token的过期时间修改Token的过期时间关闭Token的过期时js间总结修改若依

java获取图片的大小、宽度、高度方式

《java获取图片的大小、宽度、高度方式》文章介绍了如何将File对象转换为MultipartFile对象的过程,并分享了个人经验,希望能为读者提供参考... 目China编程录Java获取图片的大小、宽度、高度File对象(该对象里面是图片)MultipartFile对象(该对象里面是图片)总结java获取图片

MySQL修改密码的四种实现方式

《MySQL修改密码的四种实现方式》文章主要介绍了如何使用命令行工具修改MySQL密码,包括使用`setpassword`命令和`mysqladmin`命令,此外,还详细描述了忘记密码时的处理方法,包... 目录mysql修改密码四种方式一、set password命令二、使用mysqladmin三、修改u

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解