首页
社区
课程
招聘
[3月话题]如何防止内存中出现明码
2005-3-1 19:53 19218

[3月话题]如何防止内存中出现明码

2005-3-1 19:53
19218
明码泄漏最有名的利用就是+ORC提出的数据约束性的秘诀(Data_constraint),其依据参数或局部变量通常都是存储在堆栈中的,而软件作者一般都使用局部变量存放临时计算出来的注册码,以比较真假,使得它们的位置很接近。

像“序列号 = F(用户名)”算法计算出来的序列号是以明文形式在内存中出现的,很容易在内存中找到它,从而获得注册码。

虽然有时算法控制的好,但稍不留意还会造成明码泄漏,这样例子很多,本期话题就讨论如何避免明码泄漏。

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

收藏
点赞0
打赏
分享
最新回复 (39)
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
nbw 24 2005-3-1 19:57
2
0
先坐个沙发。

我想就是把序列号分步算,分步验证,就算泄漏也不会同时全部泄漏。再就是算法中故意出来很多假的明码,迷惑破解者。
雪    币: 3686
活跃值: (1036)
能力值: (RANK:760 )
在线值:
发帖
回帖
粉丝
cnbragon 18 2005-3-1 20:54
3
0
偶的讨论:
F(序列号)==F(用户名)
F(序列号)==用户名

比如对序列号采用一种算法处理,生成tempSn,然后对用户名采用另外一种算法处理,生成tempName,如果tempSn==tempName,刚验证成功.

这些算法可以采用对称密码学算法或者公钥密码学算法来实现.
雪    币: 262
活跃值: (152)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
vcasm 1 2005-3-1 22:56
4
0
编程的时候写个字符串加密类继承处理所有处理的明文的字符串类,并且修改编译器的头文件,将所有定义字符串和字符的关键字改名,并用具有加密性质的宏替代  嘿嘿~ 想在程序中加明文都难了!
雪    币: 142
活跃值: (268)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
ohuangkeo 3 2005-3-1 23:47
5
0
我也坐坐。我比较认同3楼的,前天我就见过这种比较方法的,还没找到算法呢。
雪    币: 1223
活跃值: (469)
能力值: (RANK:460 )
在线值:
发帖
回帖
粉丝
monkeycz 11 2005-3-2 00:30
6
0
最初由 vcasm 发布
编程的时候写个字符串加密类继承处理所有处理的明文的字符串类,并且修改编译器的头文件,将所有定义字符串和字符的关键字改名,并用具有加密性质的宏替代 嘿嘿~ 想在程序中加明文都难了!

偶想到了敬爱的Ken爷爷
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
riijj 7 2005-3-2 10:02
7
0
如果真的需要储存计算出来的数据,又不想直接存放到 stack 或 heap ,可以考虑用 linked list 把每一个字节分散储存

typedef struct tagDATA
{
        char data;
        struct tagDATA *next;
}DATA;

每一个新建的结构都用 malloc 或 VirtualAlloc ( 可以指明位置 ) 来取得空间
雪    币: 239
活跃值: (145)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
北冥之鱼 3 2005-3-2 10:10
8
0
利用加密算法将注册码变换成一个函数地址,建立异常处理后去执行,如果注册码不正确,将无法得到正确的执行地址,同时这种方法没有比较和跳转。

我认为方法很多,提出方法之一。
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
shoooo 16 2005-3-2 20:00
9
0
最初由 cnbragon 发布
偶的讨论:
F(序列号)==F(用户名)
F(序列号)==用户名

比如对序列号采用一种算法处理,生成tempSn,然后对用户名采用另外一种算法处理,生成tempName,如果tempSn==tempName,刚验证成功.
........


用密码学来解决问题
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
freeeman 2005-3-2 20:21
10
0
最初由 nbw 发布
先坐个沙发。

我想就是把序列号分步算,分步验证,就算泄漏也不会同时全部泄漏。再就是算法中故意出来很多假的明码,迷惑破解者。


这个我赞同。分步算大大增加难度。
此外与随机数进行运算,和保存,任何时候都不在内存出现明码字串。
雪    币: 258
活跃值: (230)
能力值: ( LV12,RANK:770 )
在线值:
发帖
回帖
粉丝
qiweixue 19 2005-3-3 11:10
11
0
俺也做个沙发。。。
把密码计算拆分N个分组,分组之间在通过函数影射,每个分组函数是正确密码的一个部分,只有得到全部的N个分组的函数数值,才能正确。
!!!!!关键最后还是转化成数学问题了
雪    币: 204
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
东方弘 2005-3-3 14:16
12
0
最初由 cnbragon 发布
偶的讨论:
F(序列号)==F(用户名) (1)
F(序列号)==用户名 (2)

