BugKu CTF Crypto:散乱的密文 & .!? & Double & 11 月 11 日是个好日子

前言

BugKu是一个由乌云知识库(wooyun.org)推出的在线漏洞靶场。乌云知识库是一个致力于收集、整理和分享互联网安全漏洞信息的社区平台。

BugKu旨在提供一个实践和学习网络安全的平台,供安全爱好者和渗透测试人员进行挑战和练习。它包含了各种不同类型的漏洞场景,如Web漏洞、系统漏洞、密码学等,参与者需要通过解决这些漏洞来获取Flag。

BugKu的特点如下:

1. 漏洞丰富:BugKu提供了大量的漏洞场景供用户挑战,涵盖了常见的Web漏洞,如XSS、SQL注入、文件上传等,以及其他类型的漏洞,如逆向工程、密码学等。

2. 适合不同水平:BugKu的题目分为不同的难度级别,适合不同水平的参与者。从初学者到专业渗透测试人员,都能在BugKu中找到适合自己的挑战。

3. 学习资源:BugKu提供了丰富的学习资源,包括解题思路、漏洞分析、修复建议等。参与者可以通过学习他人的解题思路和经验,提高自己的技术水平。

4. 排行榜竞赛:BugKu设置了排行榜,参与者可以通过解决题目获取积分,竞争排名。这种竞争激励机制可以激发参与者的学习兴趣和动力。

通过参与BugKu,参与者可以在实践中学习到真实的漏洞和攻击技术,提高自己的技术水平。同时,BugKu也是一个交流和分享的平台,参与者可以与其他安全爱好者进行讨论和学习,共同成长。

CTF Crypto

密码学(Cryptography)一般可分为古典密码学和现代密码学。

其中,古典密码学,作为一种实用性艺术存在,其编码和破译通常依赖于设计者和敌手的创造力与技巧,并没有对密码学原件进行清晰的定义。古典密码学主要包含以下几个方面:

  • 单表替换加密(Monoalphabetic Cipher)
  • 多表替换加密(Polyalphabetic Cipher)
  • 奇奇怪怪的加密方式

而现代密码学则起源于 20 世纪中后期出现的大量相关理论,1949 年香农(C. E. Shannon)发表了题为《保密系统的通信理论》的经典论文标志着现代密码学的开始。现代密码学主要包含以下几个方面:

  • 对称加密(Symmetric Cryptography),以 DES,AES,RC4 为代表。
  • 非对称加密(Asymmetric Cryptography),以 RSA,ElGamal,椭圆曲线加密为代表。
  • 哈希函数(Hash Function),以 MD5,SHA-1,SHA-512 等为代表。
  • 数字签名(Digital Signature),以 RSA 签名,ElGamal 签名,DSA 签名为代表。

其中,对称加密体制主要分为两种方式:

  • 分组密码(Block Cipher),又称为块密码。
  • 序列密码(Stream Cipher),又称为流密码。

一般来说,密码设计者的根本目标是保障信息及信息系统的

  • 机密性(Confidentiality)
  • 完整性(Integrity)
  • 可用性(Availability)
  • 认证性(Authentication)
  • 不可否认性(Non-repudiation)

其中,前三者被称为信息安全的 CIA 三要素 。

而对于密码破解者来说,一般是要想办法识别出密码算法,然后进行暴力破解,或者利用密码体制的漏洞进行破解。当然,也有可能通过构造虚假的哈希值或者数字签名来绕过相应的检测。

一般来说,我们都会假设攻击者已知待破解的密码体制,而攻击类型通常分为以下四种:

攻击类型说明
唯密文攻击只拥有密文
已知明文攻击拥有密文与对应的明文
选择明文攻击拥有加密权限,能够对明文加密后获得相应密文
选择密文攻击拥有解密权限,能够对密文解密后获得相应明文

一、散乱的密文

打开靶场

lf5{ag024c483549d7fd@@1} 一张纸条上凌乱的写着2 1 6 5 3 4

按照数字顺序每六个一组重新排一下即可

flag{52048c453d794df1} 

二、.!?

打开靶场

打开文件如下 

Ook! 解码即可 

三、Double

打开靶场

提示是混合密码,打开文件

