-
-
[原创]看雪CTF 2017 第二题 lelfeiCM writeup
-
2017-6-5 10:57
4556
-
[原创]看雪CTF 2017 第二题 lelfeiCM writeup
所用工具:OD
说明:以下分析貌似只适用于key的长度为8位或9位,10位以上的处理好像不太一样,抱歉未深入研究。
key的长度为8到20位,全为数字,且不包含0。以图说明:
下面用伪代码表示,假设输入为key,对key进行如下运算(key2,key3为新变量)
key2 = 反转(key)
key3 = key2 * 9;
do
{
key3 = key3 * key2 * 9;
if(key3长度(位数) > 1024)
{wrong key,结束循环}
if(key3满足条件)
{key正确,结束循环}
}while(true)
key3需满足的条件为:
假设输入key为:12345678,key3的长度需为奇数,中间的数字需等于key的第一位(即1),
key3开头的前7位数需等于key后7位数的逆序(即8765432),key3的最后7位数需等于key后7位数(即2345678)。
遍历计算python代码如下,正确key为97654321
# -*- coding: utf-8 -*-
#这段代码从11111111到99999999查找正确key,
#省去了反转key的操作,所以找到正确key后应手工反转1次
import time
def calc(key):
skey = str(key)
if '0' in skey: #若包含0,直接返回
return False
print skey
first = skey[-1]
y = key
y = y * 9
while True:
y = y * key * 9
sy = str(y)
if(len(sy) > 1024):#长度不能大于1024
return False
if(len(sy) % 2 == 0):
continue
if(sy[len(sy) / 2] != first):
continue
lens = len(skey)
if(sy[0:lens-1] != skey[0:lens-1]):
continue
srkey = skey[0:lens-1][::-1]
if(srkey != sy[-(lens-1):]):
continue
return True
print time.time()
for num in range(11111111,99999999):
if(calc(num)):
print 'key:',num
break
print 'done'
print time.time()
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课