GKCTF_2020_misc
- 0x01 签到
- 0x02 问卷调查
- 0x03 Pokémon
- 0x04 code obfuscation
- 0x05 Harley Quinn
- 0x06 Sail a boat down the river
0x01 签到
- 比赛直播间地址:
https://live.bilibili.com/772947
- 屏幕上有flag;
0x02 问卷调查
- 填写对这次比赛的问卷调查,就可以得到flag。
flag{I_W4nt_t0_Fu4k_GKCTF}
0x03 Pokémon
- 一个
.gba
格式的文件,下载Visual Boy Advance
打开;
是一个叫口袋怪兽绿宝石
的游戏。
没办法,开始玩吧。
- 打到103街道的地方,草丛就是flag的字符,哈哈,这个还真有趣。
flag{PokEmon_14_CutE}
0x04 code obfuscation
- 下载附件如下:
手动复原
- 生成结果,扫描:
- 扫描结果为
base(gkctf)
,没有明显的信息,所以继续从题目图片提取信息,这里使用stegsolve
,发现另一个数据块,其中52 61 72 21
是rar文件的开头。
stegsolve下载地址
- 可以把文件提取,或者直接将原
png
文件后缀改为rar
,得到需要密码的一个压缩文件,将之前得到的gkctf
通过base16、base32、base64、base58
分别加密,最后base58得到:CfjxaPF
成功解压。 - 得到一段js代码:
eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('15 n 14 a b c d e f g h i j k l m n o p q r s t u v w x y z 10 11 17="n"12 15 n 14 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 10 11 17="n"12 13=0 15 n 14 a b c d e f g h i j 10 11 16="n"13=$((13+1))12 1g("1f=\' \';1e=\'"\';16=\'#\';1j=\'(\';1i=\')\';1h=\'.\';1a=\';\';19=\'<\';18=\'>\';1d=\'1c\';1b=\'{\';1k=\'}\';1t=\'0\';1u=\'1\';1s=\'2\';1r=\'3\';1n=\'4\';1m=\'5\';1l=\'6\';1q=\'7\';1p=\'8\';1o=\'9\';")',62,93,'||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||do|eval|done|num|in|for|Bn|An|Ce|Cc|Cb|Cn|_|Cl|Bm|Bk|alert|By|Bt|Bs|Cp|Dg|Df|De|Dj|Di|Dh|Dd|Dc|Da|Db'.split('|'),0,{}))
- 和一张图片:
- 对js代码进行反混淆,然后美化格式,得到如下代码:
js反混淆地址
for n in a b c d e f g h i j k l m n o p q r s t u v w x y z do eval An = "n"
done
for n in A B C D E F G H I J K L M N O P Q R S T U V W X Y Z do eval An = "n"
done num = 0
for n in a b c d e f g h i j do eval Bn = "n"
num = $((num + 1))
done alert("Bk=' ';Bm='"';Bn='#';Bs='(';Bt=')';By='.';Cb='';Cc='<';Ce='>';Cl='_';Cn='{';Cp='}';Da='0';Db='1';Dc='2';Dd='3';De='4';Df='5';Dg='6';Dh='7';Di='8';Dj='9';")
- 代码意思就是提供了一种映射关系,对于Bn,Cn,Dn已给出映射,对于An=“n”的关系。所以将上面图片中那段字符进行替换。
给出脚本:
import string
s = "$Bn$Ai$An$Ac$Al$Au$Ad$Ae$Bk$Cc$As$At$Ad$Ai$Ao$By$Ah$Ce$Ai$An$At$Bk$Am$Aa$Ai$An$Bs$Bt$Cn$Ap$Ar$Ai$An$At$Bs$Bm$Aw$Dd$Al$Ac$Da$Am$Ae$Cl$De$Ao$Cl$Dj$Ak$Ac$At$Df$Bm$Bt$Cb$Ar$Ae$At$Au$Ar$An$Bk$Da$Cb$Cp"
ll = s.split('$')
list1 = ['Bk','Bm','Bn','Bs','Bt','By','Cb','Cc','Ce','Cl','Cn','Cp',
'Da','Db','Dc','Dd','De','Df','Dg','Dh','Di','Dj']
list2 = [' ','"','#','(',')','.','','<','>','_','{','}','0','1','2','3','4','5','6','7','8','9']
list3 = []
list4 = []
s = string.ascii_lowercase
for i in s:
list3.append('A%s'%i)
list4.append(i)
#print(list3,'\n',list4)
t = ''
for i in range(0,len(ll)):
for j in range(0,len(list1)):
if ll[i]==list1[j]:
t += list2[j]
for k in range(0,len(list3)):
if ll[i]==list3[k]:
t +=list4[k]
print(t)
得到:
#include <stdio.h>int main(){print("w3lc0me_4o_9kct5")return 0}
所以:flag{w3lc0me_4o_9kct5}
;
0x05 Harley Quinn
hint:电话音&九宫格
hint: FreeFileCamouflage,下载的文件可能显示乱码
附件
- 里面是一个
jpeg
格式图片和一个wav
格式的音频。 - 对音频收听后最后有一段“拨号”的声音。使用audacity将最后的音频截出来,然后放在
dtmf2num.exe
分析,得到相应的音频信息:#222833344477773338866#
;
- 此时再看提示:
FreeFileCamouflage
,是一个图片隐藏文件的软件。
- 需要输入密码,这时,从音频得到的字符串输进去没有用,需要用到手机键盘密码;
- 得到密码为:
ctfisfun
; - 最后分离出
flag.txt
文件。 - 拿到flag:
flag{Pudd1n!!_y0u_F1nd_m3!}
0x06 Sail a boat down the river
附件为一个视频和一个压缩包
hint1: 闪烁的光芒
hint2: 是一行不是一列
hint3: 加密方式很常见
- 打开视频,其间有一桢闪出一个二维码。
- 扫描后是一个百度网盘链接,但是没有提取码。
- 借助hint1,回看发现了“闪烁的光芒”,就是视频中间那个摄像头。灯亮分为两种:1桢和3桢。想到摩尔电码,得到如下:
-.-- .-- ---.. --. ==> yw8g
- 输入提取码,成功得到文件
shudu.txt
:
- 密文:
efb851bdc71d72b9ff668bddd30fd6bd
- 数独?
- 密匙只用填写填入的数字,从左到右从上到下密钥就是
52693795149137
,尝试用ASE加密。
- 压缩包密码
GG0kc.tf
,解压出来得到一个.ovex
文件,用五线谱打谱软件Overture打开即可拿到flag:flag{gkctf_is_fun}
参考:
https://hujiekang.top/2020/05/24/GKCTF-WriteUp/
https://blog.csdn.net/hiahiachang/article/details/106317765