对照HAPP的《Speed Video Splitter算法分析兼RSA实例教程 》分析我手头上的一个RSA算法。有些疑问,向大家请教。
1。大数在内存中存放的格式是怎么确定的?
还是跟进去看一下这个powmod函数:
{
004068F0 >/$>push ecx ; n
004068F1 |.>mov eax, [esp+C]
004068F5 |.>push esi
004068F6 |.>mov esi, [esp+C]
004068FA |.>push ecx ; n
004068FB |.>add ecx, 8
004068FE |.>mov dword ptr [esp+8], 0
00406906 |.>push ecx ; 10001
00406907 |.>push eax ; sn'
00406908 |.>push esi ; 计算结果存在此处
00406909 |.>call <_powmod> ; c =sn' ^ 10001 (mod n)
0040690E |.>add esp, 10
00406911 |.>mov eax, esi
00406913 |.>pop esi
00406914 |.>pop ecx
00406915 \.>retn 8
}
我手上的程序中的关键CALL和HAPP分析的程序中的call <_powmod> 函数代码一模一样,所以可以肯定是RAS了,也有E=10001的敏感数字。但是在用RSATOOL验证的时候,却没办法验证通过。因为参数压栈的格式好像不同。大数存放形式好像也不同。
我的程序中的call <_powmod> 的4个压栈参数是
miracl头文件中关于powmod(m,e,n,c);//计算c=m^e mod n
ESP ==> 0012EE24 0012EE64 ;c
ESP+4 0012EE28 0012EE4C ;m
ESP+8 0012EE2C 0012EE44 ;e
ESP+C 0012EE30 0012EE54 ;n
m=d [[esp+4]]------>00A02620 10 25 A0 00 10 00 00 00 %?...
前4个字节是大数存放地址,也是我输入的M值,后面4个字节表示有16组32bit
e=d [[esp+8]]------>00A02600 60 25 A0 00 01 00 00 00 `%?...
前4个字节是大数存放地址,10001,后面4个字节表示有1组32bit
n=d [[esp+c]]------>00A02640 90 24 A0 00 10 00 00 00 ??...
前4个字节是大数存放地址,也是程序里面的N值,后面4个字节表示有16组32bit
这个跟miracl库中的powmod定义的不一样啊。我输入的M应该在esp+c中啊。
我在跟HAPP的教程时,发现他分析的那个程序中的大数存放地址和我这个完全是反的,大数的组数放在前面,指针地址放在后面,大数存放格式是Little Endian的,而我的好像不是。
N=88C5F181D34D4B6E5375F1511D455E8901127EB1F015E3AC717AE412C95841DF
00E949B0 DF 41 58 C9 12 E4 7A 71 AC E3 15 F0 B1 7E 12 01 吡X?潸q?鸨~
00E949C0 89 5E 45 1D 51 F1 75 53 6E 4B 4D D3 81 F1 C5 88 ?EQ聃SnKM?衽
完全倒序了。
而我分析的程序里面的数据如下:
SN=532AC6364B45DE87...........3EC29795
00A02510 36 C6 2A 53 87 DE 45 4B 6?S?EK
00A02518 0F 47 3D A1 A6 F6 C8 5A G=ˇ鋈Z
00A02520 64 E4 FD 5D 3E 06 C4 82 d潺]>?
00A02528 FC 45 03 D0 95 97 C2 3E ???>
搞了好久了,哪个兄弟能指点一下?谢谢了。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课