ooo-flag-sharing

阅读题目,我们发现这是一个密钥分享的密码系统。题目使用100*5的矩阵A对填充为5*1明文向量C(向量第一个数是明文)加密得到100*1的向量B。在系统中保存部分向量数据b1,b2……,并将剩下的向量数据b3,b4……分发。当我们和系统由于5个向量数据b1,b2,b3,b4,b5。我们就可以将A中对应向量行组合成一个新矩阵,并求得逆矩阵。我们将的第一行(s1,s2,s3,s4,s5)和密文向量(b1,b2,b3,b4,b5)相乘即为明文。即m=s1*b1+s2*b2+s3*b3+s4*b4+s5*b5。在redeem_actual_flag中系统中有两个向量B的数据bn,bm。和用户发送3个向量B的数据组合解密。我们可以将b5更改为b5+a*s5^-1。这时我们发现解密结果变为m+a。已知m的最低为是OOO{,并且在redeem_actual_flag()中进行检验flag的头部是OOO{。由于整个操作在模p之下,所以我们尝试改变a,且不改变m的低位“OOO{"。当m+a>=p的时候。我们发现解密的结果结尾不再是OOO{。当m+a<p的时候,我们发现解密的结果结尾是OOO{。这时我们找到临界值a,计算p-a获得m。

首先我们首先使用share_actual_flag()获得一组密文[(numi,bnumi),(numj,bnumj),(numk,bnumk)]

这里我们发现在上述方案中我们需要知道p。我们首先在相同的flagid下输入密文[(0,1),(1,0),(2,0),(3,0),(4,0)]。我们可以得到s1。然后我们更改密文为[(0,2),(1,0),(2,0),(3,0),(4,0)]……[(0,n),(1,0),(2,0),(3,0),(4,0)]。获得a*s1。当我们发现a*s1>a*s1mopp。我们相减获得p。

其次我们需要知道s5^-1是多少。我们可以尝试输入向量(0,0,0,0,1)从而获得s5,继而获得s5^-1。我们需要知道在redeem_actual_flag()中系统中存储的bn和bm具体是对应哪一行。所以我们需要进行爆破。不断输入密文[(i,0),(j,0),(numi,0),(numj,0),(numk,1)]解出a5,再计算a5^-1。我们将b5改为b5+(1<<32)*s5^-1。当验证成功时。说明我们爆破成功,已经获得a5^-1。我们再按照上面的方案求解处flag

#!/usr/bin/env python3
import ast
import copy
from pwn import *
from Crypto.Util.number import *r = remote('ooo-flag-sharing.challenges.ooo', 5000)
#r = remote('127.0.0.1', 20000)name = 'hahaha'
r.sendlineafter('Username: ', name)def redeem(secret_id, shares):r.sendlineafter('Choice: ', '2')r.sendlineafter("Enter the secret's ID: ", secret_id)r.sendlineafter("Enter your shares of the secret: ", str(shares))r.recvuntil("Your secret is: ")secret = r.recvline().strip()return int.from_bytes(eval(secret), 'little')def store_flag():r.sendlineafter('Choice: ', '3')r.recvuntil("Our secret's ID is: ")secret_id = r.recvline().strip().decode()r.recvuntil("Your shares are: ")shares = ast.literal_eval(r.recvline().strip().decode())return secret_id, sharesdef redeem_flag(secret_id, shares):r.sendlineafter('Choice: ', '4')r.sendlineafter("Enter the secret's ID: ", secret_id)r.sendlineafter("Enter your shares of the secret: ", str(shares))return r.recvline().startswith(b'Congrats')secret_id, shares = store_flag()
a = redeem(secret_id, [(0, 1)] + [(i, 0) for i in range(1, 5)])now = 1
while True:now += 1aa = redeem(secret_id, [(0, now)] + [(i, 0) for i in range(1, 5)])P = a * now - aaif P > 0:print(f'P = {P}')breakshares = sorted(shares)for i in range(1, 100):for j in range(i + 1, 100):if i in [shares[x][0] for x in range(3)] or j in [shares[x][0] for x in range(3)]:continueprint(i, j)fake_shares = sorted([(s[0], 1 if s == shares[-1] else 0) for s in shares] + [(i, 0), (j, 0)])a = redeem(secret_id, fake_shares)ai = inverse(a, P)fail = Falsefor k in range(1, 3):newshares = copy.deepcopy(shares)newshares[2] = (newshares[2][0], (newshares[2][1] + ai * (k << 32)) % P)valid = redeem_flag(secret_id, newshares)if not valid:fail = Truebreakif not fail:L = 0H = P >> 32while L != H:print(((P >> 32) - L).to_bytes(32, 'little'))print(((P >> 32) - H).to_bytes(32, 'little'))M = (L + H) >> 1newshares = copy.deepcopy(shares)newshares[2] = (newshares[2][0], (newshares[2][1] + ai * (M << 32)) % P)valid = redeem_flag(secret_id, newshares)if valid:L = M + 1else:H = Mexit()

coooppersmith

对文件逆向,我们发现这是一个RSA加密。首先需要我们输入一个120位的数字。之后系统在我们的数字后加8位并将其更改为一个素数。然后借助该素数生成RSA的私钥和公钥。当公钥中的n小于消息长度的时候将会报错。所以我们需要输入一个尽量小的数字。既保证运算的简单。有保证可以对消息进行加密。这里我们尝试输入数字000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000。系统将会在[0,0x10000]中随机生成一个数s和0x1000000000000000000000000000相加为x。当x是素数的时候,就从[1,x]之中随机生成a,b。使得p=(2*x*a)+1,q=(2*x*b)+1。我们获得n=p*q。之后将n和e组合成公钥输出。并输出又该公钥加密的消息。

我们发现n=p*q=((2*x*a)+1)*((2*x*b)+1)=(4*x*x*a*b)+(2*x*a)+(2*x*b)+1。而(n-1)%x=0。我们可以借助此首先将x爆破出来。然后继续推算a,b。由于n-1=(4*x*x*a*b)+(2*x*a)+(2*x*b),(n-1)/(2*x)=(2*x*a*b)+a+b。由于a+b<2*x。所以((n-1)/(2*x))%(2*x)=a+b.然后我们计算((n-1)/(2*x)-(a+b))=2*x*a*b。((n-1)/(2*x)-(a+b))/(2*x)=a*b。我们已知a+b和a*b。那么,a=((a+b)+(a-b))/2,b=a+b-a。我们已知a,b。即可轻松获得p,q。我们获取私钥后即可对消息解密。

import gmpy2
from Crypto.PublicKey import RSA
def shuchu(mingwenstr):if mingwenstr[len(mingwenstr)-1]=='L':mingwenstr=mingwenstr[2:len(mingwenstr)-1]else:mingwenstr=mingwenstr[2:len(mingwenstr)]if not len(mingwenstr)%2==0:mingwenstr='0'+mingwenstri=len(mingwenstr)mingwen=""while i>=1:str1=mingwenstr[i-2:i]if int(str1,16)>33 and int(str1,16)<126:mingwen=chr(int(str1,16))+mingwenelse :mingwen=" "+mingweni=i-2print mingwenpubkey="""-----BEGIN RSA PUBLIC KEY-----
MD0CNkrHjOABLwGYp+ILQURK13nBx4JzR7PBTERgWlTfizn2WLs8xvD0S0w8v2BR
3jkoQ3Lk2al72QIDAQAB
-----END RSA PUBLIC KEY-----"""
key=RSA.importKey(pubkey)
n=key.n
e=key.e
prime=0x1000000000000000000000000000
for i in xrange(0x1000000):primex=prime+iif gmpy2.is_prime(primex):if (n-1)%primex==0:prime=primexprint primexbreakaandb=((n-1)/(2*prime))%(2*prime)
c=0x216f28e567436bb97d6d5bc084be2f816eb7b3d6d2f4d7765de28f9cf5279c63ce7272dd9902fe0d0e03209189f9cf694e5c8325f61f
amulb=(((n-1)/(2*prime))-aandb)/(2*prime)
print gmpy2.iroot(pow(aandb,2)-4*amulb,2)[1]
asubb=gmpy2.iroot(pow(aandb,2)-4*amulb,2)[0]
a=(aandb+asubb)/2
b=aandb-a
print a,b
assert a+b==aandb
assert a*b==amulb
p=2*prime*a+1
q=2*prime*b+1
assert n==p*q
print p,q
phi=(p-1)*(q-1)
d=gmpy2.invert(e,phi)
m=pow(c,d,n)
shuchu(hex(m))

defcon-ctf qualifer crypto writeup相关推荐

  1. 红亚2015-3月杯季赛 CTF题部分writeup

    红亚2015-3月杯季赛 CTF题部分writeup 最近一直特别特别忙,没有时间写Blog,连续两周每天都忙到凌晨,连续两个周六都是快十一点才回宿舍.中途,间接地做了些红亚上,原来的一些CTF老题, ...

  2. 【2022 网鼎杯】青龙组 crypto WriteUp

    2022 网鼎杯 青龙组 crypto WriteUp crypto091 crypto405 crypto162 文章目录 crypto091 crypto405 crypto162 crypto0 ...

  3. DEFCON CTF全球总决赛:三支中国战队进入世界前六

    DEFCON CTF全球总决赛:三支中国战队进入世界前六 投稿:qiaojingixiong,来自FreeBuf黑客与极客(FreeBuf.COM) Defcon CTF全球总决赛结束两周之后,结果揭 ...

  4. 【ByteCTF 2022】Crypto Writeup

    ByteCTF 2022 密码 Crypto writeup Choose_U_flag Compare Card Shark 文章目录 1. Choose_U_flag 题目分析 初始化参数 加密过 ...

  5. ctf 杂项 猜 writeup

    ctf 杂项 猜 writeup 说实话这是我第一次用markdown写博客,可能写的不太好,请见谅 废话不多说,请看这道题 emmmm 只需要看出这是谁就可以得到flag了,但这张图片并没有头,我猜 ...

  6. 网络安全实验室CTF—脚本关 writeup

    网络安全实验室CTF-脚本关 writeup key又又找不到了 快速口算 这个题目是空的 怎么就是不弹出key呢? 知识点:验证码发布流程 逗比验证码第一期 逗比验证码第二期 逗比验证码第三期(SE ...

  7. DEFCON CTF 2017圆满收关,三支中国战队闯入全球前五

    作为CTF界最知名影响范围最广的比赛,为期三天的DefCon CTF 2017在热闹喧嚣中落下了帷幕,经过整整三天两夜52个小时不停歇的比赛,比赛结果最终揭晓,美国PPP战队再次夺冠!这已经是PPP战 ...

  8. CTF秀CRYPTO密码学签到

    CTF秀CRYPTO密码学签到 继续开启全栈梦想之逆向之旅~ 这题是CTF秀CRYPTO密码学签到 发现类似flag的}wohs.ftc{galf: 直接反转得到flag . . 为什么怎么简单的题目 ...

  9. 【ctf】Crypto初步基础概要

    在CTF界中,真正的Crypto高手只要一张纸一只笔以及Python环境就可以称霸全场了.(虽然是玩笑话但却是事实) 当然了,密码学是整个网络安全的基础,不管你是否参加ctf类的比赛,对于密码的常识也 ...

最新文章

  1. 计算机应用 含升学方向,对口升学《计算机应用基础》复习资料总汇(含答案))讲述.doc...
  2. 关于技术方案与架构宣讲的思考
  3. Luogu P1607 庙会班车【线段树】By cellur925
  4. 心疼啊今天在四季青买衣服的时候在试衣服的时候,竟然有个小偷把我的n73手机给偷去了,...
  5. 【问题解决】Processing库安装方法简介
  6. 出国?上研?工作?回家种田?(三) IT类专业的工作方向与特点(软硬件技术等岗位)
  7. delphi tclientsocket接收不到返回数据_NB-IOT联网及模块UDP数据传输过程
  8. 紫光扫描仪ocr_紫光OCR文字识别软件
  9. 全自动采集程序 php,快看CMS全自动采集影视程序
  10. 如何配置Mysql驱动
  11. Xenserver命令大全
  12. 喜讯|奇点云联合创始人刘莹荣登“2021最值得关注的女性创业者”榜单
  13. SQLserver安装程序无法打开注册表项 解决办法
  14. Appwidget控件的使用
  15. 思科认证介绍(各种证书)
  16. video视频关键帧截取
  17. bzoj4605 崂山白花蛇草水
  18. R语言绘图中图片的组合(cowplot、patchwork宏包、layout、par()、gridExtra)
  19. IT忍者神龟之Microsoft Office Enterprise 2007 简体版 企业版 序列号
  20. 阿里云服务器cnetos7常用命令

热门文章

  1. STM32芯片ADC内部的CH17参考电压的用途
  2. html文字往右边偏移怎么做,div向右偏移设置 css让div靠右移必定距离
  3. pyppeteer实现问卷星自动填写
  4. Typing for mac(打字训练工具)
  5. Could not open a connection to SQL Server [53]
  6. win7计算机睡眠快捷键,Win7系统在桌面创建睡眠模式快捷键的方法
  7. Json数据的序列化与反序列化的三种常用方法介绍
  8. 众多交通工具3dm Rhino资源素材一键即可获取
  9. QT OpenGL(一 VAO、VBO、EBO使用)
  10. 获取农历节日的公共方法