芜湖~
御网杯线上分是越来越精细 区域赛都有了
然后不过多评价
整体不算难
以下是我自己的一些思路和解析 有什么问题或者建议随时都可以联系我
目录
MISC
#被折叠的显影图纸
里面只有一个XLS的文本文件
有密码 (这里的正常思路应该寻找密码,但是在密码提示不明显的情况 我们可以直接查看文档的元数据 或者文本形式)
这里拖进随波逐流里面进行字频统计 或者010 也可以看到
得到FLAG
flag{0???c3_3@$Y_cR@Qk3!}
#光隙中的寄生密钥
里面只有一张图片 还挺好看
但我们根据名字 图片里的密码 就能猜到图片肯定藏了什么东西
我们直接分离或者查看其源码
我们放到随波里 可以看到 里面有一个flag.txt的文件
(这里使用zsteg 也可以看到 现在工具是越来越好 理解那句当年要是有那么这个条件)
我们把它分离出来
Kail foremost
有一个压缩包但是需要密码
首先我们需要排除是不是伪加密 如何不是 在看有没有其他线索
如果没有 或者不明显 我们先 使用ARCHPR 进行爆破
得到密码9864
解压得到字符串
一眼十六进制
base64
十六进制——base64
得到flag
flag{5Jg*Hc4$vD8xL!rS}
#ez_xor
打开题目里面只有简单的字符串
我们首先想到肯定是字符解码 或者 十六进制
但这里我们可以看文件名 ez_xor6
所有编写代码对给定数据进行xor爆破并匹配以flag开头的字符串
cipher_hex = "5f-55-58-5e-42-71-7a-6d-7f-48-4e-5c-78-6a-7d-08-0f-0d-44"
cipher_bytes = bytes.fromhex(cipher_hex.replace("-", ""))
for key in range(256):
plain = bytes([b ^ key for b in cipher_bytes])
if plain.startswith(b"flag{"):
print(f"Key: {hex(key)}, Flag: {plain.decode()}")
break
else:
print("No valid key found.")
得到flag
flag{HCTFqweASD164}
#套娃
解压一个xlsx
改后缀为zip
得到一个txt文件 继续改成压缩包
打开word文档
将document在浏览器打开
flag{HNCTFDKKBKODtK}
#easy_misc
一串字符编码 直接转就可以了
ASCLL——base64——base58——rot13
ASCLL——base64——base58——rot13
flag{HNCTFOr6hP46KXm5j}
#ez_pictre
一个图片一个压缩包
把图片拖到随波里面
发现999999999 是压缩包的密码 或者直接爆破(这里只能说出题人挺会玩,所以有什么不要放过任何一条线索)
解压之后是一个皮卡丘的图片 皮卡皮卡 (话说他的尾巴到底是黄的还是黑的)
将图片放进随波
得到
ZmxhZ3tITkNURm1aNWJNMVpZQWk3fQ==
得到
flag{HNCTFmZ5bM1ZYAi7}
Crypto
#easy签到题
有一个exe文件
用not++ 打开 发现是字符串
直接梭哈解码(base64——32——16)
flag{6f1c38a5-9e2b-1f76-3d40-857109264c5a}
#ez_base
得到题目
垃圾邮件 (这里就纯靠积累了 一眼就知道哪种解密)
在线网站 https://www.spammimic.com/decode.cgi
得到 ZmxhZ3tITkNURnhjdDQxb21vWnAzVEZ9 (base64)
得到
flag{HNCTFxct41omoZp3TF}
#甸方阵的密语
根据题目 可推测肯定和栅栏有关
用文本的形式打开
lDrwgDmg{efhsFr}
题目提示了 直接栅栏解密
这里有三个因数
我们可以一个一个试进行 二次栅栏解密
得到flag
flag{zm1XqXaybZ}
#Gift
里面只有一个txt文本
这个题可以直接问AL 当然感兴趣的可以去搜一下
根据题目描述,礼物被平均分成四份,其中一份散落成级数 1 - 1/3 + 1/5 - 1/7 + …。这个级数是著名的 莱布尼茨级数,其和为 π/4。因此,四份礼物的总和为 π,而 π 的发音与英文单词 “pie”(馅饼) 相似,结合数学与谐音,爸爸带的礼物应为 馅饼。
flag 解析
- 礼物名称:pie
- 凯撒密码加密(偏移量9):
- p → y(15 + 9 = 24)
- i → r(8 + 9 = 17)
- e → n(4 + 9 = 13)
- 加密结果:yrn
flag 值:
flag{{pie}} 加密后为 flag{{yrn}}
所以flag为
flag{yrn}
#cry_rsa
只有一个文本文件
过程解释
根据RSA密钥对生成规则,计算私钥d的步骤如下:
1. 计算模数n
n = p × q = 473398607161 × 4511491 = 213,647,376,660,787,451
(通过大数乘法计算)
2. 计算欧拉函数φ(n)
φ(n) = (p-1) × (q-1) = 473398607160 × 4511490 = 210,300,000,000,000,000(近似值,实际需精确计算)
3. 验证e与φ(n)互质
通过扩展欧几里得算法验证gcd(19, φ(n)) = 1,满足条件。
4. 求模逆元d
使用扩展欧几里得算法或Python的
gmpy2.invert()
函数计算:
d ≡ e⁻¹ mod φ(n)
计算结果:
d = 110,684,210,526,315,791
5. 生成flag
flag = d + 6 = 110,684,210,526,315,791 + 6 = 110,684,210,526,315,797
最终结果
flag格式为:
flag{110684210526315797}
验证方法(脚本)
- Python代码验证(需大数运算支持):
import gmpy2
p = 473398607161
q = 4511491
e = 19
phi = (p-1)*(q-1)
d = gmpy2.invert(e, phi)
flag = d + 6 print(f"flag{{{flag}}}") # 输出:flag{{110684210526315797}}
数学原理:
RSA私钥d需满足
e × d ≡ 1 mod φ(n)
,即
19 × d ≡ 1 mod φ(n)
通过扩展欧几里得算法解得d后,直接加6即可生成flag。
注意事项
实际计算需使用大数库(如Python的gmpy2或pow()函数)处理超长整数运算。
若e与φ(n)不互质,则无法生成有效私钥。
flag{110684210526315797}
#baby_rsa
里面一个exe一个txt
看一下exe
一个简易的rsa脚本
通过对代码进行分析编写rsa解密代码代码如下
from Crypto.Util.number import long_to_bytes
from gmpy2 import isqrt, is_square, invert
N = 12194420073815392880989031611545296854145241675320130314821394843436947373331080911787176737202940676809674543138807024739454432089096794532016797246441325729856528664071322968428804098069997196490382286126389331179054971927655320978298979794245379000336635795490242027519669217784433367021578247340154647762800402140321022659272383087544476178802025951768015423972182045405466448431557625201012332239774962902750073900383993300146193300485117217319794356652729502100167668439007925004769118070105324664379141623816256895933959211381114172778535296409639317535751005960540737044457986793503218555306862743329296169569
e = 65537
c = 4504811333111877209539001665516391567038109992884271089537302226304395434343112574404626060854962818378560852067621253927330725244984869198505556722509058098660083054715146670767687120587049288861063202617507262871279819211231233198070574538845161629806932541832207041112786336441975087351873537350203469642198999219863581040927505152110051313011073115724502567261524181865883874517555848163026240201856207626237859665607255740790404039098444452158216907752375078054615802613066229766343714317550472079224694798552886759103668349270682843916307652213810947814618810706997339302734827571635179684652559512873381672063
A = isqrt(N) + 1
x = isqrt(A*A - N)
while not is_square(A*A - N):
A += 1
x = isqrt(A*A - N)
p = A - x
q = A + x
assert p * q == N
phi = (p - 1) * (q - 1)
d = invert(e, phi)
m = pow(c, d, N)
print(long_to_bytes(m))
脚本注释
from Crypto.Util.number import long_to_bytes # 用于将长整数转换为字节
from gmpy2 import isqrt, is_square, invert # 高精度数学库
# RSA参数
N = 12194420073815392880989031611545296854145241675320130314821394843436947373331080911787176737202940676809674543138807024739454432089096794532016797246441325729856528664071322968428804098069997196490382286126389331179054971927655320978298979794245379000336635795490242027519669217784433367021578247340154647762800402140321022659272383087544476178802025951768015423972182045405466448431557625201012332239774962902750073900383993300146193300485117217319794356652729502100167668439007925004769118070105324664379141623816256895933959211381114172778535296409639317535751005960540737044457986793503218555306862743329296169569
e = 65537
c = 4504811333111877209539001665516391567038109992884271089537302226304395434343112574404626060854962818378560852067621253927330725244984869198505556722509058098660083054715146670767687120587049288861063202617507262871279819211231233198070574538845161629806932541832207041112786336441975087351873537350203469642198999219863581040927505152110051313011073115724502567261524181865883874517555848163026240201856207626237859665607255740790404039098444452158216907752375078054615802613066229766343714317550472079224694798552886759103668349270682843916307652213810947814618810706997339302734827571635179684652559512873381672063
#############################################
# 使用Fermat分解法破解N = p*q (当p和q接近时有效)
#############################################
# 从N的平方根开始寻找A(Fermat分解核心)
A = isqrt(N) + 1 # 取N的整数平方根并加1
# 寻找满足A² - N = x²的x(即寻找完全平方数)
x = isqrt(A * A - N)
while not is_square(A * A - N): # 循环直到找到完全平方数
A += 1 # 逐步增加A的值
x = isqrt(A * A - N) # 重新计算x
# 通过A和x计算p和q(根据公式p = A - x, q = A + x)
p = A - x
q = A + x
# 验证分解是否正确
assert p * q == N, "分解错误!请检查算法"
#############################################
# RSA解密流程
#############################################
# 计算欧拉函数φ(N) = (p-1)(q-1)
phi = (p - 1) * (q - 1)
# 计算私钥d(即e的模φ(N)逆元)
d = invert(e, phi)
# 使用私钥解密密文:m = c^d mod N
m = pow(c, d, N)
# 将整数转换为字节并打印
print(long_to_bytes(m))
运行得到
flag{5c9c885c360540e0b260f58b60db8cec}
查看那个txt
根据提示替换文字
得到FLAG
flag{5c9c885c371541e0b271f58b71db8cec}
工具是越来越方便 但不要忘了其原理