生日攻击及CTF例子

InstructionInstructionInstruction

以生日悖论为基础的生日攻击,实际上是碰撞攻击的一种,其主要思想就是在一个随机集合中找到两个相同点(给定一个点的大小找是否有另一个点)的概率一般来说很大(有一个近似计算公式),以此概率来判断是否遍历爆破整个集合找出两个相同点(概率很大的情况下,很可能不止两个点相同)

近似计算公式
P=1−e−n(n−1)2NP= 1- e^{-\frac{n(n-1)}{2N}} P=1−e−2Nn(n−1)​
其中PPP是指存在两个相同点的概率,对应的,e−n(n−1)2Ne^{-\frac{n(n-1)}{2N}}e−2Nn(n−1)​即是整个集合中不存在两个相同点的概率;nnn是指该随机集合目前实际的总个数,NNN是指在该随机情况的条件下最多有NNN种不同的可能

生日攻击一般都用作哈希碰撞,构造彩虹表等等,这里我们用浅显的生日悖论的原理来在给定一个点的情况下,来判断是否可以找到一个随机集合中另一个相同点

ExampleExampleExample

ProblemProblemProblem

来源于:第五空间CTF 2022 vgcd

from random import getrandbits, seed
from Crypto.Util.number import getPrime, inverse, bytes_to_long, isPrime
from os import urandom
from secret import flagdef sample(rho, eta, gamma, p):seed(urandom(8))return p * getrandbits(gamma - eta) + getrandbits(rho)def gen_vector(rho, eta, gamma, m, p, K):v = vector([sample(rho, eta, gamma, p) for i in range(m)])return K*v rho = 6
m = 3
eta = 288
gamma = 512
p = getPrime(gamma)
q = getPrime(gamma)
n = p * q
e = 65537
phi = (p - 1) * (q - 1)
c = pow(bytes_to_long(flag), e, n)
print(n)
print(c)pp = p >> (gamma - eta)
assert isPrime(pp)
K = Matrix.random(Integers(pp), m, m).lift()
t1 = [gen_vector(rho, eta, gamma, m, pp, K) for i in range(1024)]
print(t1)
for i in range(6):t2 = [gen_vector(rho, eta, gamma, m, pp, K) for i in range(512)]print(t2)

AnalysisAnalysisAnalysis

