腾讯游戏安全竞赛比赛试题
好了,比赛已经过了提交时间了,来放出题目让大神们看看思路,反正我解了第一题就死了{:1_911:}欢迎各路大神提交各种思路让大家和我参考参考
链接:https://pan.baidu.com/s/1Br3vHQ92QjNkKycvTC8AZQ 密码:jdkl 再贴一个第三题的吧
if __name__=='__main__':
print "first step key:"
step1=2019002
while step1<2019999:
tmp=step1-2019000
truenum=0
while tmp!=0:
tmp2=tmp%10
tmp/=10
truenum+=pow(tmp2,3)
if truenum==step1-2019000:
print step1
step1+=1
print "second step key:"
for step2 in range(20191,20200):
ifstep2&1==0:
print step2
string2="T\P^IcTZ"
xorkey="2019"
s=""
print "1.txt"
for i in range(0,8):
s+=chr(ord(string2)^ord(xorkey))
print s+"-"+xorkey
print "third step key:"
step3=100000
num=
result=
while step3<=999999:
calc1=step3+10*(step3/10%10-step3/10)
calc2=step3/100%10+10*(step3/1000%10)
calc3=step3/10000%10+10*(step3/100000%10)
cur=0
for i in range(1,9,3):
tmp=calc1*num+calc2*num+calc3*num
if tmp==result:
cur+=1
else:
break
if cur==3:
print step3
step3+=1
校验流程有三步,第一步检测输入的整数后三位是不是水仙花数,第二步检测输入的数是否是之间的偶数,再对1.txt的内容做异或并base64,比较是否等于VFxQXkljVFo=,第三步看python代码吧。
有个很奇怪的的地方就是,第一步检测完以后会修改main.dll,而且后续没有修改回去,也可能是我没发现。请其他大佬指点一下吧
把main.dll还原以后输出如下
我也不知道flag是不是正确的。 今天抽空把第二题也做出来了,不过python有精度的问题,生成的注册码我也不保证一定正确,随机测试了几组没啥问题,不想用C重写一次了。。。
使用前python要安装opencv库,并将py文件放在第二题的目录执行
import re
import cv2
import numpy as np
import hashlib
import hmac
def hmacsha256(key,message):
return hmac.new(key, message, digestmod=hashlib.sha256).hexdigest()
def codeappend(code):
s="".join(code)
fxorl1=(ord(code)^ord(code[-1]))<<8
fmull2=(ord(code)*ord(code[-1]))+fxorl1
fdivl3=(ord(code)/ord(code[-1]))+fmull2
fmodl3=(ord(code)%ord(code[-1]))+fdivl3
smuls1=(ord(code)*ord(code[-2]))<<8
sxors2=(ord(code)^ord(code[-2]))+smuls1
smods3=(ord(code)%ord(code[-2]))+sxors2+32
sdivs3=(ord(code)/ord(code[-2]))+smods3
fmod2=(ord(code)%ord(code[-1]))<<8
sdiv2=(ord(code)/ord(code[-1]))+fmod2
tmul2=(ord(code)*ord(code[-1]))+sdiv2+8
foxor2=(ord(code)^ord(code[-1]))+tmul2
fxorl14=(ord(code)^ord(code[-1][-1]))<<8
sdivt23=(ord(code)/ord(code))+fxorl14
smult23=(ord(code)*ord(code))+sdivt23
fmodl14=(ord(code[-1][-1])%ord(code))+smult23
ret1=str(sdivs3*30+(foxor2*2+fmodl3)*20+fmodl14*72)
ret2=str(23*fmodl3+ 32*sdivs3+42*foxor2+54*fmodl14)
ret3=(25*sdivs3 + 38*foxor2 + 67*fmodl14+fmodl3*18)%20
ret4=(45*sdivs3 + 33*fmodl14 + foxor2*64+fmodl3*12)%20
if ret3>ret4:
ret3,ret4=ret4,ret3
ret5=0
for i in s:
ret5+=int(i)
s+=ret1+ret2+str(ret3)+str(ret4)+str(ret5)
## print s
return s
def genbin(codesum):
img = cv2.imread('./flag.jpg')
rows,cols = img.shape[:2]
M = cv2.getRotationMatrix2D((float(cols)/2,float(rows)/2),codesum,1)
dst = cv2.warpAffine(img,M,(cols,rows))
gray = cv2.cvtColor(dst,cv2.COLOR_BGR2GRAY)
gray = np.float64(gray)
res = cv2.resize(gray,(8, 8),fx=0, fy=0, interpolation = cv2.INTER_LINEAR)
r=cv2.dct(res)
result=0.0
s=""
for i in r:
for k in i:
result+=k*0.015625
## print result
for i in r:
for k in i:
if k<result:
s+="0"
else:
s+="1"
## print s
return s
def fullmatch(regex, string, flags=0):
"""Emulate python-3.4 re.fullmatch()."""
return re.match("(?:" + regex + r")\Z", string, flags=flags)
if __name__=='__main__':
name=raw_input()
if fullmatch("(\d{4})-(\d{4})-(\d{4})-(\d{4})",name)!=None and re.search("0000",name)==None:
code=name.split('-')
truename=codeappend(code)
bins=genbin(int(truename[-2:]))
truename+=bins
print hmacsha256(bins, truename)
else:
print "invaild name"
相比第一题,第二题只是在用户名末尾再增加了一串字符串,还有hmac的key变为增加的字符串,其他地方基本一样,具体算法看python代码吧
LjeA 发表于 2019-3-23 19:59
先看看了,题目都看不懂,这是逆向吗?
对啊,这就是逆向 zhongjiezhe 发表于 2019-3-23 23:09
我想报个名都报不了,别说做题啦啊
哈哈那您现在做题试试 米米来这里 发表于 2019-3-24 13:47
这个题很简单啊
大神!大神,麻烦您分享一下思路让我们学习学习:lol 第一题就让写注册机了,菜鸟的我表示劝退成功{:301_1007:} 本帖最后由 whyida 于 2019-3-24 22:10 编辑
第一题 AES ,RSA ,SHA256,SHA1,MD5,MD4 .考加密算法。不会编程,只能被劝退。 whyida 发表于 2019-3-24 22:07
第一题 AES ,RSA ,SHA256,SHA1,MD5,MD4 .考加密算法。不会编程,只能被劝退。
Python有这么难吗{:1_926:} 过路小白围观一下 Eorton 发表于 2019-3-25 13:00
Python有这么难吗
python2.7 可以。 大概格式是这样。