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}}
∵c≡m65537(mod21024)
∴
m
≡
c
2
1024
−
1
65537
(
m
o
d
2
1024
)
\therefore m\equiv c^\frac{2^{1024}-1}{65537}\pmod {2^{1024}}
∴m≡c6553721024−1(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
图片之下隐藏了什么?
给了一个图片文件,长这样:
思路
输入命令
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 怎么藏还是和出题人本身有关,主观性还是比较强的。
另外前排的大佬真的太强了。我这种打酱油的还是望尘莫及。
不知道写这个报告有啥用,写了会有奖品吗?算了,写都写了,开心就好吧。