第三届南宁市网络安全技术大赛部分wp

本文详细解析了CTF竞赛中的三个密码学挑战,包括Shamir的秘密共享方案、CRC32碰撞破解及栅栏密码的解密过程。通过对这些挑战的深入分析,揭示了密码学在信息安全领域的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、shamir重要数据损坏(Crypto)

14899865-ee66d9f1e3772845.png
题干

shamir典型门限秘密共享,要形成(3,5)门限,则产生一个二次多项式


14899865-600881e444ea3f0b.png

根据题目获得对应的三组(f(x),x)轻易的解出方程。
a = 5,b = 23, M = 2018
而M就为加密的信息,flag为2018提交成功。

2、misc2(MISC)

14899865-44c3dba0296b1d29.png
题干
14899865-58c1cbbfa99f172f.png
压缩包,崩溃吧

下载文件后,面对密密麻麻的压缩包真的慌的一批,所以一开始并没有认真的看这道题。


14899865-4172003dee23cdae.png
CRC32值获得处

后来观测到压缩包全部为大小为3字节的文件,可以统一通过3位CRC32爆破来获取文件内容。
手上并没有能运行这么多crc碰撞的脚本,只能自己写了。
自己手动获取了40个压缩包的CRC32的值(崩溃中)放到TXT跑脚本


14899865-34c74a204750d815.png
所有压缩包CRC32

脚本代码如下

import datetime
import binascii
import sys
def showTime():
    print datetime.datetime.now().strftime("%H:%M:%S")  
def crack():
    number = 0
    f = open("crc.txt","r")
    lines = f.readlines()
    str1 = ''
    for line in lines:
        crc = int(line,16)
        r = xrange(32, 127)
        for a in r:
            for b in r:
                for c in r:
                    txt = chr(a)+chr(b)+chr(c)
                    crcx = binascii.crc32(txt)
                    if (crcx & 0xFFFFFFFF) == crc:
                        # print hex(crc)
                        # sys.stdout.write(chr(int(txt)))
                        str1 = str1 + chr(int(txt))
        number += 1
        print "find crc "+str(number)
    print str1
if __name__ == "__main__":
    showTime()
    crack()
    showTime()

耗时40秒跑出字符串“Z3hubmN0ZnsyaVBfQ3JjX2p1NXRfSzFEZDFuOX0=

后带等于号,放进BASE64解码尝试。
得到gxnnctf{2iP_Crc_ju5t_K1Dd1n9}

3、这是啥(MISC)

14899865-c13dc7192729acfd.png
题干

下载文件后,有一张图片


14899865-7479e41b5c32b552.png

在图中提取字符串就得到了
GFE-YLCERCNSNLA-AIX{N-PYNET-TSTMYRA}
按图片内容猜测就是栅栏,当时也没认真看题目
只根据之前的经验,和结合这次比赛flag的格式GXNNCTF{*******}对这段字符拆分
尝试拆分代码

str1 = 'gfe-ylcercnsnla-aix{n-pynet-tstmyra}'
g,x,n,c,t,f, = [],[],[],[],[],[]
for i in range(0,35):
    if str1[i]=='g':
        g.append((i+1))
    elif str1[i]=='x':
        x.append((i+1))
    elif str1[i]=='n':
        n.append((i+1))
    elif str1[i]=='c':
        c.append((i+1))
    elif str1[i]=='t':
        t.append((i+1))
    elif str1[i]=='f':
        f.append((i+1))
print('g:'+str(g))
print('x:'+str(x))
print('n:'+str(n))
print('c:'+str(c))
print('t:'+str(t))
print('f:'+str(f))
14899865-84e138176e5203d0.png
运行结果

可以看到对g,x,f固定位可以得出


14899865-c7592f8cd4dee384.png

我认为f就是栅栏密码的第二行,而如果将gxnnct这六个字符任意排序能变成等差数列的话,这题就解出来了。
所以最后结果
[图片上传中...(image.png-cd856d-1545043361871-0)]

14899865-2f32e3d28deb0d6a.png

恰好形成等差为6的6个数据,这个时候,我恍然大悟,原来题目的66666是这个意思。(汗!)

代码

a,b,c,d,e,f=1 ,19 ,13 ,25 ,7 ,31
for i in range(-1,5):
    print (str1[a+i],end='')
    print(str1[b+i],end='')
    print(str1[c+i],end='')
    print(str1[d+i],end='')
    print(str1[e+i],end='')
    print(str1[f+i],end='')
14899865-4e5c356575fd91e3.png

gxnnctf{leemenatry----crypatnalyiss}提交成功

4、伊丽莎白二世

伊丽莎白今年92岁,直接把标题丢进BASE92得到flag

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值