图片隐写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实现查看某一端口是否开放

《Linux实现查看某一端口是否开放》文章介绍了三种检查端口6379是否开放的方法:通过lsof查看进程占用,用netstat区分TCP/UDP监听状态,以及用telnet测试远程连接可达性... 目录1、使用lsof 命令来查看端口是否开放2、使用netstat 命令来查看端口是否开放3、使用telnet

Linux系统管理与进程任务管理方式

《Linux系统管理与进程任务管理方式》本文系统讲解Linux管理核心技能,涵盖引导流程、服务控制(Systemd与GRUB2)、进程管理(前台/后台运行、工具使用)、计划任务(at/cron)及常用... 目录引言一、linux系统引导过程与服务控制1.1 系统引导的五个关键阶段1.2 GRUB2的进化优

使用Python实现无损放大图片功能

《使用Python实现无损放大图片功能》本文介绍了如何使用Python的Pillow库进行无损图片放大,区分了JPEG和PNG格式在放大过程中的特点,并给出了示例代码,JPEG格式可能受压缩影响,需先... 目录一、什么是无损放大?二、实现方法步骤1:读取图片步骤2:无损放大图片步骤3:保存图片三、示php

Linux查询服务器 IP 地址的命令详解

《Linux查询服务器IP地址的命令详解》在服务器管理和网络运维中,快速准确地获取服务器的IP地址是一项基本但至关重要的技能,下面我们来看看Linux中查询服务器IP的相关命令使用吧... 目录一、hostname 命令:简单高效的 IP 查询工具命令详解实际应用技巧注意事项二、ip 命令:新一代网络配置全

linux安装、更新、卸载anaconda实践

《linux安装、更新、卸载anaconda实践》Anaconda是基于conda的科学计算环境,集成1400+包及依赖,安装需下载脚本、接受协议、设置路径、配置环境变量,更新与卸载通过conda命令... 目录随意找一个目录下载安装脚本检查许可证协议,ENTER就可以安装完毕之后激活anaconda安装更

Linux查询服务器系统版本号的多种方法

《Linux查询服务器系统版本号的多种方法》在Linux系统管理和维护工作中,了解当前操作系统的版本信息是最基础也是最重要的操作之一,系统版本不仅关系到软件兼容性、安全更新策略,还直接影响到故障排查和... 目录一、引言:系统版本查询的重要性二、基础命令解析:cat /etc/Centos-release详

Linux grep 命令的使用指南

《Linuxgrep命令的使用指南》本文给大家介绍Linuxgrep命令的使用指南,包括基础搜索语法、实践指南,感兴趣的朋友跟随小编一起看看吧... 目录linux grep 命令全面使用指南一、基础搜索语法1. 基本文本搜索2. 多文件搜索二、常用选项详解1. 输出控制选项2. 上下文控制选项三、正则表达

Linux部署中的文件大小写问题的解决方案

《Linux部署中的文件大小写问题的解决方案》在本地开发环境(Windows/macOS)一切正常,但部署到Linux服务器后出现模块加载错误,核心原因是Linux文件系统严格区分大小写,所以本文给大... 目录问题背景解决方案配置要求问题背景在本地开发环境(Windows/MACOS)一切正常,但部署到

更改linux系统的默认Python版本方式

《更改linux系统的默认Python版本方式》通过删除原Python软链接并创建指向python3.6的新链接,可切换系统默认Python版本,需注意版本冲突、环境混乱及维护问题,建议使用pyenv... 目录更改系统的默认python版本软链接软链接的特点创建软链接的命令使用场景注意事项总结更改系统的默

Linux升级或者切换python版本实现方式

《Linux升级或者切换python版本实现方式》本文介绍在Ubuntu/Debian系统升级Python至3.11或更高版本的方法,通过查看版本列表并选择新版本进行全局修改,需注意自动与手动模式的选... 目录升级系统python版本 (适用于全局修改)对于Ubuntu/Debian系统安装后,验证Pyt