2022年QFNU春季赛WP

2024-02-28 20:15:36 浏览数 (2)

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}

3.WEB

0 人点赞