2021第五届强网杯网络安全挑战赛决赛-crypto writeup
admin
2023-08-16 15:02:16
0次

2021第五届强网杯网络安全挑战赛决赛-crypto writeup

不垫底就算成功
蛮恶心的,差点因为服务器太慢出不来
from sage.stats.distributions.discrete_gaussian_integer import DiscreteGaussianDistributionIntegerSampler from random import randint, getrandbits from secret import flag import sys import signalq = 2 ^ 54 t = 83 T = 3 d = 1024 delta = int(q / t) sigma = 2 P. = PolynomialRing(ZZ) f = x ^ d + 1 R. = P.quotient(f) D = DiscreteGaussianDistributionIntegerSampler(sigma=sigma)def sample1(): return R([D() for _ in range(d)])def sample2(): return R([randint(0, q - 1) for _ in range(d)])def sample3(x): return [randint(0, T - 1) for _ in range(x)]def Roundq(a): A = a.list() for i in range(len(A)): A[i] = A[i] % q if A[i] > (q / 2): A[i] = A[i] - q return R(A)def Roundt(a): A = a.list() for i in range(len(A)): A[i] = A[i] % t if A[i] > (t / 2): A[i] = A[i] - t return R(A)def keygen(): s = sample1() a = Roundq(sample2()) e = Roundq(sample1()) pk = [Roundq(-(a * s + e)), a] return s, pkdef encrypt(m): u = sample1() e1 = sample1() e2 = sample1() return (Roundq(pk[0] * u + e1 + delta * m), Roundq(pk[1] * u + e2))def baseT(n, b=T): v = [] while True: x = n // b y = n % b v.append(y) if x == 0: break n = x v.reverse() return vdef mutual(k, c, s): tmp = t * Roundq(c[0] + c[1] * s) TMP = tmp.list() for i in range(len(TMP)): TMP[i] = round(TMP[i] / q) tmp2 = Roundt(R(TMP)) if tmp2[min(k, d)] == 0: print(True) else: print(False)signal.alarm(1024) sk, pk = keygen() print(f"public key:{ pk[0].list()}, { pk[1].list()}")namelist = ["admin", "Adam", "Bruce", "Chris", "David"] users = dict() for i in namelist: users[i] = getrandbits(32)menu = ''' 1.Add friends 2.find friends 3.Send Message 4.Regist'''friends = set() while 1: print(f"Current number of users: { len(users)}") print(menu) op = int(input(">").strip()) if op == 1: name = input("name:").strip() id_num = int(input("id:").strip()) if name in users.keys(): if id_num == users[name]: friends.add(name) else: print("failed") else: print("failed") elif op == 2: op2 = input("recv ct?(Y/N)").strip() if op2.upper() == "Y": for name in users.keys(): id_num = users[name] x = baseT(id_num) y = x + sample3(d - len(x)) ct = encrypt(R(y)) print(ct[0].list(), ct[1].list()) op3 = input("continue?(Y/N)") if op3.upper() == "N": break elif op3.upper() != "Y": sys.exit(1) elif op2.upper() != "N": sys.exit(1)for i in range(len(users)): c1 = input("c1:").strip().split(" ") c2 = input("c2:").strip().split(" ") cc1 = list(map(int, c1)) cc2 = list(map(int, c2)) mutual(i, [R(cc1), R(cc2)], sk)elif op == 3: name = input("name:").strip() message = input("message:").strip() if name not in friends: print("failed") else: if name == "admin": if message == "give me the flag": print(flag) else: print(f"send '{ message}' to { name}") elif op == 4: name = input("name:").strip() if name not in users.keys(): users[name] = getrandbits(32) print("succeeded") else: print("failed") else: sys.exit(1)

分析
需要我们泄露admin的id来添加一个friend来get massage
【2021第五届强网杯网络安全挑战赛决赛-crypto writeup】这个题是一个经典的 CCA attack on FPSI
针对全同态的一个攻击,但和常规情况不同的是在生成密钥时并未像标准加密系统中为了方便硬件运算使用0 1序列生成的多项式
而是使用 [-7,-6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6,7] 得序列随机生成的私钥
from sage.stats.distributions.discrete_gaussian_integer import DiscreteGaussianDistributionIntegerSampler D = DiscreteGaussianDistributionIntegerSampler(sigma=sigma)def sample_2(): return R([randint(0,1) for _ in range(d)]) def sample1(): return R([D() for _ in range(d)])def keygen(): s = sample1() a = Roundq(sample2()) e = Roundq(sample1()) pk = [Roundq(-(a * s + e)), a] return s, pk