from Crypto.Util.number import bytes_to_long
from secrets import k, P, flag

# 定义一个椭圆曲线 E,使用参数 [0,2021,0,310,-2783] 来指定曲线的系数。QQ 表示曲线定义在有理数域上
E = EllipticCurve(QQ,[0,2021,0,310,-2783])

# 使用 assert 语句确保点 P 的 y 坐标与曲线 E 上 x=2 时的 y 坐标一致
assert P.xy()[1] == E.lift_x(2)


Q = k * P
R = Q + P

# 从点 Q 的 x 坐标中提取分子部分,这个值将作为 RSA 模数 n 的一个因子 p
p = Q[0].numerator()
q = R[0].numerator()

# 定义 RSA 加密的公钥指数 e,通常为 65537 或其十六进制表示 0x10001
e = 0x10001

n = p * q

# 确保标量 k 小于模数 n 的位数
assert k < n.bit_length()

m = bytes_to_long(flag)
c = pow(m, e, n)

print(f'n = {n}')
print(f'c = {c}')


#n = 2627832721798532654645633759787364870195582649392807630554510880534973280751482201937816738488273589173932960856611147584617677312265144131447658399933331448791094639659769069406481681017795446858858181106274806005669388289349727511470680972
#c = 96830301447792999743877932210925094490214669785432172099311147672020980136112114653571739648595225131425493319224428213036136642899189859618195566355934768513439007527385261977662612094503054618556883356183687422846428828606638722387070581

先尝试分解 n

得到

p = [2,2,3,3,13,101,443,1087,15527,47363,111309491243,5738160242986813,118881536167887307517887651928306109231371669715927208908931577713837,2067526976195544603847619621425435706797374170280528431947550231604621041865531599319428120598265860512130517815755608596553793]
import gmpy2
import libnum

n = 2627832721798532654645633759787364870195582649392807630554510880534973280751482201937816738488273589173932960856611147584617677312265144131447658399933331448791094639659769069406481681017795446858858181106274806005669388289349727511470680972

c = 96830301447792999743877932210925094490214669785432172099311147672020980136112114653571739648595225131425493319224428213036136642899189859618195566355934768513439007527385261977662612094503054618556883356183687422846428828606638722387070581

e = 65537

# p_list: 这个列表包含了 n 的质因子(p),这些质因子是对 n 的分解。对于RSA算法,n 通常是两个大质数 p 和 q 的乘积,但这里 n 被分解成了多个质数的乘积
p_list = [2, 2, 3, 3, 13, 101, 443, 1087, 15527, 47363, 111309491243, 5738160242986813,
          118881536167887307517887651928306109231371669715927208908931577713837,
          2067526976195544603847619621425435706797374170280528431947550231604621041865531599319428120598265860512130517815755608596553793]

# 思路:
#    如果 n 是多个不同质数的乘积(即 n = p1 * p2 * ... * pk),则有 φ(n) = (p1 - 1) * (p2 - 1) * ... * (pk -
#    代码通过循环 for p in p_list,逐个处理 p_list 中的质因子 p
#    对每一个质因子 p,计算 p-1,并乘到 phi_n 上。最终 phi_n 将是所有 (p-1) 的乘积
phi_n = 1

for p in p_list:
    phi_n *= (p - 1)

# 计算出 phi_n 后,代码使用 gmpy2.invert(e, phi_n) 计算私钥 d,这一步是根据RSA的逆元性质,即 d 是 e 在模 φ(n) 意义下的逆元
d = gmpy2.invert(e, phi_n)

# 使用私钥 d 进行解密 m = pow(c, d, n),并将结果转为字节格式得到 flag
m = pow(c, d, n)

flag = libnum.n2s(int(m))

print(flag)

拿到 flag 

四、11 月 11 日是个好日子

打开靶场

打开文件

题目:11月11日是个好日子

alp= slbn7q6u0w2pf3m9tzjx8o51yke????dhc4i

cipher:6MBphWqgEun4VXNkcKbdaVDNrpw3714BigGaiwKKC7z7KJ6MxkHYf4G4dFsKWU78VgmHgsEJdKwPCb3j495tg4FUAd5hkRxzmGEiggRWye9k8ddd3P5CXdEgRgqgjxgw48pPPBdM7oB14z4WPEmFqFcPvKXwbE5bzFVDCESnyaB3Z47

