import os
def xor(a,b):
assert len(a)==len(b)
c=""
for i in range(len(a)):
c+=chr(ord(a[i])^ord(b[i]))
return c
def f(x,k):
return xor(xor(x,k),7)
def round(M,K):
L=M[0:27]
R=M[27:54]
new_l=R
new_r=xor(xor(R,L),K)#先将前27和后的27异或 然后将得到的27 位再跟k异或
return new_l+new_r#将new_r和new_l拼接起来
def fez(m,K):
for i in K:
m=round(m,i) #一轮轮下去
return m K=[]
for i in range(7):
K.append(os.urandom(27))
m=open("flag","rb").read()
assert len(m)<54
m+=os.urandom(54-len(m)) #不够还得补 test=os.urandom(54)
print test.encode("hex")
print fez(test,K).encode("hex")
print fez(m,K).encode("hex")

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

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

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

 fR7=xor(xor(fL6,fR6),k)
fL7=fR6
fR7=xor(xor(fL5,fR5),k)
fL6=fR5
fR5=xor(xor(fL4,fR4),k)
fL5=fR4
fR4=xor(xor(fL3,fR3),k)
fL4=fR3
fR3=xor(xor(fL2,fR2),k)
fL3=fR2
fR2=xor(xor(fL1,fR1),k)
fL2=fR1
fR1=xor(xor(fL0,fR0),k)
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/

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

护网杯一道crypto的更多相关文章

  1. 护网杯圆满结束,还不满足?不如来看看大佬的WP扩展思路~

    护网杯预选赛 WP转载自:https://qingchenldl.github.io/2018/10/13/%E6%8A%A4%E7%BD%91%E6%9D%AFWP-BitPwn/#more WEB ...

  2. 2019护网杯baby_forensic

    题目名称:baby_forensic题目描述:can you catch the flag?附件:“data.7z” 2019护网杯初赛的一道取证题,比赛时没做出来,赛后又研究了一下. 获取profi ...

  3. buu[护网杯 2018]easy_tornado

    [护网杯 2018]easy_tornado 1.看看题目给了我们三个文件: /flag.txt url=?filename=/flag.txt&filehash=98c6aac4fbecf1 ...

  4. [原题复现]2018护网杯(WEB)easy_tornado(模板注入)

    简介 原题复现:  考察知识点:模板注入  线上平台:https://buuoj.cn(北京联合大学公开的CTF平台) 榆林学院内可使用信安协会内部的CTF训练平台找到此题 [护网杯 2018]eas ...

  5. 护网杯2019 mergeheap --pwn

    护网 又是签到 一天 这道题一开始 不懂得如何泄露 libc 信息,就蒙了  后来群里师傅也是刚刚好 做出 到这里 我就接着做了 . 先看下保护,发现  全开了 然后 就看下流程 大概 就是添加  c ...

  6. [护网杯 2018]easy_tornado 1

    复现一道关于tornado的题目 首先可以得知此题用的是tornado,基于python的后端框架,多半是ssti注入 有三个文件,首先可得知flag在何处 然后观察hint和url就知道要根据coo ...

  7. 护网杯 task_shoppingCart 记录

    前言 相关题目位于 https://gitee.com/hac425/blog_data/tree/master/hwb task_shoppingCart 漏洞位于 00BD9 用户输入 idx 然 ...

  8. 护网杯 three hit 复现(is_numeric引发的二次注入)

    1.题目源码 https://github.com/ZhangAiQiang/three-hit 题目并不真的是当时源码,是我根据做法自己写的,虽然代码烂,但是还好能达到复现的目的 ,兄弟们star一 ...

  9. 2018护网杯-easy_laravel 复现

    题目docker环境: https://github.com/sco4x0/huwangbei2018_easy_laravel git clone下来直接composer up -d 运行即可,可以 ...

随机推荐

  1. 让搭建在 Github Pages 上的 Hexo 博客可以被 Google 搜索到

    title: 让搭建在Github Pages上的Hexo博客可以被Google搜索到 date: 2019-05-30 23:35:44 tags: 配置 --- 准备工作 搭建好的博客 npm & ...

  2. 6G仅仅是比5G多1G吗??

    第六代移动通信系统(6th generation mobile networks,或6th generation wireless systems),简称6G,是指第六代移动通信技术,是5G系统后的延 ...

  3. JVM(3) 垃圾收集器与内存分配策略

    一.垃圾收集的概念 在Java虚拟机运行时数据区中程序计数器.虚拟机栈和本地方法栈3个区域随线程而生,随线程而灭:栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作,每一个栈帧中分配多少内 ...

  4. NetworkManager网络通讯_破产版NetworkManager(五)

    根据对NetWorkServer 以及NetworkClient的理解,编写一个简易版的NetWork Manager.惯例全部代码放在最后 (一)NetWorkServer与NetworkClien ...

  5. WWW网络请求

    采用WWW获取网络数据: (一)get 1)天气数据下载 private string weatherApi = "http://www.sojson.com/open/api/weathe ...

  6. AS报错:lambda expressions are not supported at this language level

    AS报错:lambda expressions are not supported at this language level 解决方法 打开打开 File --> Project Stuct ...

  7. python中基本运算符

    基本运算符 a // b 取整 a % b 取余 a ** b a 的b次方 a == b 判断运算符左右两边值是否相等 a != b 判断运算符左右两边值是否不等 a > b a >= ...

  8. Unity资源加载路径及加载方式小结

    Unity3D中的资源路径路径属性 路径说明Application.dataPath 此属性用于返回程序的数据文件所在文件夹的路径.例如在Editor中就是Assets了.Application.st ...

  9. 键盘常见ascii码值

    回车事件最常见,码值13 ESC键: VK_ESCAPE (27) 回车键: VK_RETURN (13) TAB键: VK_TAB (9) Caps Lock键: VK_CAPITAL (20) S ...

  10. 强大的CompletableFuture

    引子 为了让程序更加高效,让CPU最大效率的工作,我们会采用异步编程.首先想到的是开启一个新的线程去做某项工作.再进一步,为了让新线程可以返回一个值,告诉主线程事情做完了,于是乎Future粉墨登场. ...