护网杯一道crypto

 1 import os
 2 def xor(a,b):
 3     assert len(a)==len(b)
 4     c=""
 5     for i in range(len(a)):
 6         c+=chr(ord(a[i])^ord(b[i]))
 7     return c
 8 def f(x,k):
 9     return xor(xor(x,k),7)
10 def round(M,K):
11     L=M[0:27]
12     R=M[27:54]
13     new_l=R
14     new_r=xor(xor(R,L),K)#先将前27和后的27异或 然后将得到的27 位再跟k异或
15     return new_l+new_r#将new_r和new_l拼接起来
16 def fez(m,K):
17     for i in K:
18         m=round(m,i) #一轮轮下去
19     return m
20
21 K=[]
22 for i in range(7):
23     K.append(os.urandom(27))
24 m=open("flag","rb").read()
25 assert len(m)<54
26 m+=os.urandom(54-len(m)) #不够还得补
27
28 test=os.urandom(54)
29 print test.encode("hex")
30 print fez(test,K).encode("hex")
31 print fez(m,K).encode("hex")

刚刚开始想了好久都没想出k是怎么求出来的,最后看了大佬的wp,豁然大悟,原来是消去k。

不过。。。就算这样也搞不出来,看了好久wp才弄明白。

首先,我把一个的过程给写了下来,进行猜想:

 1 fR7=xor(xor(fL6,fR6),k)
 2 fL7=fR6
 3 fR7=xor(xor(fL5,fR5),k)
 4 fL6=fR5
 5 fR5=xor(xor(fL4,fR4),k)
 6 fL5=fR4
 7 fR4=xor(xor(fL3,fR3),k)
 8 fL4=fR3
 9 fR3=xor(xor(fL2,fR2),k)
10 fL3=fR2
11 fR2=xor(xor(fL1,fR1),k)
12 fL2=fR1
13 fR1=xor(xor(fL0,fR0),k)
14 fL1=fR0

另一边也一样的,当到最后的时候tL0和tR0是已知,但要记住,从下往下回归的时候,左右会交换了。

最后发现:

tL7^fL7=tL0^fL0

所以可以将

fL0=tL7^fL7^test[27:54]

这样就能求出另一边了。另一边,也差不多,想方法求得带有fR0^tR0的项,再异或

test[0:27]

就出来了。

下面还有一种大佬的方法:

(tR7^R7)^(tL7^L7)=fL6^tL6
(tR6^R6)^(tL6^L6)=fL5^tL5
(tR5^R5)^(tL5^L5)=fL4^tL4
(tR4^R4)^(tL4^L4)=fL3^tL3
(tR3^R3)^(tL3^L3)=fL2^tL2
(tR2^R2)^(tL2^L2)=fL1^tL1
(tR1^R1)^(tL1^L1)=fL0^tL0

再有:

fR7=fR6
tR7=tR6

就能凑出

(tR6^R6)^(tL6^L6)

之后就能一步一步往下走:就能求出 tL0^fL0 和fL0^tL0

最后给出大佬的博客,大佬真的是厉害。

https://qingchenldl.github.io/2018/10/13/%E6%8A%A4%E7%BD%91%E6%9D%AFWP-BitPwn/

这次比赛真的让我自闭了。

原文地址:https://www.cnblogs.com/liyuechan/p/9785695.html

时间: 2024-08-30 18:09:05

护网杯一道crypto的相关文章

2019护网杯baby_forensic

题目名称:baby_forensic题目描述:can you catch the flag?附件:“data.7z” 2019护网杯初赛的一道取证题,比赛时没做出来,赛后又研究了一下. 获取profile的类型,因为不同的系统数据结构不一样,所以需要用--profile=来指定. 这里自动猜解可能的系统类型,一般情况下第一个是正确的,如果不对每个都试一下. volatility -f /root/data.vmem imageinfo 列出所有的进程 volatility -f /root/da

[护网杯 2018]easy_tornado

