攻防世界GFSJ1195 DDH_Game

题目编号:GFSJ1195

附件下载后是一个txt文件和一个sage文件(python):

1. 分析代码(.sage文件),已添加详细注释

# 从 secret 模块导入 flag 变量
from secret import flag
from Crypto.Util.number import bytes_to_long
from Crypto.Util.number import getRandomRange

# 确保 flag 符合特定格式,以 'CatCTF{' 开头并以 '}' 结尾
assert flag.startswith(b'CatCTF{')
assert flag.endswith(b'}')

# 定义使用自定义生成元 G 的 BLS-12-381 椭圆曲线
# p 是素数,定义了有限域 GF(p)
p = 0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab
K = GF(p)  # 定义有限域 GF(p)
a = K(0x00)  # 椭圆曲线的参数 a
b = K(0x04)  # 椭圆曲线的参数 b
E = EllipticCurve(K, (a, b))  # 使用参数 a 和 b 定义椭圆曲线 E
# 设置椭圆曲线的阶(曲线上的点的总数)
E.set_order(0x73EDA753299D7D483339D80809A1D80553BDA402FFFE5BFEFFFFFFFF00000001 * 0x396C8C005555E1568C00AAAB0000AAAB)

# 定义生成元 G 的坐标
G = E(
    3745324820672390389968901155878445437664963280229755729082200523555105705468830220374025474630687037635107257976475,
    2578846078515277795052385204310204126349387494123866919108681393764788346607753607675088305233984015170544920715533
)
n = G.order()  # 生成元 G 的阶

# 定义曲线的嵌入度 k = 12
k = 12

# 将 flag(去掉前后标识部分)转为整数 m
m = Integer(bytes_to_long(flag[7:-1]))
# 获取 m 的位序列表示,用于生成 Diffie-Hellman 问题实例
sols = m.bits()

# 定义一个列表来存储 Diffie-Hellman 问题实例
DDH_instances = []

# 遍历位序列,生成 DDH 问题实例
for i in range(len(sols)):
    a = getRandomRange(1, n)  # 随机生成 a
    b = getRandomRange(1, n)  # 随机生成 b
    c = 0  # 初始化 c
    
    # 如果 sols[i] 为 True,将 c 设置为 a*b mod n
    if sols[i] == True:
        c = a * b % n
    # 如果 sols[i] 为 False,将 c 设置为随机数,并确保 a*b*G ≠ c*G
    elif sols[i] == False:
        c = getRandomRange(1, n)
        assert a * b * G != c * G  # 验证生成的 (a, b, c) 满足非等式

    # 将 (a*G, b*G, c*G) 的坐标对添加到 DDH 实例列表中
    ins = ((a * G).xy(), (b * G).xy(), (c * G).xy())
    DDH_instances.append(ins)

# 将生成的 DDH 实例写入文件 'DDH_instances.txt'
with open('DDH_instances.txt', 'w') as f:
    f.write(str(DDH_instances))

2. 通过阅读源码及DDH的提示,求解椭圆曲线离散对数问题(ECDLP)

两个方案解决:

  • 方案1:基于配对的方式,通过 Tate 配对计算点的相等性来验证每个实例。对 DDH 实例中的点进行 Tate 配对比较,如果配对结果相等,说明满足条件,输出为1,否则为0。
  • 方案2:使用 Pohlig-Hellman 离散对数算法,通过计算每个点相对于生成元的离散对数,然后利用这些对数的乘积关系判断比特值。这种方式更依赖于离散对数计算,且适用于因数分解已知的阶数。

3. 方案1(Tate 配对)代码:

# 使用 SageMath 9.5
from Crypto.Util.number import long_to_bytes  # 从 Crypto 库导入 long_to_bytes 函数,用于将长整数转换为字节形式

# 在运行前,修改文件名,并在文件开头添加 "DDH_instances = " ,以便加载 DDH 实例数据
load('../GFSJ/GFSJ1195/DDH_instances.sage')  # 加载包含 DDH 实例的文件

# 定义椭圆曲线参数
p = 0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab  # 大素数 p,用于有限域 GF(p)
K = GF(p)  # 定义有限域 GF(p)
a = K(0x00)  # 椭圆曲线的参数 a
b = K(0x04)  # 椭圆曲线的参数 b
E = EllipticCurve(K, (a, b))  # 定义椭圆曲线 E,使用有限域 K 和参数 (a, b)

# 设置椭圆曲线的阶(曲线上所有点的数量)
E.set_order(0x73EDA753299D7D483339D80809A1D80553BDA402FFFE5BFEFFFFFFFF00000001 * 0x396C8C005555E1568C00AAAB0000AAAB)

# 定义生成元 G 的坐标
G = E(
    37453248206723903899689011558784454376649632802297
### CTFNO.GFSJ0732 错误代码解释与解决方案 对于编号为CTFNO.GFSJ0732的任务,虽然具体描述未直接提供,但从相似案例和其他CTF挑战中可推测该任务可能涉及Web应用安全测试中的特定漏洞利用或解谜环节。 #### 一、错误代码分析 通常情况下,在CTF竞赛场景下,“错误代码”并非传统意义上的编程语言报错信息,而是指参赛者遇到的技术难题或是目标系统给出的异常反馈。针对GFSJ系列题目,常见的“错误代码”形式包括但不限于: - 页面返回非预期状态码(如HTTP 403 Forbidden) - 表单验证失败后的提示消息 - SQL注入尝试时数据库抛出的语法错误 - 文件上传限制导致的操作拒绝通知 这些都可能是解决CTFNO.GFSJ0732过程中会碰到的情况[^1]。 #### 二、潜在原因探讨 基于以往经验,此类问题的发生往往源于以下几个方面: - **权限控制不当**:服务器端未能正确设置资源访问权限,使得某些路径可以直接通过URL访问而无需身份认证。 - **输入校验缺失**:应用程序缺乏有效的参数过滤机制,允许恶意构造的数据绕过前端检查直达后台逻辑层。 - **隐藏功能暴露**:开发者为了调试方便留下的备用接口未及时删除,成为攻击面的一部分。 以上情况均可能导致参与者无法按常规方法完成指定动作,进而触发所谓的“错误代码”。 #### 三、通用解决方案建议 面对上述提到的各种可能性,推荐采取以下措施逐一排查并解决问题: ```bash # 使用curl命令模拟不同类型的HTTP请求 $ curl -X GET "http://example.com/target?param=value" $ curl -X POST -d 'data' http://example.com/post_target ``` - 尝试调整浏览器开发者工具(F12)中的Request Headers部分,修改User-Agent字符串或其他头部信息以规避简单的防护策略; - 利用Burp Suite等中间件拦截并篡改实际发出的HTTP(S)流量,特别是注意观察响应体内的细微差异; - 对于疑似存在文件包含漏洞的情形,则应重点审查.php,.jsp等动态脚本结尾处是否存在可控变量; 最后提醒一点,当涉及到真实环境时务必遵循合法合规原则开展渗透测试活动,切勿滥用所学技能危害他人利益。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

铭记北宸

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

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

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

打赏作者

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

抵扣说明:

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

余额充值