首页
社区
课程
招聘
[求助]求一段算法的逆向算法
2019-9-30 00:38 2937

[求助]求一段算法的逆向算法

2019-9-30 00:38
2937
想趁假期练练手,根据IDA和OLLDBG 分析出了正向的算法,也用python写出了正向算法。奈何脑汁耗尽,还是没有特别有效的逆向算法。

现在知道seed,能生成正确结果,但是如果根据结果,推出seed呢?

菜鸟,还请各位大哥谅解,如发帖区不合适,还请版主告知。
此算法用seed 右移一位然后与计算结果对比尾数是否相同,然后进入两个计算分支,最终生成0x2087这个结果。现在想用结果0x2087和7F,FF,FF,FF推算出seed的前四位。
求指点
python 3.35

这玩意会不会存在多个解。。。。

这玩意是不是CRC啊?。。。。

Seed_125F=[0x59,0x63,0x54,0x07,0x7F,0xFF,0xFF,0xFF]
def F1260(Seed_1260,return_1260):
	for count in range(1,9):
		if (return_1260&1) != (Seed_1260&1):								#奇偶检测
		#if ((return_1260&1) ^ (Seed_1260&1)) == 1:
			print ("ture",'	',(Seed_1260),'	',hex(return_1260))
			return_1260=return_1260 >>1 ^0x8408							#不同
		else:
			print ("false",'	',(Seed_1260),'	',hex(return_1260))
			return_1260=return_1260>>1									#相同
		Seed_1260=Seed_1260>>1
		#print(Seed_1260)
	return return_1260
return_125F=0
for count in range(0,8):
	return_125F=(F1260(Seed_125F[count],return_125F))
print (hex(return_125F))