比如对序列号采用一种算法处理,生成tempSn,然后对用户名采用另外一种算法处理,生成tempName,如果tempSn==tempName,刚验证成功.
........


方法(2)和明码无异
方法(1)中序列号和用户名殊途同归,要求两个函数多次相交(理论上应有无数个交点),并且其中至少一个算法恐怕要可逆(即由函数值反推出自变量的值),不然,作者自己怎么处理?也有可能被做出注册机。另外,在函数F(序列号)中,若不采取措施,序列号还是会以明码出现的!
雪    币: 260
活跃值: (81)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
萝卜 1 2005-3-3 14:32
13
0
最初由 qiweixue 发布
俺也做个沙发。。。
把密码计算拆分N个分组,分组之间在通过函数影射,每个分组函数是正确密码的一个部分,只有得到全部的N个分组的函数数值,才能正确。
!!!!!关键最后还是转化成数学问题了

雪    币: 214
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
davidnash 1 2005-3-3 21:17
14
0
F(序列号)==F(用户名) 这种方法不错,只要选择好了函数,要想反汇编找到函数并求逆是很困难的
雪    币: 671
活跃值: (723)
能力值: ( LV9,RANK:1060 )
在线值:
发帖
回帖
粉丝
wenglingok 26 2005-3-6 23:01
15
0
看看,学习,再鼎鼎
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hayash 2005-3-7 01:25
16
0
函数1(用户名)计算出中间值A;
函数2(用户输入的注册码)计算出中间值B;
比较A和B;
雪    币: 342
活跃值: (323)
能力值: ( LV9,RANK:450 )
在线值:
发帖
回帖
粉丝
netsowell 11 2005-3-10 13:58
17
0
我的方法更加简单
Hash(注册码)==Hash(真注册码)
这样就算出现拉。如果Hash是md5等等,也没有办法。
雪    币: 234
活跃值: (61)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
benbentaiyang 1 2005-3-11 08:56
18
0
都用到了密码学的东西,偶菜鸟看不懂,但理解各位的意思,有没有一些简单并凑效的办法啊,不用密码学那套算法什么的。
雪    币: 279
活跃值: (375)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
lordor 6 2005-3-11 13:09
19
0
最初由 netsowell 发布
我的方法更加简单
Hash(注册码)==Hash(真注册码)
这样就算出现拉。如果Hash是md5等等,也没有办法。


老大,是不是打错了?计算md5前还压入真码?
雪    币: 2367
活跃值: (756)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
小虾 10 2005-3-11 19:52
20
0
最初由 lordor 发布


老大,是不是打错了?计算md5前还压入真码?

我也以为。。。
他的意思应该是Hash(注册码) == 和经过Hash(真注册码)加密的Hash值比较吧。
雪    币: 342
活跃值: (323)
能力值: ( LV9,RANK:450 )
在线值:
发帖
回帖
粉丝
netsowell 11 2005-3-11 20:25
21
0
最初由 lordor 发布


老大,是不是打错了?计算md5前还压入真码?

表达错误
Hash(注册码)==真注册码的hash值
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
riijj 7 2005-3-11 21:20
22
0
最初由 netsowell 发布

表达错误
Hash(注册码)==真注册码的hash值


真正注册码的 hash 值,是固定的,还是根据注册名字在程序里计出来的 ?
如果是以注册名字计算出来,这样便跟普通的注册码检查同样存在 stack 出现明码的问题
雪    币: 299
活跃值: (300)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
clide2000 7 2005-3-11 22:32
23
0
最初由 riijj 发布


真正注册码的 hash 值,是固定的,还是根据注册名字在程序里计出来的 ?
如果是以注册名字计算出来,这样便跟普通的注册码检查同样存在 stack 出现明码的问题


同意楼上兄弟的说法
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
freeeman 2005-3-12 01:04
24
0
设f1 f2满足交换律:
f2( f1(m) ) = f1( f2(m) )

设m=f1(user); 真实的key=f2(user);
检验f1(inputkey) == f2(m)即可.
本法的弊端是不能泄漏加密机制,所以也有一定局限性。
雪    币: 389
活跃值: (912)
能力值: ( LV9,RANK:770 )
在线值:
发帖
回帖
粉丝
kyc 19 2005-3-13 12:00
25
0
关键是能不能求逆,不然自己都不知道注册码了.
游客
登录 | 注册 方可回帖
返回