misc31
老套路,同misc24,算出bmp像素数再算下宽度改了即可,这里是487202/3/150,最后宽度1082,除不尽没事,应该是后面故意多加了几个字节
想了解bmp的可以看看这篇文章https://zhuanlan.zhihu.com/p/260702527
也贴一个最普通的爆破bmp宽度的脚本,爆破完得自己手动找(ˉ▽ˉ;)…
1 | import struct |
misc32
老套路,爆破png宽度,网上随便搜一堆,不讲了,贴个腊鸡脚本
1 | import struct |
misc33
同上,只是把高也改了,crc32还是正确的
1 | import struct |
misc34
IHDR块的CRC改成错误宽度的crc了,所以上面方法不适用,直接暴力爆破宽度,手动找
1 | import struct |
misc35
这题先把高度改高一点,flag在先下面,然后去爆破jpg的宽度,原理都差不多
1 | import struct |
misc36
这题也先把gif的高度拉高,记得修改不止一处,然后再去爆破宽度,当然不用脚本也行,这题给了范围,手动试试就好
1 | import struct |
misc37
在9、14、21、31、34帧里,直接stegsolve看就行
misc38
是一张apng图片,即动态的png图片,用浏览器安装个插件就可以看到动态效果了(好像有些浏览器默认支持),这里推荐用apngdisassembler直接分离每一帧,找找就好了
misc39
gif帧数间隔隐写,kali里用命令identify -format "%T " misc39.gif > misc39.txt
提取帧数,转01再七位一组转字符即可(为啥是七位就要问套神了😶)
1 | s = '37 37 36 36 36 37 37 37 37 37 36 37 36 36 37 37 36 36 37 37 36 37 37 37 36 36 37 37 37 37 36 37 36 36 36 37 37 36 37 37 37 37 37 37 37 36 37 37 37 37 37 37 37 36 37 37 36 37 37 36 37 36 37 36 37 37 36 36 37 36 36 37 37 37 36 36 36 36 37 37 36 36 36 37 36 37 37 36 36 37 36 37 37 36 36 37 37 36 37 37 36 36 37 37 36 36 37 37 37 36 36 37 36 37 37 37 36 36 37 36 37 37 36 37 36 37 37 37 36 36 37 37 36 37 37 36 36 36 37 36 36 37 37 36 37 37 37 37 37 36 36 36 37 36 37 37 36 36 37 36 37 36 37 37 36 36 37 36 36 37 37 36 37 37 36 36 37 37 37 36 36 36 37 37 36 36 37 36 36 36 37 37 37 36 36 37 36 37 37 36 37 37 36 36 37 37 36 36 37 37 37 37 36 36 36 36 37 36 37 37 37 36 36 37 37 37 36 36 37 36 37 37 37 36 36 36 37 36 37 37 36 36 36 37 37 37 37 36 36 36 36 37 36 37 37 36 36 36 36 36 37 37 36 37 36 36 36 37 37 36 37 36 37 36 37 37 37 36 36 37 37 37 37 37 37 36 37' |
misc40
原理跟上题差不多,只不过换成了apng的帧时间间隔隐写,用apngdisassembler分解的时候会带一个时间间隔的txt,所以脚本很好写,还有前面多了些干扰数据,所以从28个开始
1 | #apng时间隐写 |
misc41
愚人节专属题目,在010里面直接搜F001看高亮部分即可(不要问为什么,问就是八神师傅脑洞太大了)(直接偷个mumuzi的图)
misc42
IDAT块长度隐写,拖到tweakpng就很容易看出来,当然前面也多了些干扰数据,从99,116开始
1 | s = [99,116,102,115,104,111,119,123,48,55,56,99,98,100,48,102,57,99,56,100,51,102,50,49,53,56,101,55,48,53,50,57,102,56,57,49,51,99,54,53,125] |
misc43
CRC32隐写,一拖入tweakpng就一堆报错,每块IDAT的CRC32都是错的,使用pngdebugger提取错误的crc,再转hex转字符就好了
misc44
也是一种CRC32隐写,错误的CRC32和正确的CRC32分别代表着01,再8位一组转字符,劝大家不要拖进tweakpng,因为会有几百个弹窗。。。
至于如何提取正确和错误的CRC32,我的做法是用PCRT识别再放入txt,再写个脚本,就比较容易
PCRT命令如下
python PCRT.py -y -v -i misc44.png > 123.txt
python脚本如下
1 | f = open('123.txt') |
misc45
不会,菜鸡完全看不出来😭
问bit师傅问出来的,直接把png转bmp,再binwalk一下就出来了,具体原因的话,就是在bmp的中间0x10000的地方藏了个gzip,不binwalk很难看出来,png直接读像素啥也看出不来是因为bmp的像素是从左下角开始bgr这样读取的,所以要转换为bmp再binwalk,也是题目提示转换格式的意义所在,只能说八神师傅tql!!!
misc46
比较有意思的一个题,用gif每一帧的偏移量作为坐标来画图即可,这里gif的偏移量我是用identify命令直接获取的
identify misc46.gif > 233.txt
再写个脚本画图即可
1 | from PIL import Image |
misc47
跟上一题差不多,只不过图片格式变成了apng,apng每一帧的偏移提取稍微有点麻烦,我是自己在hex定位后写脚本提取的
1 | import struct |
misc48
脑洞题,问八神师傅才知道的
根据DQT块的提示,叫我们统计FF的数量再减1,一开始我以为是统计所有的,完全没找到思路,后来八神师傅说是统计每两个有意义块之间的FF的数量再减一,因为每两个有意义块之间插入数据好像是不太影响的,至于要减一是因为这段中的最后一个FF是下一个有意义块的开头,取前32个段即可,会发现每个段长度都不超过16,所以直接转为16进制就是flag
就是上图种紫色的FF段,取前32段的长度减一转16进制即可(不要忘记第一个),最后统计出来长度如下
0 12 11 0 7 10 13 13 9 0 9 13 0 13 6 0 10 9 2 1 0 1 10 8 11 5 12 7 2 2 3 10
1 | s = '0 12 11 0 7 10 13 13 9 0 9 13 0 13 6 0 10 9 2 1 0 1 10 8 11 5 12 7 2 2 3 10' |
misc49
脑洞题,也是问八神师傅才知道的
拖到010会发现开头有好多FFE?的块,后面还跟着一些奇怪的设备名,一开始我统计了下FFE0-FFEF块的数量,发现刚好32个,然后就没思路了,后来问了下八神师傅,原来E后面的那位就是flag,最后按照这些块的顺序把E后面那位合起来就行了,最后如下
0c618671a153f5da3948fdb2a2238e44
misc50
直接stegsolve看就有了