2021 FDUCTF解题报告

比赛链接

crypto

BabyRSA

小Z学习了RSA算法,但他认为n只需要够大就行了,这合理吗?

from Crypto.Util.number import *
from secret import flag

n=2**1024
e=65537
m=bytes_to_long(flag)
c=pow(m,e,n)
print(c)
#98710114935284696266727187099974304915197330259272688276752009544494890794011845947207535135621221728554983292075279363326530470887005280108304064858795643910517493912505786063549355563638508775960293670872216617616553808345157867436238066114955363541580189011576137409639942086089783269849382676031779988861

思路

∵ c ≡ m 65537 ( m o d 2 1024 ) \because c\equiv m^{65537}\pmod{2^{1024}} cm65537(mod21024)
∴ m ≡ c 2 1024 − 1 65537 ( m o d 2 1024 ) \therefore m\equiv c^\frac{2^{1024}-1}{65537}\pmod {2^{1024}} mc65537210241(mod21024)
因此,我们通过 c c c 逆向算出 m m m ,再用 long_to_bytes 转为 flag 即可

BabyHash

听说哈希算法是不可逆的,我用它来封印我的小秘密,嘻嘻(#.#)

import hashlib
from secret import flag

for c in flag:
    print(hashlib.sha256(c.encode()).hexdigest())

'''
f67ab10ad4e4c53121b6a5fe4da9c10ddee905b978d3788d2723d7bfacbe28a9
3f39d5c348e5b79d06e842c114e6cc571583bbf44e4b0ebfda1a01ec05745d43
a25513c7e0f6eaa80a3337ee18081b9e2ed09e00af8531c8f7bb2542764027e7
6b23c0d5f35d1b11f9b683f0b0a617355deb11277d91ae091d399c655b87940d
e632b7095b0bf32c260fa4c539e9fd7b852d0de454e9be26f24d0d6f91d069d3
f67ab10ad4e4c53121b6a5fe4da9c10ddee905b978d3788d2723d7bfacbe28a9
021fb596db81e6d02bf3d2586ee3981fe519f275c0ac9ca76bbcf2ebb4097d96
df7e70e5021544f4834bbee64a9e3789febc4be81470df629cad6ddb03320a5c
454349e422f05297191ead13e21d3db520e5abef52055e4964b82fb213f593a1
0bfe935e70c321c7ca3afc75ce0d0ca2f98b5422e008bb31c00c6d7f1f1c0ad6
e3b98a4da31a127d4bde6e43033f66ba274cab0eb7eb1c70ec41402bf6273dd8
3f79bb7b435b05321651daefd374cdc681dc06faa65e374e38337b88ca046dea
d2e2adf7177b7a8afddbc12d1634cf23ea1a71020f6a1308070a16400fb68fde
f67ab10ad4e4c53121b6a5fe4da9c10ddee905b978d3788d2723d7bfacbe28a9
65c74c15a686187bb6bbf9958f494fc6b80068034a659a9ad44991b08c58f2d2
454349e422f05297191ead13e21d3db520e5abef52055e4964b82fb213f593a1
2e7d2c03a9507ae265ecf5b5356885a53393a2029d241394997265a1a25aefc6
3f79bb7b435b05321651daefd374cdc681dc06faa65e374e38337b88ca046dea
d2e2adf7177b7a8afddbc12d1634cf23ea1a71020f6a1308070a16400fb68fde
6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b
ef2d127de37b942baad06145e54b0c619a1f22327b2ebbcfbec78f5564afe39d
d2e2adf7177b7a8afddbc12d1634cf23ea1a71020f6a1308070a16400fb68fde
a25513c7e0f6eaa80a3337ee18081b9e2ed09e00af8531c8f7bb2542764027e7
043a718774c572bd8a25adbeb1bfcd5c0256ae11cecf9f9c3f925d0e52beaf89
3f79bb7b435b05321651daefd374cdc681dc06faa65e374e38337b88ca046dea
252f10c83610ebca1a059c0bae8255eba2f95be4d1d7bcfa89d7248a82d9f111
0bfe935e70c321c7ca3afc75ce0d0ca2f98b5422e008bb31c00c6d7f1f1c0ad6
acac86c0e609ca906f632b0e2dacccb2b77d22b0621f20ebece1a4835b93f6f0
d10b36aa74a59bcf4a88185837f658afaf3646eff2bb16c3928d0e9335e945d2
'''

思路

把各字母、数字以及下划线带入 c c c ,将它们的输出和题面的输出进行对比,即可得到答案。

EasyXOR

小Z发明了一种基于异或的循环加密,但这可怎么解密呢?

from secret import flag

def encode(msg):
    msg=list(msg)
    l=len(msg)
    enc=[]
    for i in range(l):
        enc.append(msg[i%l]^msg[(i+1)%l])
    enc=bytes(enc)
    return enc

for i in range(5):
    flag=encode(flag)
print(flag.hex())
#102c2728527c1a356657111350542515634b240e041f2c

可以发现,输出的第 i i i 个字节其实是 flag[i]^flag[(i+5)%l]
再根据 flag 前 6 个字符是 FDUCTF ,可以倒推出答案。

BabyRandom

给你一个机会,你能猜出我的心吗? nc 10.12.5.172 2333

#!/usr/bin/env python3
import signal
import random
from secret import flag

class lfsr():
    def __init__(self, init, mask, length):
        self.init = init
        self.mask = mask
        self.lengthmask = 2**(length+1)-1

    def next(self):
        nextdata = (self.init << 1) & self.lengthmask 
        i = self.init & self.mask & self.lengthmask 
        output = 0
        while i != 0:
            output ^= (i & 1)
            i = i >> 1
        nextdata ^= output
        self.init = nextdata
        return output

signal.alarm(30)
N=16
init=random.randint(1,2**N-1)
mask=random.randint(1,2**N-1)
l=lfsr(init,mask,N)
for i in range(3):
    op=input('choice:')
    if op=='1':
        init=input('init:')
        try:
            init=int(init,2)
        except:
            exit('Must be a binary number!')
        mask=random.randint(1,2**N-1)
        l=lfsr(init,mask,N)
    elif op=='2':
        for _ in range(N):
            print(l.next(),end='')
        print()
    elif op=='3':
        output=input('output:')
        for _ in range(N):
            try:
                assert int(output[i])==l.next()
            except:
                exit('Guess error!')
        print(flag)
        exit(0)
    else:
        exit('Unknown choice!')

思路

代码意思是根据输入的种子生成一个16位的数,每次左移1位(最左边被顶掉)并在右侧附上 mask 下的 popcount。
可以发现种子设为0,猜全0就行了。

misc

photo

图片之下隐藏了什么?
给了一个图片文件,长这样:
2021 FDUCTF解题报告_第1张图片

思路

输入命令

hexdump -C photodata.jpg > 1.txt

1.txt 里查找 FDUCTF 就能看到密码。

Key2

给了一个压缩包

思路

我直接用7-zip解压就看到flag了

实验报告

WZQ的安全攻防综合实验 实验报告
给了一个 doc 文件

思路

把那个文件解压,然后也找到 flag 了

binary

login

WZQ发现登不上去以前注册过的网站了,但是他成功的偷走了服务器上的验证登录页面,你能帮他找找用户名和密码吗(hint:服务器管理员最喜欢的一句话是:三点多了,饮TEA先啊^^) nc 10.12.5.172 1118
给了一个叫 login 的可执行文件

思路

拖到 IDA 里查看逻辑,然后自己用 C++ 算出交互需要的答案就行了

web

爬图小助手v1

http://10.12.5.172:8088/

wsx很喜欢在网上收集好看的图片,但每次保存图片都要右键,然后保存图片,还要在选择保存路径,巴拉巴拉,感觉就很麻烦,于是wsx写了一个爬图小助手,只要把图片的网址输入进去,就可以把图片保存下来了!这真实一个伟大的发明!但突然有一天,wsx发现好像有黑客利用了他的爬虫小助手? (你需要访问/flag获得flag)

思路

我先用浏览器在校园网内访问 http://10.12.5.172:8088/flag/ ,提示要由本地访问。然后上网查了一下,发现要用 HackBar 插件,访问之后就看到 flag 了。

总结

感觉 CTF 还是挺有趣的,特别是找到 flag 后成就感还是挺强的。
很多题目应该都有一定的套路,我毕竟没学过太多相关知识,有些题目只能上网乱查,各种方法乱试。毕竟 flag 怎么藏还是和出题人本身有关,主观性还是比较强的。
另外前排的大佬真的太强了。我这种打酱油的还是望尘莫及。
不知道写这个报告有啥用,写了会有奖品吗?算了,写都写了,开心就好吧。

你可能感兴趣的:(随笔,安全)