首页
社区
课程
招聘
[原创]看雪CTF 2017 第二题 lelfeiCM writeup
2017-6-5 10:57 4556

[原创]看雪CTF 2017 第二题 lelfeiCM writeup

rxy 活跃值
1
2017-6-5 10:57
4556

所用工具: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直播授课

收藏
点赞2
打赏
分享
打赏 + 1.00雪花
打赏次数 1 雪花 + 1.00
 
赞赏  CCkicker   +1.00 2017/06/06
最新回复 (3)
雪    币: 18
活跃值: (12)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
茻~ 2017-6-5 15:23
2
0
请问楼主,逆向汇编算法有什么技巧或注意事项?前两天绕晕在里面了。。真心求教,望不吝赐教,谢谢!!
雪    币: 6168
活跃值: (2474)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
rxy 1 2017-6-7 15:33
3
0
茻~ 请问楼主,逆向汇编算法有什么技巧或注意事项?前两天绕晕在里面了。。真心求教,望不吝赐教,谢谢!!
抱歉没及时答复你,因为我也是初学,不知道该怎么回答。我的方法就是一开始在OD中详细地一步一步跟踪,把看到的计算操作、关键地址都写下来,发现程序中频繁使用GetTickCount生成随机地址,但慢慢发下这些地址都不中重要,于是不再单步跟踪,只在运算处下断点,观察每一次运算的输入和输出,全部写下来后发现这些运算在宏观上其实就组成了给key乘9和乘以key自己这2个操作,剩下的就是去暴力破解了。笨办法,见笑了。
雪    币: 18
活跃值: (12)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
茻~ 2017-6-7 15:52
4
0
rxy 抱歉没及时答复你,因为我也是初学,不知道该怎么回答。我的方法就是一开始在OD中详细地一步一步跟踪,把看到的计算操作、关键地址都写下来,发现程序中频繁使用GetTickCount生成随机地址,但慢慢发下 ...
这的确是一种很好的分析思路,谢谢分享!
游客
登录 | 注册 方可回帖
返回