首页
社区
课程
招聘
[原创][推荐][原创] 2021 KCTF 秋季赛 防守方提交题目
2021-10-7 11:36 7171

[原创][推荐][原创] 2021 KCTF 秋季赛 防守方提交题目

2021-10-7 11:36
7171

题目设计说明

  1. 使用魔改的md5确保序列号唯一
  2. Groebner basis 攻击简单 feistal 结构的加密算法
  3. 题目使用的运算是在GF(2^64)上。使用的minimal polynomial 是 x^64 + x^33 + x^30 + x^26 + x^25 + x^24 + x^23 + x^22 + x^21 + x^20 + x^18 + x^13 + x^12 + x^11 + x^10 + x^7 + x^5 + x^4 + x^2 + x + 1。
  4. feistal 结构:以下代码是均是 GF(2^64)上的运算。密钥为2个GF(2^64)上的元素,明文为2个 GF(2^64)上元素。如果轮数为n那么就会有n个轮数的常数参与运算。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def pure_block_cipher_encrypt(p: list, k: list, round_n: int, constant_c: list):
    assert len(p) == 2
    assert len(k) == 2
    pl = p[0]
    pr = p[1]
    tmpl = pl
    tmpr = pr
    for i in range(round_n):
        tmpl, tmpr = pure_block_cipher_enc_round(tmpl, tmpr, k[i % 2], constant_c[i])
    return tmpl, tmpr
 
def pure_block_cipher_enc_round(xl, xr, ki, ci):
    yl = xr
    yr = xl + (xr + ki + ci)^3
    return (yl, yr)

破解思路

  1. 我喜欢很存粹的题目,不是靠大量的逆向量卡倒对手。所以没有使用任何的反调试、混淆手段。参与比赛就是为了和大lao交流。
  2. 逆向出该block cipher结构后就是列GF(2^64)上的多变量方程组。多变量方程组是一个比较难的问题,所以使用Groebner basis先优化一下,就能分离出单变量多项式,就能求解密钥。
  3. 需要使用 sagemath。
  4. 求出密钥后使用逆sbox就能求出输入。
  5. 第一次参加kctf防守方,希望被选中。

攻击脚本参见攻击脚本目录下的 ipynb

  • 需要 sagemath

flag / SN

de23f9d82798377ea01743d43d5353cd


[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

最后于 2021-12-15 13:05 被kanxue编辑 ,原因:
上传的附件:
收藏
点赞3
打赏
分享
最新回复 (1)
雪    币: 32410
活跃值: (18725)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
kanxue 8 2021-11-9 10:13
2
0
题目收到
游客
登录 | 注册 方可回帖
返回