原版payload只需要给 t i = m t_i=m ti?=m
可以恢复出密钥
payload:
M=delta//4+50 Recoverd_key=[] for i in range(d): Recoverd_key.append(recover_key(i))def recover_key(i): t1=[0 for _ in range(d)] t1[i]=M t2=M cc0=pk[0]+R(t1) cc1=pk[1]+R(t2) ans = decrypt([cc0,cc1]).list() return ans[i]

但题目情况密钥并不为0 1 序列而且Oracle attack只能判断为该位上数字是否为0
在改变t1[i]=M M的个数后发现以下性质:
私钥\ 返回的数据 M 2M 7M 5M
7 2 2 3 0
6 2 2 3 0
5 2 2 3 0
4 1 2 3 0
3 1 1 3 -1
2 1 1 2 -1
1 1 1 2 -1
0 0 1 2 -1
-1 0 0 2 -2
-2 0 0 1 -2
-3 -1 0 1 -2
-4 -1 -1 1 -2
-5 -1 -1 1 -3
-6 -1 -1 0 -3
-7 -1 -1 0 -3
只要按顺序 n = [8,7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3, -4, -5,-4] t1 = n*M 就可以对密钥进行一个padding Oracle
exp
from pwn import * # from icecream import * from tqdm import tqdmfrom time import * p1 = time()# ----------------------------------- # get pk # io = remote('0.0.0.0',10001) io = remote('172.20.5.23',8001)q = 2 ^ 54 t = 83 T = 3 d = 1024 delta = int(q / t) sigma = 2 P. = PolynomialRing(ZZ) f = x ^ d + 1 R. = P.quotient(f)def Roundt(a): A = a.list() for i in range(len(A)): A[i] = A[i] % t if A[i] > (t / 2): A[i] = A[i] - t return R(A)def Roundq(a): A = a.list() for i in range(len(A)): A[i] = A[i] % q if A[i] > (q / 2): A[i] = A[i] - q return R(A) def mutual2(k, c, s): tmp = t * Roundq(c[0] + c[1] * s) TMP = tmp.list() for i in range(len(TMP)): TMP[i] = round(TMP[i] / q) tmp2 = Roundt(R(TMP)) return tmp2io.recvuntil('public key:[') pk1 = io.recvuntil(']')[:-1] io.recvuntil('[') pk2 = io.recvuntil(']')[:-1] # print(pk1) # print(pk2[:100]) pk2 = [int(i) for i in pk2.split(b',')] # print(pk2[:10]) pk1 = [int(i) for i in pk1.split(b',')] pk=[R(pk1),R(pk2)] for i in range(1024-5): print(io.recvuntil('>')) io.sendline('4') io.sendline(str(i))M=delta//4+50 padding = [8,7, 6, 5, 4, 3, 2, 1,0, -1, -2, -3, -4, -5,-4] sks=[-7,-6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6,7] rk=[100 for i in range(1024)]for x in range(len(sks)): print(io.recvuntil('>')) io.sendline('2') print(io.recvuntil('recv ct?(Y/N)')) io.sendline('Y') sleep(1) print(io.recvuntil('[')) adminC1 = io.recvuntil(']')[:-1] print((io.recvuntil('['))) adminC2 = io.recvuntil(']')[:-1] adminC1 = [int(i) for i in adminC1.split(b',')] # print(pk2[:10]) adminC2 = [int(i) for i in adminC2.split(b',')] print(io.recvuntil('continue?(Y/N)')) io.sendline('N') pad = padding[x] print(f'第{ x}个了') for k in tqdm(range(1024)): t1=[0 for _ in range(d)] t1[k]=pad*M t2=M # ================================ cc0=(pk[0]+R(t1)).list() payload_c1 = '' for i in cc0: payload_c1 += str(i) payload_c1+=' ' payload_c2 = '' cc1=(pk[1]+R(t2)).list() for i in cc1: payload_c2 += str(i) payload_c2+=' 'io.recvuntil('c1:') io.sendline(payload_c1) # sleep(1) io.recvuntil('c2:') io.sendline(payload_c2) # =====================================fb = io.recvline() if(b'True' in fb and rk[k]==100): rk[k] = sks[x] # input() for i in range(len(rk)): if(rk[i]==100): rk[i]=7sk = R(rk) adminCT=[R(adminC1),R(adminC2)] # cc0=R(ct[0].list()) # cc1=R(ct[1].list())ans = mutual2(0,adminCT,sk)x = ans.list()[:25] admin_id =0 use=[] ids=[] for i in x: admin_id *= T admin_id += i use.append(i) ids.append(admin_id)print(rk) print(ids) # io.interactive() sleep(1) for id in ids: print(io.recvuntil('>')) io.sendline('1') print(io.recvuntil('name:')) io.sendline('admin') print(io.recvuntil('id:')) io.sendline(str(id)) print(io.recvline()) print(io.recvuntil('>')) io.sendline('3') io.sendlineafter('name:','admin') io.sendlineafter('message:','give me the flag') sleep(1) print(io.recv(2048)) p2 = time() print(p2-p1)