so where is the flag?

hint:不 会 吧 ? 就 这 ¿ 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 就 这 ¿ 就 这 ¿ 就 这 ¿ 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 就 这 ¿ 就 这 ¿ 不 会 吧 ? 就 这 ¿ 就 这 ¿ 就 这 ¿ 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 不 会 吧 ? 就 这 ¿ 就 这 ¿ 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 不 会 吧 ? 不 会 吧 ? 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 就 这 ¿ 就 这 ¿ 就 这 ¿ 就 这 ¿ 就 这 ¿ 就 这 ¿ 就 这 ¿ 不 会 吧 ? 不 会 吧 ? 不 会 吧 ? 不 会 吧 ? 不 会 吧 ? 不 会 吧 ? 不 会 吧 ? 不 会 吧 ? 不 会 吧 ? 不 会 吧 ? 不 会 吧 ? 就 这 ¿ 就 这 ¿ 就 这 ¿ 就 这 ¿ 不 会 吧 ? 不 会 吧 ? 就 这 ¿ 就 这 ¿ 就 这 ¿ 就 这 ¿ 不 会 吧 ? 不 会 吧 ? 就 这 ¿ 就 这 ¿ 就 这 ¿ 就 这 ¿ 不 会 吧 ? 就 这 ¿ 就 这 ¿ 不 会 吧 ? 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 不 会 吧 ? 就 这 ¿ 就 这 ¿ 就 这 ¿ 就 这 ¿ 不 会 吧 ? 不 会 吧 ? 不 会 吧 ? 就 这 ¿ 就 这 ¿ 就 这 ¿ 就 这 ¿ 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 就 这 ¿ 就 这 ¿ 不 会 吧 ? 不 会 吧 ? 不 会 吧 ? 不 会 吧 ? 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 不 会 吧 ? 不 会 吧 ? 就 这 ¿ 就 这 ¿ 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 就 这 ¿ 就 这 ¿ 就 这 ¿ 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 不 会 吧 ? 就 这 ¿ 就 这 ¿ 不 会 吧 ? 不 会 吧 ? 不 会 吧 ? 就 这 ¿ 就 这 ¿ 就 这 ¿ 就 这 ¿ 就 这 ¿ 就 这 ¿ 就 这 ¿ 就 这 ¿ 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 就 这 ¿ 就 这 ¿ 就 这 ¿ 就 这 ¿ 就 这 ¿ 就 这 ¿ 不 会 吧 ? 不 会 吧 ? 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 就 这 ¿ 就 这 ¿ 不 会 吧 ? 不 会 吧 ? 不 会 吧 ? 就 这 ¿ 就 这 ¿ 就 这 ¿ 就 这 ¿ 就 这 ¿ 就 这 ¿ 就 这 ¿ 就 这 ¿ 就 这 ¿ 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 不 会 吧 ? 就 这 ¿ 就 这 ¿ 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 不 会 吧 ? 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 就 这 ¿ 就 这 ¿ 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 就 这 ¿ 就 这 ¿ 就 这 ¿ 不 会 吧 ? 不 会 吧 ? 不 会 吧 ? 不 会 吧 ? 不 会 吧 ? 不 会 吧 ? 不 会 吧 ? 不 会 吧 ? 不 会 吧 ? 就 这 ¿ 就 这 ¿ 就 这 ¿ 就 这 ¿ 不 会 吧 ? 不 会 吧 ? 就 这 ¿ 就 这 ¿ 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 不 会 吧 ? 就 这 ¿ 就 这 ¿ 不 会 吧 ? 不 会 吧 ? 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 就 这 ¿ 就 这 ¿ 就 这 ¿ 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 不 会 吧 ? 就 这 ¿ 就 这 ¿ 就 这 ¿ 就 这 ¿ 不 会 吧 ? 就 这 ¿ 就 这 ¿ 就 这 ¿ 就 这 ¿ 不 会 吧 ? 不 会 吧 ? 不 会 吧 ? 不 会 吧 ? 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 不 会 吧 ? 就 这 ¿ 就 这 ¿ 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 不 会 吧 ? 不 会 吧 ? 就 这 ¿ 就 这 ¿ 就 这 ¿ 就 这 ¿ 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 不 会 吧 ? 不 会 吧 ? 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 就 这 ¿ 不 会 吧 ? 就 这 ¿ 就 这 ¿ 不 会 吧 ? 不 会 吧 ? 不 会 吧 ? 就 这 ¿ 就 这 ¿ 不 会 吧 ? 不 会 吧 ? 就 这 ¿ 