[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

最后于 2019-9-30 02:13 被dswkc编辑 ,原因:
收藏
点赞0
打赏
分享
最新回复 (10)
雪    币: 10
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
jetming 2019-9-30 15:33
2
0
可以根据seed和0x2087得到最初的0, 如下.  至于得到seed的前四个, 目前还没想到.
return_125F=0x2087

def get_internal(return_125F):
	Seed_125F_b4=[0x59,0x63,0x54,0x07,0x7F,0xFF,0xFF,0xFF]
	Seed_125F_b48=[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]
	for seed_index in range (7,-1,-1):
		for count in range(0,8):
			Seed_125F_b48[count] = Seed_125F_b4[seed_index]
			Seed_125F_b4[seed_index] = Seed_125F_b4[seed_index]>>1
		for count in range(7, -1, -1):
			#print(Seed_125F_b48[count])
			if (Seed_125F_b48[count]&1 == 0):
				return_125F_tmp1=(return_125F^0x8408)<<1|1
				return_125F_tmp2=return_125F<<1
			else:
				return_125F_tmp1=(return_125F^0x8408)<<1
				return_125F_tmp2=return_125F<<1|1
			if (return_125F_tmp1>return_125F_tmp2):
				return_125F=return_125F_tmp2
			else:
				return_125F=return_125F_tmp1
			#print(hex(return_125F))
		#print("")
	return return_125F
return_internal=get_internal(return_125F)
print(hex(return_internal))


最后于 2019-9-30 15:38 被jetming编辑 ,原因:
雪    币: 47
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
frdGo 2019-9-30 15:54
3
0
最开始是想这样逆推回去的
import random

def decode(z):
    x = 0
    
    for i in range(8):
        for j in range(8):
            ri = random.randint(0, 1)
            if ri == 0:
                z = z<<1
                x = (x<<1)+0
            else:
                z = (z^0x8408)<<1
                x = (x<<1)+1
                #x = x + (1<<j)
            print(hex(z&0xffff))
        print("---: "+hex(x&0xff))
#decode(0x2087)
后面发现不行, 还需要最后计算完时 z为0
最后还是c++暴力搜索
	for (u64 s = 0xffffff7f00000000; s < 0xffffff8000000000; s++) {
		//s = 0xffffff7f07546359;
		u64 z = 0;
		for (int i = 0; i < 64; i++) {
			if (((s >> i) & 1) != (z & 1)) {
				z = (z >> 1) ^ 0x8408;
			} else {
				z = (z >> 1);
			}
		}
		if (z == 0x2087) {
			printf("%llx\n", s);
		}
	}

雪    币: 21
活跃值: (212)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
dswkc 2019-9-30 15:59
4
0
jetming 可以根据seed和0x2087得到最初的0, 如下.&nbsp; 至于得到seed的前四个, 目前还没想到. return_125F=0x2087 def&nbsp;get_i ...
感谢回复,这个应该还是用seed了吧?  我就是想导出这个seed  
雪    币: 21
活跃值: (212)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
dswkc 2019-9-30 16:05
5
0
frdGo 最开始是想这样逆推回去的import&nbsp;random def&nbsp;decode(z): &nbsp;&nbsp;&nbsp;&nb ...
3楼的兄弟,感谢回复。

俺还没有c++的能力,但是看起来好像和python差不离,我试着搞搞看
雪    币: 10
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
jetming 2019-9-30 16:29
6
0
dswkc 3楼的兄弟,感谢回复。 俺还没有c++的能力,但是看起来好像和python差不离,我试着搞搞看
三楼的代码, 找到的条件应该是 z == 0x674吧( 就是利用0x2087和后四个seed逆推到的值).   这样确实有很多个s,  能找到一个s=0xffffff7f07546359.  
最后于 2019-9-30 16:30 被jetming编辑 ,原因:
雪    币: 414
活跃值: (531)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
nig 4 2019-9-30 17:25
7
0
我认为此种方法不可逆,因为根据之前的算法分析,SEED右移一位,比较是否与结果尾数相同,进2个不同分支。问题就在这里,2个分支产生的结果是什么,如果 还是0或1,那2者是相同的输出,就不好判断结果来源于哪个分支,如果 2个分支结果不同,那到是可以考虑直接对应哪一个分支。
雪    币: 21
活跃值: (212)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
dswkc 2019-9-30 19:28
8
0
frdGo 最开始是想这样逆推回去的import&nbsp;random def&nbsp;decode(z): &nbsp;&nbsp;&nbsp;&nb ...
c++ 环境搭建起来了,但是无法运行,可不可以给份完整的代码。
俺实在不会c++
雪    币: 10
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
jetming 2019-9-30 19:58
9
0
#include<stdio.h>
#include<stdint.h>

int main()
{
	for (uint64_t s = 0xffffff7f00000000; s < 0xffffff8000000000; s++) {
		//s = 0xffffff7f07546359;
		uint64_t z = 0;
		for (int i = 0; i < 32; i++) {
			if (((s >> i) & 1) != (z & 1)) {
				z = (z >> 1) ^ 0x8408;
			} else {
				z = (z >> 1);
			}
		}
		if (z == 0x674) {
			printf("%llx\n", s);
			if(s == 0xffffff7f07546359){
				printf("find the seed: %llx\n", s);
				break;
			}
		}
	}
	return 0;
}

最后于 2019-9-30 20:02 被jetming编辑 ,原因:
雪    币: 10
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
jetming 2019-9-30 20:01
10
0
nig 我认为此种方法不可逆,因为根据之前的算法分析,SEED右移一位,比较是否与结果尾数相同,进2个不同分支。问题就在这里,2个分支产生的结果是什么,如果 还是0或1,那2者是相同的输出,就不好判断结果来源 ...
完整seed知道的话, 可以从结果逆推出初始的值. 参考我在1楼贴的代码.
雪    币: 21
活跃值: (212)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
dswkc 2019-9-30 20:25
11
0
jetming #include&lt;stdio.h&gt; #include&lt;stdint.h&gt; int&nbsp;main() { for&am ...
谢谢,原来就差这些。

另外确实有多个解。。。
游客
登录 | 注册 方可回帖
返回