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. Centos7 安装redis 并新建springboot工程使用Redis 做session

    Redis 安装 就是解压运行,根据自己的爱好,放到文件夹中 tar -zxvf redis-5.0.4.tar.gz yum install gcc cd redis-5.0.4 make MALL ...

  2. 文本查重算法SimHash

    1.介绍 爬虫采集了大量的文本数据,如何进行去重?可以使用文本计算MD5,然后与已经抓取下来的MD5集合进行比较,但这种做法有个问题,文本稍有不同MD5值都会大相径庭, 无法处理文本相似问题.另一种方 ...

  3. Java中数组操作 java.util.Arrays 类常用方法的使用

    任何一门编程语言,数组都是最重要和常用的数据结构之一,但不同的语言对数组的构造与处理是不尽相同的. Java中提供了java.util.Arrays 类能方便地操作数组,并且它提供的所有方法都是静态的 ...

  4. 第七篇 Flask实例化配置及Flask对象配置

    一.Flask对象的配置 Flask 是一个非常灵活且短小精干的web框架 , 那么灵活性从什么地方体现呢? 有一个神奇的东西叫 Flask配置 , 这个东西怎么用呢? 它能给我们带来怎么样的方便呢? ...

  5. vue学习笔记-遗留问题记录

    Node.js是什么?对node.js的理解 官网解释:Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时. 这是一种通过JavaScript语言开发web服务端的东 ...

  6. 20190906_matplotlib_学习与快速实现

    20190906 Matplotlib 学习总结 第一部分: 参考连接: Introduction to Matplotlib and basic line https://www.jianshu.c ...

  7. 真正的打包scrapy单文件(不包含cfg)

    前置:https://www.cnblogs.com/luocodes/p/11827850.html 解决最后一个问题,如何将scrapy真正的打包成单文件 耗了一晚上时间,今天突然有灵感了 错误分 ...

  8. 全栈项目|小书架|服务器开发-Koa2 全局异常处理

    什么是异常 做开发的基本都知道异常,像Android开发中常见的ANR异常.空指针异常,服务器开发中经常遇到的异常404,500异常,还有一些其他常见的异常,具体可见HTTP状态码. 基本上这些异常可 ...

  9. 「动态规划」-数位dp专题

    数位dp,今天学长讲的稍玄学,课下花了一会时间仔细看了一下,发现板子是挺好理解的,就在这里写一些: 数位dp主要就是搞一些在区间中,区间内的数满足题目中的条件的数的个数的一类题,题目一般都好理解,这时 ...

  10. day7-format字符串格式化

    tpl = "i am {name}, age {age}, really {name}".format(name="seven", age=18) print ...