先解码提示 ,阴阳怪气编码 

看提示应该是要先破解掉密码,使用工具随波逐流一键解码

继续解

最后得到 

en,i5d8{unw_ad1_f2_pg_8gea}

alp 里面有一个特色就是字母和数字都没有重复且长度为36位,但是这个 alp 缺失了四个字母 a,g,v,r,推测为仿射密码,所以我们用这四个全排列替换 alp 中的 ? 再拿去解密

# 这段代码的目的是解密使用仿射密码加密的文本。仿射密码是一种经典的替换密码,它通过一个线性方程对字母进行映射。具体来说,仿射密码的加密公式是:
#           E(x) = (ax + b) mod n
# 其中:
#       x 是明文中的字母对应的数字位置。
#       a 和 b 是密钥
#       n 是字母表的大小
#       E(x) 是密文中对应位置的字母

# 要解密仿射密码,需要使用解密公式:
#       D(y) = a 的 -1 次方 * (y−b) mod n
# 其中:
#       y 是密文中的字母对应的数字位置
#       a 的 -1 次方 是模 n 意义下 a 的逆元

import primefac
from itertools import *

# 解密思路:
#       仿射密码的解密基于找到加密过程中使用的线性变换的逆变换。这需要计算加密参数 a 的模逆 ai
#       对于每个加密字符,通过逆变换找到其在原始字符集中对应的索引,然后取出对应的原始字符
#       如果字符不在字符集中,可能是由于它在加密文本中没有被转换,或者是由于它在加密过程中保持不变

# affine_decode 函数:
#       c: 密文字符串
#       a: 加密的第一个参数,用于加密的乘法部分
#       b: 加密的第二个参数,用于加密的平移部分
#       origin: 字母表,表示加密和解密时使用的字符集
def affine_decode(c, a, b, origin="abcdefghijklmnopqrstuvwxyz0123456789+="):
    r = ""

    # n = len(origin): 计算字母表的大小
    n = len(origin)

    # 使用 primefac.modinv 函数计算了 a 在模 n 下的模逆,其中 n 是字符集的大小。模逆意味着 ai 满足 (a * ai) % n = 1
    # 然后 ai 与 n 取模,确保结果在正确的范围内,即使得 ai 是 a 在模 n 意义下的逆元素
    ai = primefac.modinv(a, n) % n

    for i in c:
        # origin.find(i) 检查字符 i 是否在字符集 origin 中。如果字符存在,find 函数返回非 -1 的索引值
        if origin.find(i) != -1:
            # 首先,找到字符 i 在字符集 origin 中的索引
            # 然后,使用仿射密码的解密公式计算原始索引:(ai * (index - b)) % len(origin)
            # 将计算得到的索引对字符集长度 len(origin) 取模,以确保索引在有效范围内
            # 最后,使用这个索引从字符集 origin 中取出解密后的字符,并将其添加到解密字符串 r
            r += origin[(ai*(origin.index(i)-b)) % len(origin)]
        else:
            # 如果字符 i 不在字符集中(例如,可能是标点符号或特殊字符),它将不会被解密,而是直接添加到解密字符串 r
            r += i

    return r


# permutations 函数用于生成给定字符串的所有可能排列
# 生成 “agvr” 的所有长度为 4 的排列(例如:agvr、gvar…………)
for i in permutations("agvr", 4):
    # 结合题目的双 11 来传递密钥
    print(affine_decode("en,i5d8{unw_ad1_f2_pg_8gea}", 11, 11, origin="slbn7q6u0w2pf3m9tzjx8o51yke"+i[0]+i[1]+i[2]+i[3]+"dhc4i"))

破解出 flag 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Suc2es2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值