首页
社区
课程
招聘
[旧帖] 求助,分析一个算法 0.00雪花
发表于: 2014-2-12 10:36 3486

[旧帖] 求助,分析一个算法 0.00雪花

2014-2-12 10:36
3486
已知 0xFC 0x55 0x1F 0x02 这4个数,通过什么算法与1进行计算得到的结果是190?与2计算的结果是189?

0xFC 0x55 0x1F 0x02 直接也可以进行运算,得到的结果再与1或者2进行计算,最后得到一个0~255之内的数据,语言是C语言。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这个得想想呵呵呵
2014-2-12 11:37
0
雪    币: 150
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
已经想了挺长时间了。还是没有什么眉目啊。不管是先将这4个数求和还是xor还是左移右移。都不对。现在才来求助各位有什么思路么。
2014-2-12 12:31
0
雪    币: 69
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
看不懂意思~
2014-2-13 15:43
0
雪    币: 70
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
逆向分析。
2014-2-13 16:31
0
雪    币: 3697
活跃值: (4262)
能力值: (RANK:215 )
在线值:
发帖
回帖
粉丝
6
直接分析软件才方便,光猜没用。
2014-2-13 16:42
0
雪    币: 0
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
这个要把汇编代码发上来啊。这么光猜不是个方法啊。
2014-2-15 16:02
0
雪    币: 29
活跃值: (499)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
8
我想了个算法,不知合不合要求:
1、0xfc = 252, 0x1f = 31  , 252 - 31 = 221;
2、因为结果与1计算为190,与2计算为189,所以就假设结果为191, 191 -1 = 190, 191 - 2 = 189;
3、既然结果为191,第一步计算结果又为221,所以想方设法让0X55和0X02的计算结果为30(221 - 30 = 191),即0x1e即可;
     算法如下:
     ①、0x55 = 0101 0101   0x02 = 0000 0010  0x1e = 0001 1110;
     ②、0x55逻辑右移2位得0001 0101 ;
     ③、将0x02左移2位得0000 1000 ,再加上②的结果得 0001 1101;
     ④、将0x02逻辑右移1位得0000 0001 ,再加上③的结果得 0001 1110 = 0x1e;
4、解答完毕~

ps: 其实这个题最难的地方不在算法,而在理解楼主的题目意思,我有两种理解:
      1、func(0xfc, 1) = func(0x55, 1).. = 190 ;func(0xfc, 2) = func(0x55, 2)... =189;
      2、func(0xfc, 0x55, 0x1f, 0x02, 1) = 190,func(0xfc, 0x55, 0x1f, 0x02, 2) = 189;
     我理解的是第二种,楼主你要表达的是哪一种呢??
2014-2-15 16:49
0
雪    币: 90
活跃值: (28)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
根据 “最后得到一个 0~255 之内的数据”,和出的数据也都是 1 byte 大小 ,得出算法需要使用位运算才能保证 0~255 的范围 。

已知
1. 某值 运算于 1 = 190
2. 某值 运算于 2 = 189 。

全部转换成二进制码 ,

1.
        某值
运算符  0b0000 0001
-------------------
结果-- 0b1011 1110
2.
        某值
运算符  0b0000 0010
-------------------
结果-- 0b1011 1101

考虑最后两位的变化 ,使用“同或”,“异或”运算符都可以使算式成立 。
使用异或运算符,得:
0b1011-1111 ^ 0b01 = 0b1011-1110
0b1011-1111 ^ 0b10 = 0b1011-1101

根据现在给出的 4 个值,运算出 0b1011-1111 即可 。
令:
A = 0xfc = 0b 1111-1100
B = 0x55 = 0b 0101-0101
C = 0x1F = 0b 0001-1111
D = 0x02 = 0b 0000-0010

观察到 C 0b0001-1111 和目标值 0b1011-1111 的低 5 位 值相同 , B 的高 3 位取反后跟目标值高三位相同 。
得: 目标值 = ( ~B | C ) & 0xFF

0x FF 可又 A | C 得到 。

最后整理代码如下 :
#include<stdio.h>

int func(int a, int b, int c, int  d, int num)

{
	return ( (~b | c) ^ num ) & (a | c);
}

int main(void)
{
	int a=0xfc, b=0x55, c=0x1f, d=0x02;


	printf("num =1 is 0x%d, num =2 is 0x%d.\n", func(a, b, c, d, 1), func(a, b, c, d, 2));

	return 0;
}

输出结果为:
$ ./test 
num =1 is 0x190, num =2 is 0x189.

至此解之 。
2014-2-18 12:24
0
雪    币: 680
活跃值: (68)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
10
9楼正解
2014-2-18 22:04
0
游客
登录 | 注册 方可回帖
返回
//