题目关键是找到pp,而围绕pp题目生成了一大堆由随机数作为基底的数(但是这里不能用随机数内置的算法逆向求解,因为每次生成几个随机数都会重新设置seed

我们把打印出来的t1, t2的生成过程(这两个列表的生成过程是一样的)用数学符号表达出来
K⋅V=(k0k1k2k3k4k5k6k7k8)(v0v1v2)=(k0v0+k1v1+k2v2k3v0+k4v1+k5v2k6v0+k7v1+k8v2)\begin{array}{ll}\pmb{K}\cdot \pmb{V} &= \begin{pmatrix} k_0 \qquad k_1 \qquad k_2 \\ k_3 \qquad k_4 \qquad k_5\\ k_6 \qquad k_7 \qquad k_8 \end{pmatrix} \begin{pmatrix} v_0 \quad v_1 \quad v_2 \end{pmatrix} \\ &= \begin{pmatrix} k_0v_0 + k_1v_1 +k_2v_2\qquad k_3v_0+k_4v_1+k_5v_2 \qquad k_6v_0+k_7v_1+k_8v_2 \end{pmatrix} \end{array} KK⋅VV​=⎝⎛​k0​k1​k2​k3​k4​k5​k6​k7​k8​​⎠⎞​(v0​v1​v2​​)=(k0​v0​+k1​v1​+k2​v2​k3​v0​+k4​v1​+k5​v2​k6​v0​+k7​v1​+k8​v2​​)​

这里的K,V\pmb{K,V}K,VK,V分别是矩阵和向量,这里进行的并不是矩阵乘法,当前类型的矩阵和向量左乘后得到的就是如上表达式

其中K\pmb{K}KK在有所有的t1, t2中的生成过程是一样的,而V\pmb{V}VV是在随机生成的;

我们仔细查看V\pmb{V}VV的生成过程(由于随机数生成大小的参数是给定了的,这里直接用数值表示随机数大小)

V=(v0v1v2)=(pp⋅r224+r6pp⋅r224′+r6′pp⋅r224′′+r6′′)\pmb{V} = \begin{pmatrix} v_0 & v_1 & v_2 \end{pmatrix} =\begin{pmatrix} pp \cdot r_{224} + r_6 \qquad pp \cdot r'_{224} + r'_6 \qquad pp \cdot r''_{224} + r''_6 \end{pmatrix} VV=(v0​​v1​​v2​​)=(pp⋅r224​+r6​pp⋅r224′​+r6′​pp⋅r224′′​+r6′′​​)

其中rir_iri​表示 iii bits大小的随机数,将V\pmb{V}VV的表达式代入K⋅V\pmb{K}\cdot \pmb{V}KK⋅VV 中

K⋅V=(k0(pp⋅r224+r6)+k1(pp⋅r224′+r6′)+k2(pp⋅r224′′+r6′′)⋯⋯)\pmb{K}\cdot \pmb{V}= \begin{pmatrix} &k_0(pp \cdot r_{224} + r_6) + k_1(pp \cdot r'_{224} + r'_6) +k_2( pp \cdot r''_{224} + r''_6) \qquad \cdots \qquad \cdots& \end{pmatrix} KK⋅VV=(​k0​(pp⋅r224​+r6​)+k1​(pp⋅r224′​+r6′​)+k2​(pp⋅r224′′​+r6′′​)⋯⋯​​)
单独看第一项
k0(pp⋅r224+r6)+k1(pp⋅r224′+r6′)+k2(pp⋅r224′′+r6′′)=(k0⋅r224+k1⋅r224′+k2⋅r224′′)⋅pp+(k0r6+k1r6′+k2r6′′)k_0(pp \cdot r_{224} + r_6) + k_1(pp \cdot r'_{224} + r'_6) +k_2( pp \cdot r''_{224} + r''_6) \qquad \\ = (k_0\cdot r_{224} + k_1 \cdot r'_{224} + k_2 \cdot r''_{224})\cdot pp + (k_0r_6+k_1r'_6+k_2r''_6) k0​(pp⋅r224​+r6​)+k1​(pp⋅r224′​+r6′​)+k2​(pp⋅r224′′​+r6′′​)=(k0​⋅r224​+k1​⋅r224′​+k2​⋅r224′′​)⋅pp+(k0​r6​+k1​r6′​+k2​r6′′​)
此时我们就可以应用生日攻击的思想了,单独看上式的 (k0r6+k1r6′+k2r6′′)(k_0r_6+k_1r'_6+k_2r''_6)(k0​r6​+k1​r6′​+k2​r6′′​) ,如果我们能在t1, t2的所有输出中找到两个相同的r6,r6′,r6′′r_6, r'_6, r''_6r6​,r6′​,r6′′​,那么我们就可以将两者相减,得到一个这样的表达式 x⋅ppx\cdot ppx⋅pp ,同时,使用相同的 r6,r6′,r6′′r_6, r'_6, r''_6r6​,r6′​,r6′′​ 总共有三组(K⋅V\pmb{K}\cdot \pmb{V}KK⋅VV ),每组之间相减都可以得到表达式x′⋅ppx'\cdot ppx′⋅pp,将三组之间的相减结果取最大公因数即可得到pppppp (很大概率 pppppp 应该是 x⋅ppx\cdot ppx⋅pp 中最大的素因子)

实际寻找相同的r6,r6′,r6′′r_6, r'_6, r''_6r6​,r6′​,r6′′​过程中,当然是先确定一个t1, t2的结果,再遍历剩余的t1, t2中的每一个结果

t1, t2总共有4096组结果,每组结果中有三项数值,我们来计算一下生日攻击的成功概率

r6,r6′,r6′′r_6, r'_6, r''_6r6​,r6′​,r6′′​的所有可能应该有2182^{18}218种,而当前的结果有4096种;相当于N=218,n=4096N = 2^{18},n = 4096N=218,n=4096 ,代入生日攻击概率的近似计算公式
P=1−e−4096(4096−1)2⋅218=1−1.2763491830534272e−14\begin{array}{ll} P &= 1 - e^{-\frac{4096(4096-1)}{2\cdot 2^{18}}}\\ &=1 - 1.2763491830534272e^{-14} \end{array} P​=1−e−2⋅2184096(4096−1)​=1−1.2763491830534272e−14​

sage: float(e^(-(4096*(4096-1)) / (2^19)))
1.2763491830534272e-14

所以几乎是百分百会有碰撞情况发生

得到 pppppp 之后,将其按照高位攻击的思路恢复原始的 ppp 即可,具体使用small_roots 函数的一种方法可以看 (10条消息) 2022 川渝网安比赛_初赛Crypto复现_M3ng@L的博客-CSDN博客 里的一道例题

SolutionSolutionSolution

# type:ignore
from Crypto.Util.number import *
from tqdm import trange
import gmpy2with open("output3.txt") as f:input = [line.strip() for line in f.readlines()]
n = int(input[0])
c = int(input[1])
cipher = []
for i in input[2:]:for j in eval(i):cipher.append(j)
# print(len(cipher))# for i in trange(len(cipher)):
#     for j in range(i, len(cipher)):
#         temp = [cipher[i][k] - cipher[j][k] for k in range(3)]
#         gcd = [gmpy2.gcd(temp[0], temp[1]), gmpy2.gcd(temp[0], temp[2]), gmpy2.gcd(temp[1], temp[2])]
#         for k in gcd:
#             if k.bit_length() == 288:
#                 print(k)
# 356748247030693416847133214972226346960895831956739561317797640603898384278276333472137
pp = 356748247030693416847133214972226346960895831956739561317797640603898384278276333472137
eta = 288
gamma = 512
e = 0x10001
R.<x> = PolynomialRing(Zmod(n))
f = (pp << (gamma - eta)) + x
p = int((pp << (gamma - eta)) + f.small_roots(beta=0.49, epsilon=0.02)[0])
assert n % p == 0
q = n // p
phi = (p-1) * (q-1)
d = gmpy2.invert(e, phi)
m = pow(c, d, n)
print(long_to_bytes(m).decode())

ReferenceReferenceReference

(10条消息) 【2022 第五空间】5_vgcd WriteUP_Mr_AgNO3的博客-CSDN博客

生日攻击及CTF例子相关推荐

  1. hackbar 使用教程_〖教程〗K8飞刀-网络安全CTF解题Web篇10个例子

    [教程]K8飞刀-网络安全CTF解题Web篇10个例子 前段时间有人和我说什么时候有空出些CTF用的工具,实际上CTF考查的内容,实战中用到的很多工具都可以使用,关键在于你懂不懂用.也看到有人搜索如何 ...

  2. switchyomega插件_CTF|你所关注的CTFer都在用的插件合集【附:XXE补给+CTF训练集】...

    不看后悔系列,建议收藏 相信大家对 CTF 都不陌生了,今天为大家带来了一系列 CTF 必备 Chrome 插件. CTF 可能很多人想学 CTF,但又怕零基础学不懂.其实,CTF 并没有那么难. C ...

  3. ctf的php,CTF中常见的PHP漏洞

    1.MD5()漏洞 php在处理字符串时会利用!=,||,==进行hash值的比较 他把每一个"0E'开头的哈希值都解释为0,因此如果两个不同的密码经过hash处理之后都是以'0e'开头,那 ...

  4. PHP ctf addslashes,[红日安全]代码审计Day13 - 特定场合下addslashes函数的绕过

    本文由红日安全成员: l1nk3r 编写,如有不当,还望斧正. 前言 大家好,我们是红日安全-代码审计小组.最近我们小组正在做一个PHP代码审计的项目,供大家学习交流,我们给这个项目起了一个名字叫 P ...

  5. Zer0pts CTF 2020的web赛后记录+复现环境

    前言 打了Zer0pts CTF 2020感觉题目不错就总结一下. 复现环境地址: https://gitlab.com/zer0pts/zer0pts-ctf-2020/ 0x01 notepad ...

  6. 关于CTF中脚本的编写及使用。ISCC之Retrieve the passcode

    前言 声明:本人纯小白无任何经验.以下纯属个人见解不代表任何组织. 前几天打了下CTF(红帽杯)的线上赛,不得不说,高手云集.我也是真的菜,签到即退场.第二天去做ISCC的练武题在做杂项的时候发现一些 ...

  7. CTF php反序列化总结

    前言:本⼈⽔平不⾼,只能做⼀些类似收集总结这样的⼯作,本篇文章是我自己在学php反序列化写的一篇姿势收集与总结,有不对的地方欢迎师傅们批评指正~ php反序列化 定义:序列化就是将对象转换成字符串.反 ...

  8. ctf 命令执行总结

    命令执行绕过总结 linux系统查看文件命令 more 一页一页的显示文件内容 less 和more类似 head 只显示头几行 tail 只显示最后几行 nl 显示时还输出行号 tailf cat ...

  9. CTF竞赛实战 中国菜刀与一句话木马

    一.基本操作: 往目标CTF提供的网站中加入一句话木马,然后你就可以在本地通过中国菜刀chopper.exe即可获取和控制整个网站目录,从而获取Flag,首先需要明确的是,中国菜刀本身是一个病毒,会被 ...

最新文章

  1. 重载和覆盖的区别?(overload vs override)
  2. Java笔记(持续更新中)
  3. mysql索引 钱缀_【mysql索引】之前缀索引-Go语言中文社区
  4. str 类常用的函数
  5. X210串口配置与stdio移植
  6. python 删除csv第一行_python 标准库学习之 csv
  7. JVM整体架构与调优参数说明
  8. iOS学习笔记03-UITableView
  9. 如何在 Mac 上的“通知中心”中添加和自定小组件?
  10. zepto 清除html,Zepto的使用
  11. 【MATLAB深度学习工具箱】学习笔记--字符识别Character Recognition
  12. 人行地区代码一览表_全国各地区代码.
  13. DayDayUp:计算机技术与软件专业技术资格证书之《系统集成项目管理工程师》证书考试历年真题及其解析之2019年/2020年
  14. flowplayer设置视频logo
  15. 雷达原理笔记之LFMCW雷达测距测速原理
  16. 深圳金证股份面试的经历
  17. 免费天气预报API接口
  18. 解决Linux 负载过高问题过程记录
  19. 2013年上海市居住证新政策解读
  20. Control Egress TCP Traffic

热门文章

  1. python数据分析基础之Numpy库详解(一)
  2. 解缺芯之困 以工匠之心静待花开
  3. “延禧配色”是怎么调出来的?调色总监亲自教你!
  4. Oracle11g本地数据库创建用户和密码,附赠使用PL/SQL软件登录用户
  5. 模拟电子技术 --二极管
  6. Jupyter 安装并配置工作路径
  7. 韩寒代言 一加手机3”盲售“手机行业的创新开创者 一加手机3
  8. 第一次电赛体会-2019年国赛
  9. python数组赋值_基本Numpy数组值赋值
  10. sqlite源码剖析(一)