西工大的比赛好难啊( ⊙ o ⊙ )!劝退劝退,自己还是得继续加油学习!
这道题下载附件以后,用winhex打开压缩包会发现,压缩包的文件尾50 4B 05 06
出现在文件头的位置,那么把他移到文件尾,然后又发现是伪加密,把09
改成00
但是发现用winrar
打不开,当时我选择的是用bandzip
,发现能打开
(后来询问了出题人,得知正确解法是最开头一段PK移到结尾 伪加密可以不管 然后自己判断块长度去修复对应二进制位)
所以打不开的原因是还有二进制位没有修复(但是bandzip
牛逼!)
然后打开以后发现一段黑人抬棺视频和一张二维码
二维码缺少了三个定位脚,修复以后扫出来:flag{this_is_not_flag}三曳所諳陀怯耶南夜缽得醯怯勝數不知喝盧瑟侄盡遠故隸怯薩不娑羯涅冥伊盧耶諳提度奢道盧冥以朋罰所即栗諳蒙集皤夷夜集諳利顛呐寫無怯依奢竟#¥#%E68BBFE4BD9BE68B89E6A0BCE79A84E5A7BFE58ABFE59CA8E69C80E5908E32333333||254333254242254338254342254231254338254345254432254238254643254236254145254239254441254437254234254232254131254236254245253244253244254343254438254330254341254336254435.sadwq#asdsadasf faf$use$dasdasdafafa_$ba##se64$
那么依次来解:
首先最开始的是与佛论禅加解密:
然后是base16:
然后是base16+url解码:
然后最后那个依稀可见use base64
那么再去看视频,仔细听会发现在视频中间会出现电话音,但是因为视频是双声道,加上环境混淆音很重,所以一般的电话音识别工具和脚本都不行,我用了dtmf2num.exe
分析出来的也不对
然后这里感谢Ga1@xy师傅,他帮我把出现电话音的那几秒分别截了出来
音频链接:
https://pan.baidu.com/s/1rqX68BbS1gqlT3lc_OWODw
提取码:s27k
那么这里识别的结果就比较精确了:
然后开头几个数字去找了出题人得到了hint,最后得到手机号码xxx18070885
那么发短信过去会提示NWPUSEC
去微信公众号关注了以后,发送了手机号码base64encode
的结果,然后发送了一段音频
得知是无线电,手机上用Robot36
识别出来一张图:
可以依稀获得:flags::flag{miSc_ChecK_In_Ver16ied}
(这里的话,用公众号的音频识别出来比较难,笔者提供一份高清的音频)
音频链接:
https://pan.baidu.com/s/1kLp-3e_wZ0UDIiRH7R0MAw
提取码:unm8
Encryption:
p = getPrime(25)
e = # Hidden
q = getPrime(25)
n = p * q
m = bytes_to_long(flag.strip(b"npuctf{").strip(b"}"))
c = pow(m, e, n)
print(c)
print(pow(2, e, n))
print(pow(4, e, n))
print(pow(8, e, n))
'''
169169912654178
128509160179202
518818742414340
358553002064450
'''
那么题目给了 2^e mod(n),4^emod(n),8^emod(n) ,那么我们假设分别为a,b,c
那么易得a^2-b=k1*n,a^3-c=k2*n
那么n |GCD(a^2-b,a^3-c)=(k1,k2)*n,所以写脚本可以知道n,即知道p,q
from Crypto.Util.number import *
c1 = 128509160179202
c2 = 518818742414340
c3 = 358553002064450
n = GCD(c1**2-c2, c1**3-c3)
print n
然后用yafu分解n:
那么可知(k1,k2)=2,p=28977097,q=18195301
那么还有e不可知
求e的方法有多种,其中一种参考0xDktb师傅的wp:http://0xdktb.top/2020/04/19/WriteUp-NPUCTF-Crypto/ (u1s1,我没看懂,所以我的方法是最直接的枚举)
但是Python爆破时间很慢,最好还是用c/c++,但因为我的VS出了一点问题用不了,所以选择了Python
import gmpy2
n = 527247002021197
c1 = 128509160179202
e = 500000000
while e <1000000000:
if gmpy2.powmod(2,e,n) == c1:
print e
else:
e+=1
爆破出来的结果是e = 808723997
然后就是常规解RSA了
from Crypto.Util.number import inverse, long_to_bytes
p = 28977097
q = 18195301
N = p*q
nn = (p-1)*(q-1)
e = 808723997
d = inverse(e,nn)
c = 169169912654178
m = pow(c,d,p*q)
flag = long_to_bytes(m)
print flag
这道题首先打开图片发现是一份日历:
然后右下角有F1 W1 S22 S21 T12 S11 W1 S13
去网上直接查F W S T
会有个网站说是日期的一种简单表示,那么放到这题,字母后面跟着两位数字的分别是S T
,刚好对应Saturday Sunday
和Tuesday Thursday
,那么右下角的就应该是对应日期。
依次查找,F1 W1 S22 S21 T12 S11 W1 S13
对应着就是3 1 12 5 14 4 1 18
(S22
就代表是S2(Sunday)
的第二个,同理可知S13 T12
等)
那么找到3 1 12 5 14 4 1 18
以后发现直接提交不对,十六进制转换也不对,那么试着去对应字母表,刚好解得为calendar
最后flag
为flag{calendar}
打开压缩包,里面还有一个压缩包(内有一张加密的图片)和一个txt
,txt
内容是:
那么很明显可以看出pvb
对应key
,第一反应是去https://quipqiup.com/
上跑,但是出来的不正确,那么尝试掩码也不可能。那么继续看特征。仔细查看会发现p
和k
的字母顺序加起来为27
,v
和e
加起来也为27
那么就知道这密码为Atbash
(埃特巴什码),即最后一个字母代表第一个字母。那么解得the_key_is_atbash
:
打开得到一张图片是古埃及象形文字编码和猪圈密码变种合成的一幅图片(关于CTF常出现的一些奇奇怪怪的编码在之前的文章里曾写过):
解得flag{classicalcode}