0x00 前言
上周参加了第二届BJD CTF,本Web dog太垃圾,就做出两道Web。不过还好MISC和Crypto做的还行。那就先总结复现一下。标*
表示未作出的
0x01 MISC
这个做的还行,不过有三道未做出(其中一道是mikutap。听,然后找按键盘进行对应,这个就算了,不想做),好了开始复现
最简单的misc-y1ng
就是简单的文件头填充。
看到IHDR,很明显想到png图片。添加文件头89504E47,改后缀,得到16进制
16进制转字符串即可得到flag
A_Beautiful_Picture
改图片高度即可
EasyBaBa
这个就比较有趣了,直接用winrar打开得到里面都是出题人.jpg
,进行格式分析发现是avi视频文件,改后缀播放,发现有东西,扔到Pr逐帧分析得到四张二维码。扫描得到4串十六进制
6167696E5F6C
6F76655F59
424A447B696D
316E677D
Hex->ASCII排序即可。
小姐姐-y1ng
winhex搜索BJD即可
*Real_EasyBaBa
这个当时没做出来。看了官方wp发现最后一步去除所有0没有想到。。。。
png文件用winhex打开,搜索504B,将FFFF改为0304(可以先用binwalk分析下发现有zip,因为之前我做过类似的,所以就直接改),直接winrar打开
解压hint文件。打开是二维码,扫描得到命令od -vtx1 ./draw.png | head -56 | tail -28
linux之od命令
然后执行od -vtx1 ./ezbb_r.png | head -56 | tail -28
这个命令,得到
然后就是我没想到的地方:把00字节去掉,得到图案即是flag
*圣火昭昭
这个找新佛语解密网站找了好久,以前都是佛语。。。。
下载图片查看属性,得到新佛曰:
,以前要么没有这仨字,要么是佛曰:
。
所以找到新佛语解密网站,解密得到(hint说key去掉com,key应该就是gemlove)
试了下不是flag,应该是某种隐写的密码。然后没思路了,于是看看题目描述和群里管理员“猜”
发现“猜“这个字很魔性。然后我没见过类似的隐写,然后就断这里了。。
看了一眼官方wp发现是outguess 隐写
,没听说过。查了下,发现直接用一个工具即可。
outguess的安装:
git clone https://github.com/crorvick/outguess 进行下载
下载完成后进入outguess文件夹,右击打开终端,执行命令:
./configure && make && make install 进行编译及安装。
outguess的常见使用:
对图片信息进行破解:
outguess -r /root/qwzf.jpg hidden.txt
带key的:
加密:outguess -k "abcd" -d hidden.txt demo.jpg out.jpg
解密:outguess -k "abcd" -r out.jpg hidden.txt
好了,我直接执行
执行成功,打开qwzf.txt得到flag
*TARGZ-y1ng
.tar.gz
文件直接用winrar解压发现需要输入密码,并不是伪加密,也爆破不出来。于是看看题目描述
tar zxvf
,即tar -zxvf 压缩文件名
。还好linux学过,是.gz
格式的解压缩并解打包。
试下linux解压缩并并解打包命令,然后发现依旧需要密码。密码在哪呢?
试试文件名。果然是解压密码。一直解一直解。好吧,我自闭了,不做了。
看官方wp写个脚本挺省事。但官方脚本有时候会报错(有关系统操作的脚本我还没学过怎么写,抽时间补下相关知识,然后再改下)。
decompress.py
import os
import filetype
import time
while 1:
aa = os.popen('ls')
filename = aa.read().replace('decompress.py','').replace('\n', '')
a = filename.replace('.tar.gz', '')
kind = filetype.guess(filename)
if kind.extension is 'zip':
os.system("mv {} {}.zip|unzip -P {} {}.zip".format(filename, a, a, a))
os.system("rm *.zip")
time.sleep(0.1)
else:
print('解压完成')
break
执行脚本,得到flag文件。
0x02 Crypto
*老文盲了
主要就是生僻汉字拼音,找个在线汉字转拼音即可
然后发现拼音再转换成汉字是BJD{这就是flag直接交了吧}
,我交,不对。。。问了下群管理员,让我考虑下"这”还可能是什么?
emmmm,试了好多不对。。
看官方wp说花括号{}
里的汉字再与之前的生僻字对应,也就是BJD{淛匶襫黼瀬鎶軄鶛驕鳓哵}
确定这是Crypto,感受到一丝MISC的味道。。
cat_flag
这个呢,就比较简单了。每行8张小图片,有吃的
、无吃的
。很明显可能就是二进制嘛,8bit一个字节,刚刚好。手工转换下,得到
01000010010010100100010001111011010011010010000101100001001100000111111001111101
然后二进制转ASCII,得到flag。还是感觉这道题也有MISC的感觉。
灵能精通
说实话,没见过,感觉是猪圈变种,但是搜不到。经别人提醒,知道是圣堂武士密码
对照着解密就ok了。。emmmmm,突然发现上边这解密图上的水印似乎是我的某位学长??!!!
于是好奇的搜了下,发现一篇总结很全面的好文章:
CTF中Crypty(密码类)入门必看
燕言燕语
题目:
79616E7A69205A4A517B78696C7A765F6971737375686F635F73757A6A677D20
hex->ascii
yanzi应该是密钥,后边的是密文。于是开始尝试,由于最近刚看过维吉尼亚密码,所以尝试。果然是维吉尼亚密码加密,解密即可。
维吉尼亚密码加解密原理及其实现
*Y1nglish-y1ng
Nkbaslk ds sef aslckdqdqst. Sef aslckdqdqst qo lzqtbw usf ufkoplkt zth oscpslsfko. Dpkfk zfk uqjk dwcko su dscqao qt dpqo aslckdqdqst, kzap su npqap qo jkfw mzoqa. Qu wse zfk qtdkfkodkh qt tkdnsfw okaefqdw, nkbaslk ds czfdqaqczdk. Bkd lk dkbb wse z odsfw.
Q nzo pzjqtv hqttkf zd z fkodzefztd npkt Pzffw Odkkbk azlk qt, pk qo z Izcztkok ufsl Izczt med tsn pk qo tsd bqjqtv qt Izczt, lzwmk Pzffw qot'd z Izcztkok tzlk med pk qo fkzbbw z Izcztkok. Pzffw nsfwkh qt z bznwkf'o suuqak wkzfo zvs, med pk qo tsn nsfwqtv zd z mztw. Pk vkdo z vssh ozbzfw, med pk zbnzwo msffsno lstkw ufsl pqo ufqktho zth tkjkf czwo qd mzaw. Pzffw ozn lk zth azlk zthozdzd dpk ozlk dzmbk. Pk pzo tkjkf msffsnkh lstkw ufsl lk. Npqbk pk nzo kzdqtv, Q zowkh pql ds bkth lk &2. Ds lw oefcfqok, pk vzjk lk dpk lstkw qllkhqzdkbw. 'Q pzjk tkjkf msfffsnkh ztw lstkw ufsl wse,' Pzffw ozqh,'os tsn wse azt czw usf lw hqttkf!' Tsn q nqbb vqjk wse npzd wse nztd.
MIH{cwdp0t_Mfed3_u0fa3_sF_geqcgeqc_ZQ_Af4aw}
最近大致看了单表替换密码,然后尝试一下,发现不对,emmmm。。。
题目说是英语改过来的,然后就断了。现在看了眼wp:
直接找个在线的 cryptogram solver 即可解密,比如quipqiup
最后一单词是错误的,hint 也告知有个地方需要自己修正。 可以看上面那段话也可以发现 worying at a bany,应该是 working at a bank,还有 networy,很明显应该是 network,y 要改成 k;直接读也发现 cracy 这个单词不对劲,应该和暴力破解是同类型的词,所以改成 Cr4ck
rsa0
这个和下一个RSA题确实不难,比较基础。然而我自己写的脚本没一点问题,但就是跑不出来flag。。。
e=14136631
p+q=20394044353540319344698711597000763057241436261142332048783203085936171963637690670301311997609844966417898713277046255478343038988123359477656058456834000
p-q=5522449249920590241682007593262770686168725602600804308006991053304611393109338497750661863149475602135542274713290715541748813086358892129600142665008034
c=57564160274404219264177459450448019183275693200768416051436640755522202963653292172391840912536831571152913328785130833906878324669454383965866712212130750436153700289781965212722910455077455251018758850662752081666673050509850478470173282957056988779851401898604824247631281201497321682899672172658697366350
flag=??????
今天又试了下发现把除号/
改为//
就行了。。。吐血了。。。
我写的脚本如下:
import gmpy2
#import binascii
from Crypto.Util import number
x = 20394044353540319344698711597000763057241436261142332048783203085936171963637690670301311997609844966417898713277046255478343038988123359477656058456834000
y = 5522449249920590241682007593262770686168725602600804308006991053304611393109338497750661863149475602135542274713290715541748813086358892129600142665008034
c = 57564160274404219264177459450448019183275693200768416051436640755522202963653292172391840912536831571152913328785130833906878324669454383965866712212130750436153700289781965212722910455077455251018758850662752081666673050509850478470173282957056988779851401898604824247631281201497321682899672172658697366350
p=(x+y)//2
q=(x-y)//2
e=14136631
n=p*q
phi_n = (p-1)*(q-1)
d = gmpy2.invert(e,phi_n)
m = pow(c, d, n)
print(m)
print(number.long_to_bytes(m))
#print(binascii.a2b_hex(hex(m)[2:]).decode("utf8"))
rsa1
已知p^2+q^2
和p-q
,联立方程组可解出p,q
测试发现每访问一次,e和c都会变,但是p^2+q^2
和p-q
不变,于是考虑共模攻击:
import binascii
from gmpy2 import invert
def egcd(a, b):
if a == 0:
return (b, 0, 1)
else:
g, y, x = egcd(b % a, a)
return (g, x - (b // a) * y, y)
c1 = 51340645986680648867413444434228304851992739277782547454342697741865877392900511274202106134898112876825772319229557002425095759674232201185218757524610933637451782604059178975836061950941713112330334086056402131414410255457797205808339596344991620684466195920786350418186691414221753199930658493206062216077
e1 = 13718357
c2 = 34673873418492679189315841898257302722111171466584326793277718057977399831177294654520064866789128963244103911480691778143395640764793556758948086326518018815868320324938115520510369322851130777577637015710892435333961186906032753770892938649842321721053439688427769081850637260323730777408718564295395146991
e2 = 13103833
A = 120799346838375010895229335442462202865240248511497399986136417952902545991062894320724425829562051895373363854631133655790120865759504895601823054884863801257685969042479894585894024020955762745984438766369627115385495533880991887182178078779931382196022613790869270179113382812710158113446233023928865487250
B = -1733107409224230289530192248905424424390530237061955853090172443573881253991888010586951250583196318203113989146388752129146692980400782011939285226398736
n = (A-B**2)//2
s = egcd(e1, e2)
s1 = s[1]
s2 = s[2]
if s1<0:
s1 = - s1
c1 = invert(c1, n)
elif s2<0:
s2 = - s2
c2 = invert(c2, n)
m = pow(c1,s1,n)*pow(c2,s2,n) % n
print(binascii.a2b_hex(hex(m)[2:]).decode("utf8"))
0x03 后记
随便写写就那么多字了。。。算了,Web复现再另起一篇进行记录。做题和复现BJD MISC和Crypto,我又收获一波新知识:新佛语解密
、outguess隐写
、多次输入密码解压压缩包脚本
、圣堂武士密码
和在线的cryptogram solver(quipqiup)
,似乎就收获那么多。。。