2017第二届广东省强网杯线上赛Random

  1. 题目给出2个文件,一个pyo为文件和一个enc。
    在这里插入图片描述
  2. 打开pyo文件发现是一个二进制文件
    在这里插入图片描述
  3. 不太清除pyo是什么,去搜索一下,发现如下内容
    • py:源码文件,由 Python 程序解释。
    • pyc:源码经编译后生成的二进制字节码(Bytecode)文件。
    • pyo:优化编译后的程序,也是二进制字节码文件。
  4. pyo文件阅读不来,而pyo又由py文件编译而来推测需要反编译得到py文件,搜索如何反编译pyo文件。
    pip install uncompyle
    
  5. 查看得到的py文件,发现还是不能完全‘’可读
    在这里插入图片描述
  6. 搜索了一些资料后推测是做了加密措施,替换了变量名,那么以此来改写刚刚的py文件
# uncompyle6 version 3.7.4
# Python bytecode 2.7 (62211)
# Decompiled from: Python 3.8.6 (default, Sep 25 2020, 09:36:53) 
# [GCC 10.2.0]
# Embedded file name: encrypt.py
# Compiled at: 2017-07-11 17:19:27
from random import randint
from math import floor, sqrt
a = ''
aa = '_'
aaaa = [ ord(aaa) for aaa in aa ]
aaaaa = randint(65, max(aaaa)) * 255
for aaa in range(len(aa)):
    a += str(int(floor(float(aaaaa + aaaa[aaa]) / 2 + sqrt(aaaaa * aaaa[aaa])) % 255)) + ' '

print (a)
# okay decompiling encrypt.pyo
  1. 随手运行一下,发现得到一个数字
    在这里插入图片描述
  2. 这里通过py代码推测加密了aa变量。
    在这里插入图片描述
  3. 打开另外一个文件,发现一串数字,推测是由第一个py文件加密得到的数字
    在这里插入图片描述
  4. 想要一个字符一个字符去加密后比对,但加密过程中有随机数参与运算,此时需要求出次随机数
  5. 再次观察那串数字,发现3对数字重复
    在这里插入图片描述
  6. 改写代码,采用爆破的方法获得3个可能的随机数
from random import randint
from math import floor, sqrt
def en(aaaaa):
	a = ''
	ss=[]
	i=''
	key=0
	aa = '1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'
	aaaa = [ ord(aaa) for aaa in aa ]
	for aaa in range(len(aa)):
	    a += str(int(floor(float(aaaaa + aaaa[aaa]) / 2 + sqrt(aaaaa * aaaa[aaa])) % 255)) + ' '
	ss=a.split(" ")
	for i in ss:
		if (i!=""):
			i=int(i)
		if(i==77 or i== 202 or i==236 or i== 208 or i==140 or i== 149 or i==189 or i== 193 or i==104 or i== 184 or i==97 or i==148  or i==244 or i== 199 or i==122 or i== 113 ):
			key+=1
	if(key>=16):
		print(key)
		print(aaaaa,a)
	
for i in range(1,1000000):	
	en(i)

在这里插入图片描述
13. 此时利用3个随机数反推加密数字,得到3个flag
在这里插入图片描述

from random import randint
from math import floor, sqrt
def en(aaaaa,flag):
	a = ''
	aa = '1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'
	aaaa = [ ord(aaa) for aaa in aa ]
	for aaa in range(len(aa)):
		a=str(int(floor(float(aaaaa + aaaa[aaa]) / 2 + sqrt(aaaaa * aaaa[aaa])) % 255))
		if (a == flag):
			print(chr(aaaa[aaa]),end="")

randint=[29325,30237,31149]
flags="208 140 149 236 189 77 193 104 202 184 97 236 148 202 244 199 77 122 113".split(" ")
for i in randint:
	for j in flags:
		en(i,j)
	print("\n")
  1. 依次提交答案,发现都不正确,猜测是因为有1个或者2个字符的加密数字是一样的造成,仔细观察后发现第一个随机数可以有如下2对字符的加密数字一样
    1 --G
    e --4

    原始得到:Th7isRandomIsNotSaf4e
    1:Th7isRandomIsNotSaf44
    2:Th7isRandomIsNotSafee
    3:Th7isRandomIsNotSafe4

  2. 提交后发现还是不对,此时发现3组答案中的第一组好像是个句子。
    在这里插入图片描述

  3. 将其修改为可读的正确句子后提交,发现答案正确
    4:ThisRandomIsNotSafe

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值