某程序RSA算法问题高手指点
本帖最后由 菜鸟中的菜鸟 于 2016-8-6 15:54 编辑学习RSA相关的东西,找高手的逆向文章,结果找了个06年发的逆向图文,也是很老的软件了。逆向图文中有几处不明白,所以想请高手帮忙看下。逆向图文中:
00402FBF|.E8 CC190000 CALL Speed_Vi.00404990 ;RSA运算
00402FC4|.B9 08000000 MOV ECX,8
00402FC9|.33C0 XOR EAX,EAX
00402FCB|.8D7C24 18 LEA EDI,DWORD PTR SS:
00402FCF|.6A 08 PUSH 8
00402FD1|.F3:AB REP STOS DWORD PTR ES:
00402FD3|.8D4C24 1C LEA ECX,DWORD PTR SS:
00402FD7|.C68424 AC0000>MOV BYTE PTR SS:,6
00402FDF|.51 PUSH ECX
00402FE0|.8D4C24 58 LEA ECX,DWORD PTR SS:
00402FE4|.E8 47710000 CALL Speed_Vi.0040A130 ;输出RSA运算结果
00402FE9|.B9 08000000 MOV ECX,8
00402FEE|.33C0 XOR EAX,EAX
00402FF0|.8DBC24 800000>LEA EDI,DWORD PTR SS:
00402FF7|.F3:AB REP STOS DWORD PTR ES: ;堆栈空出空间
00402FF9|.5F POP EDI
00402FFA|>8A5404 17 /MOV DL,BYTE PTR SS:
00402FFE|.8A4C04 16 |MOV CL,BYTE PTR SS:
00403002|.885404 7C |MOV BYTE PTR SS:,DL
00403006|.8B5404 14 |MOV EDX,DWORD PTR SS:
0040300A|.884C04 7D |MOV BYTE PTR SS:,CL
0040300E|.8A4C04 14 |MOV CL,BYTE PTR SS:
00403012|.C1EA 08 |SHR EDX,8
00403015|.885404 7E |MOV BYTE PTR SS:,DL
00403019|.884C04 7F |MOV BYTE PTR SS:,CL
0040301D|.83C0 04 |ADD EAX,4
00403020|.83F8 20 |CMP EAX,20
00403023|.^ 7C D5 \JL SHORT Speed_Vi.00402FFA ; 循环重排序RSA运算结果
00403025|.8D5424 7C LEA EDX,DWORD PTR SS:
00403029|.8D4C24 10 LEA ECX,DWORD PTR SS:
0040302D|.52 PUSH EDX
0040302E|.E8 75FE0000 CALL <JMP.&MFC42.#537>
00403033|.8B4424 10 MOV EAX,DWORD PTR SS:
00403037|.8B4C24 0C MOV ECX,DWORD PTR SS:
0040303B|.50 PUSH EAX
0040303C|.51 PUSH ECX
0040303D|.FFD6 CALL NEAR ESI ;用户名16进制数与计算结果比较
二、算法小结
1.注册码分为8组,s1、s2、s3、s4、s5、s6、s7、s8
验证前预处理:s7=(s1+s6) xor s7 s8=(s2+s3+s4+s5) xor s8
2.RSA256运算
n=5D79D4F2EAF92557CEE8EC453254F2CA9B43197BD424BB6C44A30D1366C11BB9
e=10001
3. 重排序运算结果
B1BE436A 6A43BEB1
F29961A1 ------> A16199F2
6A85B49E 9EB4856A
4. 重排序的运算结果和用户名16进制数比较,相等则注册成功,不等则失败。
三、算法验证
用RSATool工具,根据n、e,求出p、q、d
p=A4A4B5845A655DA9EF76DED6C373A31B
q=9157E97B62A6CFDD8AAA6FC9557355BB
d=2FD52823261A580196DF9A07CEB9A983654FAB5DD473BC2857780CFCF3D9AC01
用户名m=wzwgp -> wzwg-p -> p000wzwg (0x70000000777A7767)
设:X=70000000777A7767 <------ m
Y=2FD52823261A580196DF9A07CEB9A983654FAB5DD473BC2857780CFCF3D9AC01 <------ d
Z=5D79D4F2EAF92557CEE8EC453254F2CA9B43197BD424BB6C44A30D1366C11BB9 <------ n
用Bigclc“X^Y%Z”计算出C
c=1D033EF29AE89BBB1DD3C955D95D4215FEDDD89B3B41131F94F743B93A40440E
变为:1D033EF2-9AE89BBB-1DD3C955-D95D4215-FEDDD89B-3B41131F-94F743B9-3A40440E
3A40440E-94F743B9-3B41131F-FEDDD89B-D95D4215-1DD3C955-9AE89BBB-1D033EF2
计算:s7=58140D63 xor 9AE89BBB=C2FC96D8
s8=A8737188 xor 1D033EF2=B5704F7A
3A40440E-94F743B9-3B41131F-FEDDD89B-D95D4215-1DD3C955-C2FC96D8-B5704F7A
用户名:wzwgp
注册码:3A40440E-94F743B9-3B41131F-FEDDD89B-D95D4215-1DD3C955-C2FC96D8-B5704F7A
注册信息保存在Settings.ini文件里。
上面都是图文中的分析。。而我不明白的地方是:
<1> 文中 00402FBF|.E8 CC190000 CALL Speed_Vi.00404990 ;RSA运算
CALL这么多,怎么能判断出来这个CALL是作用是RSA运算的?
<2> 00402FE4|.E8 47710000 CALL Speed_Vi.0040A130 ;输出RSA运算结果
我跟踪了下,也没有发现RSA的运算结果和 有什么关系???那么RSA加密注册码后,结果放到了那里呢?
我不知道我跟踪的对不对,以用户名test,注册码:11111111-22222222-33333333-44444444-55555555-66666666-77777777-88888888来注册,当然这个是假码了。
加密后的结果如下(不知道判断的对不对),
即 ss:处放的应该是加密后的结果吧,也就是数据区的:0012CFF4处的32字节的数据:
04 40 91 13 54 5E 50 82 09 57 2D D6 F6 5A 91 66 2D E6 87 1D EA 07 96 CF FE 8D F3 08 A1 49 02 2C
稍后,程序又开始进行倒序处理,倒序后再比较用户名来判断是否成功注册。我跟踪的倒序是这样的:
倒序后:(每四位倒序)
13 91 40 04 82 50 5E 54 D6 2D 57 09 66 91 5A F6 1D 87 E6 2D CF 96 07 EA 08 F3 8D FE 2C 02 49 A1
但是呢?文章中
变为:1D033EF2-9AE89BBB-1DD3C955-D95D4215-FEDDD89B-3B41131F-94F743B9-3A40440E
3A40440E-94F743B9-3B41131F-FEDDD89B-D95D4215-1DD3C955-9AE89BBB-1D033EF2
这里可以看出,它的倒序是整个字符串都倒序过来,而我判断是每四位倒序过来。。。。貌似我的判断是错误的,
因为我在生成注册码时,我用的倒序方法生成的不对,而用作者的这种倒序生成的就对。
貌似说的有些乱,意思就是,怎么判断某个CALL是RSA算法的,怎么判断某个CALL是RSA运算结果的。
还有一个就是RSA的结果放到那里,最后一个问题就是它的倒序具体是怎么倒的,为什么是整体倒序而不是我的每四位倒序?
求高手指点,谢谢。
网上这个程序本身已PJ,请使用用户名test, 注册假码11111111-22222222-33333333-44444444-55555555-66666666-77777777-88888888
来小玩一下。上传地址:http://pan.baidu.com/s/1sllEKrj
0040A6A9|.E8 92F8FFFF call Speed_Vi.00409F40 ;rsa end ,在这下断,第一次断下不要管,第二次断下跟进去, 00409FE8|. /7C 56 jl short Speed_Vi.0040A040 ;ECX ,运行到这句,然后右键跟随ECX的地址,发现 两个值 一个是0X10,也就是加密后的值的长度,第二个是 存放加密后的数据的缓冲区,0040A040|> \8D4C24 1C lea ecx,dword ptr ss:,跳出循环到这句就加密完成.可以在缓冲区看到加密数据
username : xuepojiekey : DF360014-C043E5FB-784D041D-DD6F76E1-438D8732-46A5F543-8F0723B6-453D455B LYQingYe 发表于 2016-8-7 15:37
username : xuepojiekey : DF360014-C043E5FB-784D041D-DD6F76E1-438D8732-46A5F543-8F0723B6-453D455B
算法牛,不是让您回复个KEY,问题是我不太明白里面的问题啊。。。。算法牛,可否做个图文教程?{:5_121:} 菜鸟中的菜鸟 发表于 2016-8-8 08:20
算法牛,不是让您回复个KEY,问题是我不太明白里面的问题啊。。。。算法牛,可否做个图文教程?
算法CALL,已经找到,写帖子的话,要花时间,况且牵扯到大数运算,不好解析 LYQingYe 发表于 2016-8-8 08:25
算法CALL,已经找到,写帖子的话,要花时间,况且牵扯到大数运算,不好解析
如果感觉太费时间,可否把关键的问题说一下,加密后的结果放到哪里了?还有一个就是倒序问题,为什么我感觉是每四个倒序一下,而原图文中是所有的都倒序过来。。给截几个图说明下哈。 菜鸟中的菜鸟 发表于 2016-8-8 08:31
如果感觉太费时间,可否把关键的问题说一下,加密后的结果放到哪里了?还有一个就是倒序问题,为什么我感 ...
倒序很简单,例如RSA加密后,为 xuepojie,他会 每次按 4个字节 也就是 xuep ojie分组倒序,第一组从后面倒序,oeux , 然后第二组倒序,eijo ,最后组合 oeuxeijo 菜鸟中的菜鸟 发表于 2016-8-8 08:31
如果感觉太费时间,可否把关键的问题说一下,加密后的结果放到哪里了?还有一个就是倒序问题,为什么我感 ...
我上面说的是,RSA加密后的usrname倒序,Key的倒序,是分组 str1 -str2-.....-str8 倒序为 str8-str7....-str1 00409A10/$83EC 20 sub esp,0x20这里就是 RSA大数运算了,估计,
页:
[1]