本文作者:老锥
来源:90WiKi
0x01
对于一些图片隐写的题,大多玩家都是利用beyond compare,Stegsolve.jar这类工具来直接操作;
我这利用ps来玩一下吧,因为这些工具利用的原理在ps都能实现,甚至你会发现,有的题ps还会更省事更简单;
本帖纯属娱乐,比较有意思。
0x02
题目: 年薪100w,快到碗里来(Misc)
地址: http://121.42.149.60/rmb100w_per_year.html
是阿里云盾校园招聘的第一题,这道题不是隐写;
过程
打开页面只有一个图片和一行字–“ 这个熊猫的颜色为什么这么奇怪? ”
首先想到是隐写,另存为本地发现并不是;
熊猫下面很像残缺的条形码,应该是让我们补全条形码的;
打开ps,我尽量描述详细:
1、选择一个合适的选择框,我这选择矩形;
2、 因为条形码是每个竖条宽细都一样,所以选择一小块复制,Ctrl+v粘贴后, Ctrl+t 选中,上下拉长即可;
3、 两边都拉完全了,这时候 Ctrl+Alt+Shift+e 将所有图层全部重叠到一个图层上;
便于接下来继续修补;
4、继续选择合适方块,拉伸;
5、 条形码出来了;
还记得原题有句话“ 这个熊猫的颜色为什么这么奇怪? ”么;
看这个熊猫看着好别扭,颜色反了;
回到ps, Ctrl+i 颜色反相,就是黑变白,白变黑;
熊猫这才看的顺眼起来…
去扫描,浏览器自动跳转到:http://121.42.149.60/1cc88340
本题完成,进入到下一题。
0x03
题目: Throw the ball to the pokemon!(Misc)
地址:misc1.txt (288.8 KB)
Tips: Throw the ball to the pokemon! 神奇宝贝
这个是AIS3 CTF的一道隐写,来自台湾;
过程
1.打开txt文件,并没有出现乱码,甚至还有点规则,每行首字母都是M;
猜测是某种加密或者隐写;
利用binwalk,file来看下:
binwalk并没有识别出来,毕竟内容很规矩;
file显示可能是 UUencode编码 ,去查了下确实是https://en.wikipedia.org/wiki/Uuencoding#Uuencode_table
特征:
文件首行begin <mode> <file><newline>;
每行64个字符;
这个编码解码网站:http://web.chacuo.net/charsetuuencode
但这毕竟这是个杂项而不是Crypto;
3.我一般在测试之前都会先把后缀改为压缩包来试试看,在kali下改为tar.gz,但失败了,也总是怀疑是密码学的题目;
拿到win下,改为rar,里面有个文件:quiz
没多想继续解压缩,还是quiz文件;
继续,出来了两张图片;
为了分析,我用binwalk也看了下:
结果可以看到,都是压缩包;
4.解压最后出现两张图片,一个精灵球,一个杰尼龟(我还认识...)
想起Tips:Throw the ball to the pokemon!
应该就是两种图片看 容差 了;
我看有用beyond compare的,还有用Stegsolve.jar的;
前者确实可以,后者可以叠加,但都是一些规定的容差,对此题没有用;
我这里还是用 PS ,尽量详细;
打开ps,两张图片叠在一起;
看到没,边框有字隐约出现了,这里谁前谁后自己判断;
5.在上面的先 大致 调整下混合模式,目的是让字体更清晰起来;
我这里测出来是 减去模式 ,这种视情况而定;
6.把每张图的 阈值 调一下,这里都归为了最小值;
这里为啥用阈值而不用去色,大家实际操作一下就很明白了;
7.可以看到,flag已经很清楚了,如果还看不清楚,可以继续调整:
调节曲线;
单通道输出:
加深工具加深;
调节对比度;
.....
方法很多,也是具体情况具体来操作;
0x04
题目: 秦晋之好(Misc)
地址: 是个bmp文件(下图即为原图,想玩直接右键另存为即可);
瞎胡看看到了ISCC CTF 2014 的Writeup,有道隐写题很有意思,查了一下网上的writeup,通通都来自一人的python程序;
我用ps来实现一番吧;
tips: 无,只有这一张图片;
丢到ps中并没有发现什么,看他们wp说放大后可以看到有一些字符,我拉大了仍然不清楚,只是存在有几个零零散散的大块像素点;
先放上网上统一的Writeup吧:
http://joychou.org/index.php/Misc/iscc-ctf-2014-writeup.html
#coding:utf-8
import Image
img = Image.open('ifs.bmp')
X = img.size[0]
Y = img.size[1]
print X,Y
for i in range(X-2):
for j in range(Y-2):
a = img.getpixel((i,j))[0]+img.getpixel((i,j))[1]+img.getpixel((i,j))[2]
b = img.getpixel((i,j+1))[0]+img.getpixel((i,j+1))[1]+img.getpixel((i,j+1))[2]
c = img.getpixel((i,j+2))[0]+img.getpixel((i,j+2))[1]+img.getpixel((i,j+2))[2]
if (a > b and c > b) or (a < b and c < b):
pass
else:
img.putpixel((i,j),(255,255,255))
img.show()
关键就是getpixel()函数,获取像素位置的值;
putpixel()函数,写某个像素位置的值;
大致意思就是取纵坐标连着三个像素点,中间一点像素值不能同时大于或同时小于旁边两个像素点的值;
类似于浮雕,壁画一类的效果了( 减弱三点的差值 )
过程
1.打开ps,滤镜-滤镜库,使用壁画效果:
参数如下(实际参数自己把握)
可见已经可以看到部分字体了;
返回主页面;
2.由于都是黑乎乎的,对比度很低;
使用 加深工具 现将看清楚的字符加深,然后 调节曲线 将颜色压深;
3.现在看来就是头发有问题,影响了第三第四排的第二个字符;
我们来使用 减弱工具 ,将黑色压低;
这里效果不是很好,但实际做题不影响;
4.可以看到隐约的2,但第四排仍然看不到,不搞了,实战的时候肯定能猜出来;
附上对比图:
这个题用那些ctf工具是实现不了的,只能编程,可见大牛的编程功底就是牛,但ps对于这个更方便;
0x05
对于一些图片隐写,我们使用工具很方便,但有些是工具完成不了的,例如第三个;
由于ps本来就是处理图片的,什么容差,什么移位,等等都是可以直接操作的;
即使像第三题,我们也可以使用滤镜库来看看;
不能不相信,大天朝的滤镜数量是数不过来的,质量更没的说,各式各样;
做这些题挺有意思,大家都可以玩玩...