FLAG
b'name:' b'id:' b'failed\n' b'Current number of users: 1024\n\n1.Add friends\n2.find friends\n3.Send Message\n4.Regist\n>' b'name:' b'id:' b'failed\n' b'Current number of users: 1024\n\n1.Add friends\n2.find friends\n3.Send Message\n4.Regist\n>' b'flag{CCA_attack_BFV_123698745}\n' [*] Closed connection to 172.20.5.23 port 8001 /mnt/c/U/1/De/qwb决赛/bfv

服务器OI速度及其慢 等了半天才打通

相关内容

热门资讯

大浪淘金APP黑幕揭秘:内盘操...   大浪淘金APP平台最隐蔽的黑幕,在于其完全封闭的内盘交易系统。这个看似与国际市场接轨的交易平台,...
告别固定工资实现财富自由?一品...   普通投资者被广告宣传诱导,注册就送现金,充值返现金券等等这些宣传方式,都是在引流到平台开户,不怕...
哈易购APP打着现货交易幌子搞...   网络上各类白银、铂金等贵金属投资广告铺天盖地,不少平台以"现货交易"为名,暗中却从事着非法期货交...
5元起投!高额收益?中国白银、...   上海华通白银国际交易中心有限公司(以下简称“华通白银国际”)打着“白银、铂金现货订购”的旗号,实...
"九州订购APP、起...   近年来,贵金属投资热度持续攀升,但乱象也随之而来。一些不法分子趁机搭建虚假交易平台,打着"低门槛...
坚锅淘金APP投资者频繁爆仓亏...   坚锅淘金APP对外宣称是贵金属现货交易平台,日常出入金看似畅通无阻,给人一种合规运营的假象。但事...
斗金订购APP“5元订购现货”...   斗金订购APP“5元订购现货”骗局揭秘:充值易、回本难,越陷越深!  许多投资人在未核实平台合规...
贵金属APP乱象曝光:&quo...   当前市场上部分贵金属类APP未取得正规交易资质,涉嫌误导消费者参与白银、铂金等商品的非合规交易!...
华通白银、银宝街APP被指虚假...   警惕现货白银投资陷阱:上海华通白银背后的平台涉嫌非法期货交易  近年来,各类现货白银交易平台以“...
充值送300,月入过万?别被量...   如今,网络上充斥着大量未经批准的贵金属及其他产品订购交易平台。这些平台普遍缺乏合法经营资质,却将...
鑫汇智投APP贵金属非法期货、...   鑫汇智投APP贵金属非法期货、人为控盘,大量投资者遭恶意收割  鑫汇智投APP长期以“低门槛、高...
矅光智策APP非法贵金属交易骗...   不少投资人在矅光智策APP上进行贵金属交易后出现了严重亏损。许多人在下载该平台时,根本不清楚其是...
飞鸽订购APP非法期货交易骗局...   飞鸽订购APP非法期货交易骗局,很多投资者根本没搞懂规则就盲目充值,买涨买跌跟买cai票一样!平...
天龙白银APP被操控的非法期货...   中小投资者在网络平台参与商品现货订购交易,表面看似合规合法,实则暗藏诸多难以察觉的风险。商品现货...
下载送试玩金?千万别碰!带你揭...   当前,许多贵金属APP交易平台正采用欺诈性营销手段。它们通过抖音等短视频平台,以“5元起投”“充...
泡泡淘金APP骗局:打着&qu...   泡泡淘金APP骗局:打着"商品订购"幌子,实则非法期货收割投资者!投资需谨慎,切勿轻信“高额回报...
南商云购APP虚假电子盘背后的...   南商云购是虚假电子盘吗?它是否具备合规的交易资质?这个曾经的"现货电子盘"如今摇身一变,披上了"...
警惕"祥龙订购&qu...   祥龙订购APP、掌上银牛APP等平台背后的运营方——四川禄宏商品现货市场有限公司,仅具备现货交易...
中国白银、华银:虚假宣传、后台...   中国白银APP宣称是上市公司“中国白银集团”与“上海华通白银国际交易中心”旗下的现货交易平台,提...
起底“优品订购”APP非法期货...   “优品订购”APP根本不具备任何合法的交易资质。其背后的运营方仅凭随便注册一家公司、开发一款交易...