2022年春季赛WP
[TOC]
1. MISC
1.签到
扫码得到flag
2.签个到
base85解码,base32解码,base64解码,得到微信号(很明显看出)
上面那个很明显看出是王文旭师哥写的,但是在师哥们在实验室出题的时候,我真没想出来,被王师哥坑道了,我以为是加密…….
微信搜索好友,查看个性签名得到flag ,也是因为当时我们觉得这个签到,有点离谱,就又出了一道真签到。
3.The flag is under the picture
这一道题目,思路来自于在过去做过的一道,flag_under_the_picture和山东省科技节的一道大赛杂项。其实,在设计的时候稍微降了下难度,原题真的是图片隐写,但是考虑这次考察了一些其他内容,就在不在这一道题考察图片隐写,至于山东科技节的真题当时flag是两部分,一部分在文字类型里,另一部分则是隐藏文字。
这个算是一个签到(信息收集?)难度应该不大。
1 under_the_picture,图片在word里的位置有很多种,环绕好像是最常见的,当时如果选择浮在文字之上就可以在图片下隐藏一些信息。 2 word实际上可以看做一个压缩包,我们可以在里面秘密的添加一些文件 3 在word下,我们可以更改字体格式为任意值,虽然这在显示中是默认值,但是字体名确实是你自定义的那些 4 隐藏文字,可以在word中设置显示隐藏文字
flag{this_is_a_Sign_in_You_are_well}
在这边师哥道歉下,我这次出题还是考虑不周,文档里面可以找到的所有信息和最后剩余的其实差了一个下划线_ ,虽然这种少下划线的平时做题也有,但这次我确实也没考虑这个,给师弟们放的Hint里面也误导了一些师弟…..
4.Virus_Killer
这是一道让所有 参赛选手都可以参与的题目,有谁能不喜欢我的世界呢?
我修改了包括终末之诗在内的一些内容,flag就在终末之诗里面,击败末影龙就能得到flag。
当然我觉得正常应该没人会是通过 杀死末影龙看到终末之诗吧,在配置文件里有一个 病毒杀手.jar用压缩包格式打开可以在里面找到终末之诗的配置文件,end
你会得到这一串
代码语言:javascript复制§3恭喜你
§2PLAYERNAME
§3成功击败了冠状病毒
§2来到了这里
§3现在
§2你将获得你的奖励
§3仔细看
§6ZmxhZ3tUaGVfdmlydXNfd2lsbF9wYXNzfQ==
base64解码得到flag flag{The_virus_will_pass}
5.拆红包
Linux下binwalk分离,得到一个txt(41,21,33,45,11,14,13) 使用010改变图片高度(WORD Y_image),下方为一个鼓,由此联想到敲击码打开文件,下面放一张敲击码图
6.兔死who悲
这个题,应该是来自王文旭师哥,兔吗,这很明显说的是rabbit密码,在图片中有一句我需要爆破,在比赛过程中,我们也放出了hint给出了zip-crc-cracker-master的下载地址
其实做出来的数量较我们的预期少了,因为提示给的很充足,使用binwalk -e分解图片可以得到flag.txt文件,这个是Rabbit加密的密文文件,在同时还存在一个加密文件夹,使用爆破跑是跑不出来的,这里需要crc碰撞
可以通过python3 crack.py key.zip简单得到解密秘钥(0_0),解密得到flag
代码语言:javascript复制flag{u_really_know_rabbits_and_crack}
7.黑化的维亚
用stegsolve打开,查看不同色域下的图片
可以在相机的属性中找到序列号abcd,用abcd作为秘钥加密一次就得到flag。
代码语言:javascript复制flag{wowowoheihuale!123}
8.Retrieve_the_passcode
附件为一个rar文件和scatter.txt,从文件名入手,010内直接更改编辑。本题的scatter意思为散点,在MATLAB 为函数 在向量 x 和 y 指定的位置创建一个包含圆形的散点图。内数据格式为num,num,num; 使用Python处理数据,画出散点图即为压缩包密码(或直接暴力)
代码语言:javascript复制import matplotlib.pyplot as plt
import numpy as np
import math
lines = open("scatter.txt", "r").readlines()
X = []
Y = []
for line in lines:
x,y,z = line.split(":")
X.append(x)
Y.append(y)
plt.scatter(X, Y, s=1, color='red')
plt.xlim((-20, 50))
plt.ylim((-20, 50))
plt.show()
打开pdf为一串摩斯密码,解码得flag
9.0和1的故事
这个题的话我是套了以前做过的几个题,给大家添麻烦了,如果我没猜错的话,不少师弟师妹应该做过一个01字符串生成二维码的题目,师哥为了不让大家这么快获得flag,在外面套了一个base64转图片。因为得到是图片的形式了,后面的处理方式就看大家的脑洞。
基本上就是识图,生成01串,然后将他还原成二维码,这里还有个坑,我专门把标志位那块的01都换成了0,了解二维码的形状就能很轻松的将其复原。
这是一个0,1字符串生成二维码的脚本,没有实现的师弟师妹们可以看看
代码语言:javascript复制from PIL import Image
x = 29
y = 29
im = Image.new('RGB', (x, y))
white = (255, 255, 255)
black = (0, 0, 0)
with open('1.txt') as f:
for i in range(x):
ff = f.readline()
for j in range(y):
if ff[j] == '1':
im.putpixel((i, j), black)
else:
im.putpixel((i, j), white)
im.resize((1000, 1000)).show()
当时我在看一个类似题目的题解的时候,有位大哥是有Excel完成的…..我觉得师弟中应该没有这样干的吧
10.有手就行
B.base64.txt里的编码内容是正确的flag
tp文件是png图片,文件尾部有提示的base64,解出来是a=1,b=1
使用脚本将一大串经过多次加密的base64解出来后是:gmbh{xf1d0nf_u0_cvhlv_}
结合a=1,b=2和仿射密码的特征,g前一位是f,m前一位是l,以此类推可以发现是仿射密码,打开仿射密码网站,将密文输进去,然后在a处输入1,b处输入即时正确的flag
最终flag是: flag{we1c0me_t0_bugku_30}
脚本:
代码语言:javascript复制import base64
a = open('B.base64.txt','r',encoding='utf-8')
b = a.read()
print(b)
print('n')
c = 0
for i in range(50):
base64_de = base64.b64decode(b)
print(base64_de)
b = base64_de
c =1
print(c)
2.CRYPTO
1.EzRSA
观察发现q是p的下一个素数,p和q相邻,考虑yafu分解n。
p = 60973413304835230363868586902004006717237117044275222095949523787438821909233
q = 60973413304835230363868586902004006717237117044275222095949523787438821908819
接下来是正常rsa求解。
exp:
代码语言:javascript复制from Crypto.Util.number
import * import gmpy2
p = 60973413304835230363868586902004006717237117044275222095949523787438821909233
q = 60973413304835230363868586902004006717237117044275222095949523787438821908819
e = 65537
c = 843360044490649635455345992345658516544479053731668488697835904926685148386299530843302273377684497428582758441622699787334991310590024330881454606434905
d=gmpy2.invert(e,(p-1) * (q-1))
n = p * q
print(long_to_bytes(pow(c,d,n)))
#b'flag{crypto_1s_interesting}'
2.欧欧欧欧拉
方法一:
发现p,q,r均已给出,可以忽略题目中n的值,我们令n = p * q * r
然后就是正常求解
代码语言:javascript复制p = 77708508489582208240899650131902840854815755133475819112169579073727218368043
q = 115346274621041699318908577704185761162067920193040258837922665578623979014737
r = 93166107981326026645441213611016470699177795686294207640877308859576453989929
c = 347985024400177502137432464900798540953635460694795945231855306625760961473332840686487124095862063998154167906085538622293374268339383930561570822025993330404000443189437185443891030627628783181063490300672242012327030487902957573259843362590656890086005064250511680034244728108117012676345214617621947005352669846702858611524555358875183335220452897059852086551237875454030210006489044067322848138770597108902534895893528585191491006543670911357584958970659151927090552495978448117307851072739865139783869799508202415340492688302276117064301995204992930822769693356655071714132128172897117903997013826512429240667259726064548860744384724715228197199073875301540485927036010254145447026303876803125148732898741913665524085357027 545745800931501381715355480791801480897
e = 65537
n = p * q * r
from Crypto.Util.number import *
import gmpy2
d = gmpy2.invert(e,(p-1) * (q-1) * (r-1))
m = pow(c,d,n)
print(long_to_bytes(m))
方法二:
我们也可以不更改n,利用欧拉函数的性质
n = p ** 2 * q ** 3 * r ** 5
phin = phi(p ** 2) * phi(q ** 3) * phi(r ** 5) = (p-1) * p * (q-1) * q * (r-1) * r**4
exp:
代码语言:javascript复制p = 77708508489582208240899650131902840854815755133475819112169579073727218368043
q = 115346274621041699318908577704185761162067920193040258837922665578623979014737
r = 93166107981326026645441213611016470699177795686294207640877308859576453989929
c=347985024400177502137432464900798540953635460694795945231855306625760961473332840686487124095862063998154167906085538622293374268339383930561570822025993330404000443189437185443891030627628783181063490300672242012327030487902957573259843362590656890086005064250511680034244728108117012676345214617621947005352669846702858611524555358875183335220452897059852086551237875454030210006489044067322848138770597108902534895893528585191491006543670911357584958970659151927090552495978448117307851072739865139783869799508202415340492688302276117064301995204992930822769693356655071714132128172897117903997013826512429240667259726064548860744384724715228197199073875301540485927036010254145447026303876803125148732898741913665524085357027545745800931501381715355480791801480897
n = 65048551512240621993540614202950633661842586962192652824898395688184000402795957509481722751199080903392947991398273550047341785877223668123666842324877380470794846769076657730082614690182880900631464361441076132475928747991954627503106907777376357374758381806436260187733080114319610478685015082092970829089757587587993969952452971403572518192436602517670638053566510878431768966565133874950375020522410987166924387985858892891003579542248992692799457937156750952714742294212043332149687042398627353772231567346753462916369667925107827788291811362515610771720461320487626568153215009781929374220819616329622781459299058370744879472145087090461481538486760169932577206734789444604559973471107786087166188418189039013657392095931298017769281949143411358392051565393109553
e = 65537
from Crypto.Util.number import *
import gmpy2
phip = (p-1) * p
phiq = (q-1) * q**2
phir = (r-1) * r**4
phi = phip * phiq * phir
d = gmpy2.invert(e,phi)
print(pow(c,d,n))
print(long_to_bytes(pow(c,d,n)))
#b'flag{1_th1nk_you_get_1t}'
3.RRRRSA
第一段flag对N和N1 gcd可得到p,进而得到q,e进行遍历即可。
第二段flag为低质数加密攻击,e=3确定,爆破即可。
exp:
代码语言:javascript复制from Crypto.Util.number import *
import gmpy2
N=8833009455505830765576231622072241161470401197695529677335107109810339880276832871604743644707359887179405543235721188241122566162151923510929667953122181
N1=9429676793030563745207076251618678117488728061107610987225993751644166892153001760951206447627482758551907039606942492875805463671257287080808106906001851
c1=8037069184897987958374773499995275921812115255860632996217845099273168646686370835196595250846074845406069858745424656055726674434603985267158502329518751
c2=413575070955891267004255576879221041256089460651441473637
p = gmpy2.gcd(N,N1)
q = N // p
phi = (p-1) * (q-1)
#第一段flag枚举e
for e in range(10000):
if(gmpy2.gcd(e,phi) == 1):
d = gmpy2.invert(e,(phi))
m1 = pow(c1,d,N)
if( b'flag' in long_to_bytes(m1)):
print(e)
flag1 = long_to_bytes(m1)
break
#第二段flag低公钥e爆破
from gmpy2 import iroot
import libnum
e = 0x3
n =
10456335904838169914349646852830082932152130624533179855437700729986430916359910968035371355128152016750075271161129744979254605922991030753616570849211931989112941277121682363790710646503345520505931418350219098036569932546893477983585713668853372819392130314661542626399462820378837771792293945490048339575869129479058678981790418112887403292721775644533540769467889512773382494878291574262142755186374570245813695390664702262226281601456889176191920270658811753696081082528539263191477192236336112147705564796435800152614366113854349615104191052807647128834113146535639155857819697492608839941056356828288393881491
k = 0
while 1:
res = iroot(c2 k * n, e) # c k*n 开3次方根 能开3次方即可
if (res[1] == True):
flag2 = libnum.n2s(int(res[0])) # 转为字符串
break
k = k 1
print(flag1 flag2)
#e = 6709
#flag = b'flag{you_get_1t!}'exp:
4.HardRSA
给了hint和p,q的关系,同时又知道n,我们需要构造一个p或者q的倍数和n进行最大公约,得到p或者
q。
代码语言:javascript复制import gmpy2
from Crypto.Util.number import *
n =
124993585424296591093467762244475251138759316583406117657133238536553852339669769400523449633693296145543303393465079699542574868451705092731269012710274047742582156286940702286646643111975860760853620625924935057792931203893647049496628704891431372213711245207398212732529309490088729910948745640748736955073
c =
50424006770352436334712623677416186679749743823334436526623823505393135268471235757954106626248672896094704432397859493914371835003999982028550123956410656701321293836439453483634735255591270239182001956026055818185575266979363172614844927196934018068753541437103088119691563904347098094997053933889342339430
hint =
95947821330255050044792695953225981695564565853431169112620146574854785547870212826519391606210465121248955917602550813434927609689055640312953524952635919431672688325438812967089917271116316877318959974024993544935124710051420914708812538221556136784742855036819112563084588872068036526345880570488594712154
e = 65537
kp = hint-gmpy2.powmod(1011,n,n)
p = gmpy2.gcd(n,kp)
q = n // p
phi = (p-1)*(q-1)
d = gmpy2.invert(e,phi)
m = gmpy2.powmod(c,d,n)
flag = long_to_bytes(m)
print(flag)
#b'flag{math_1s_important}'
5.古典密码
猪圈密码 ,圣堂武士密码 ,标准银河字母解出来 FGCPFLIRTUASYON
最后提示说栅栏,那就栅栏解密,分栏为3时解出来 FLAGISCRYPTOFUN
flag{CRYPTOFUN}