2018鹏城杯 Ctopia

最近几次的 pwn 感觉都是要先逆向出来逻辑然后再漏洞利用,漏洞不像以前那么明显了。。看来是时候开坑逆向了。

idea

是一个游戏,还挺好玩的。通关后得到flag,一般这种题目要不是难度设置的特别高要不就是特别费时,比赛期间肯定正常打不完。先上 ida 看看程序的逻辑。在 mainloop中可以看到每达到一定的条件后程序就会写一个 key,最终 4 个 key 后会执行解密函数。那么可以让程序跑起来后手动执行这 4 个写 key 的操作 然后调用 KEY::FINAL_DECRYPT 这个函数就可以获取 flag 。

最终效果如下

Traffic_Light

看了一下大佬们的 wp 发现我的思路有点跑偏,但是也解出来了???说一下思路,题目是一个gif,打开后加载了好久,mac 上的预览直接把每个图层都分开了,大概看了一下 1000+,先用 ImageMagick 分解出来。

1
convert ../Traffic_Light.gif +adjoin +repage %d.png

分解出来以后是 3 种灯,那么换成 3 种信号可能是莫斯电码,每隔一个图片有一个没用图层。可以先用 python 识别出来颜色然后再转换为莫斯电码的 . - / 。先删除中间的没用图层,要不识别起来效率太低。

1
2
3
4
5
6
7
8
9
#!/bin/sh
b=1
for ((i=0;i<1168;i++));
do
res=`expr $i % 2`;
if [ "$res" -eq "$b" ];then
rm $i.png
fi
done;

然后再上脚本识别转换为莫斯电码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
from PIL import Image
def getPngPix(pngPath = file):
pixelX1 = 111
pixelY1 = 52
pixelX2 = 111
pixelY2 = 100
pixelX3 = 111
pixelY3 = 148
img_src = Image.open(pngPath)
img_src = img_src.convert('RGBA')
str_strlist = img_src.load()
data1 = str_strlist[pixelX1,pixelY1]
data2 = str_strlist[pixelX2,pixelY2]
data3 = str_strlist[pixelX3,pixelY3]
img_src.close()
return data1,data2,data3
flag = ''
path = ''
#print getPngPix()
for file in range(0,1167,2):
path = str(file) + '.png'
res = getPngPix(path)
for i in res:
if i == (0, 255, 0, 255):
flag += '.'
elif i == (255, 0, 0, 255):
flag += '-'
elif i == (255, 255, 0, 255):
flag += '/'

print flag



# green 0, 255, 0, 255 .
# red 255, 0, 0, 255 -
# yellow 255, 255, 0, 255 /

解密出来的东西看去来像 16 进制的东西,解密一下看看。

文章作者: Carl Star
文章链接: http://carlstar.club/2018/12/10/pcb/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Hexo