CTF中一些利用PS解决的杂项题(Misc)

本文作者:老锥
来源: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 选中,上下拉长即可;

image

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;

image

猜测是某种加密或者隐写;
利用binwalk,file来看下:

image

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本来就是处理图片的,什么容差,什么移位,等等都是可以直接操作的;
即使像第三题,我们也可以使用滤镜库来看看;
不能不相信,大天朝的滤镜数量是数不过来的,质量更没的说,各式各样;
做这些题挺有意思,大家都可以玩玩...image

1 Like

这篇文章其实在老论坛的时候我就看过了……自从这以后,每次杂项图片隐写题目,我都想着能不能 PS 解题 image