[护网杯 2018]easy_tornado 打开之后看到几个文件夹分别提示 /flag.txt flag in /fllllllllllllag /welcome.txt render /hints.txt md5(cookie_secret+md5(filename)) 尝试对file传参跳到 /error?msg=Error 显示Error tornado.render.error=error,马上想到ssti.然后开始尝试,发现ban了很多符号 ",',(,),_,%,*,+,-,/,=

一道Crypto题

[题源]北京理工大学计算机学院创新创业基地2018年2017级暑假集训选拔赛 [问题背景]CTF比赛中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式.其大致流程是,参赛团队之间通过进行攻防对抗.程序分析等形式,率先从主办方给出的比赛环境中得到一串具有一定格式的字符串或其他内容,并将其提交给主办方,从而夺得分数.为了方便称呼,我们把这样的内容称之为"Flag". [问题描述]Crypto是CTF比赛中常见的一种题型,其问题大多与加密有关.这一天Al

护网杯web

首先进入网页后,观察到有sign up 点击sign up 进行注册 再点击sign in 进行登录 进入一个买辣条的界面,可以知道,5元可以买一包大辣条,多包大辣条可以换一包辣条之王,多包辣条之王可以换Flag 进入info查看余额,发现,至多可以买4包大辣条,不满足辣条之王的兑换 尝试条件竞争打开burpsuit点击大辣条的购买窗口,抓取数据 发送到Intruder,点击Positions,点击clear 点击Payloads 这里算是纠结了一下,最后想到利用条件竞争,试验发现一个账户的两个

刷题记录:[护网杯 2018]easy_laravel

参考链接:Laravel 相关几道题目复现 sql注入 username的sql注入,一眼就能看出来,但是admin的密码是加密过的,没法直接得到密码 public function index(Note $note) { $username = Auth::user()->name; $notes = DB::select("SELECT * FROM `notes` WHERE `author`='{$username}'"); return view('note', com

2018护网杯easy_tornado(SSTI tornado render模板注入)

考点:SSTI注入 原理: tornado render是python中的一个渲染函数,也就是一种模板,通过调用的参数不同,生成不同的网页,如果用户对render内容可控,不仅可以注入XSS代码,而且还可以通过{{}}进行传递变量和执行简单的表达式. 网上看到的例子: #!/usr/bin/env python # -*- coding:utf-8 -*- from tornado.web import UIModule from tornado import escape class cust

CTF 两道web整数溢出题目(猫咪银行和ltshop)

①猫咪银行: (2018中科大hackgame) 一开始给十个CTB,而flag需要20个CTB,我们需要理财赚够20个. 理财是只能买入TDSU才可以获得收益.我们先上来直接把CTB全部换成TDSU. 上边是我们花了所有TDSU:66060买了19分钟后的收益.(因为一个账号最多存在20分钟,计算你用脚本极限也不能买20分钟,必须留一分钟用来换TDSU和买入,取出等操作) 还是不行,算上收益的钱1200231也不够买20个CTB. 考虑买RMX是否存在汇率差. 发现一个CTB57个RMX,一个

第二届“强网杯”全国网络安全挑战赛来袭——线上赛

为全面贯彻习主席关于网络安全和信息化工作的一系列重要指示精神,延揽储备锻炼网信领域优秀人才,提升国家网络空间安全能力水平,举办第二届"强网杯"全国网络安全挑战赛.该比赛是面向高等院校和国内信息安全企业的一次国家级网络安全赛事,旨在通过激烈的网络竞赛对抗,培养和提高国家网络安全保障能力和水平,发现网络安全领域优秀人才,提升全民网络空间的安全意识和能力水平. 比赛链接 官方比赛链接地址:https://www.ichunqiu.com/2018qwb?from=bkyl 比赛时间 线上赛报

nodejs的某些api~(二)crypto加密模块

就随便写写crypto模块,加密在node里面挺重要的,特别是密码,用户名都用crypto加密,在我写的那个作品里面,用户名密码的存储都是用crypto加密的,也没有深究里面的内容,想深究的同学可以看: 点我 //crypto.getCiphers();返回一个数组,包含支持的加密算法的名字: //crypto.getHashes();返回ige包含所支持的哈希算法的数组:都可以在node里试试,返回一大长串.//crypto.createCredentials(details);创建一个加密凭