首页
社区
课程
招聘
[求助]FGInt RSA 问题
发表于: 2008-9-21 00:41 7746

[求助]FGInt RSA 问题

2008-9-21 00:41
7746
FGInt RSA 问题

有一程序PEID插件CryptoANALyzer 检测到Base10StringToFGInt和RSADecrypt


因为:

查相关资料得RSADecrypt原型:

RSADecrypt(test,   d,   n,   Nilgint,   Nilgint,   Nilgint,   Nilgint,   test);
其中test是C和M
共8个参数

fastcall:
     是Delphi默认所使用的参数传递方式,此种方式在传递参数时把前三个参数放在CPU的EAX,EDX,ECX三个缓存器种,剩下的参数则会由左到右地被取出放到堆栈中,而当被调用的函数结束之       后,则是由被调用函数来清除堆栈上的参数数据.

所以....

代码:
0051BF63   .  8D45 D8       lea     eax, dword ptr [ebp-28]        4        nul
0051BF66   .  50            push    eax
0051BF67   .  8D45 D8       lea     eax, dword ptr [ebp-28]        5        nul
0051BF6A   .  50            push    eax
0051BF6B   .  8D45 D8       lea     eax, dword ptr [ebp-28]        6        nul
0051BF6E   .  50            push    eax
0051BF6F   .  8D45 D8       lea     eax, dword ptr [ebp-28]        7        nul
0051BF72   .  50            push    eax
0051BF73   .  8D45 F4       lea     eax, dword ptr [ebp-C]        8        test  结果,即M
0051BF76   .  50            push    eax
0051BF77   .  8D4D E0       lea     ecx, dword ptr [ebp-20]
0051BF7A   .  8D55 E8       lea     edx, dword ptr [ebp-18]
0051BF7D   .  8B45 F0       mov     eax, dword ptr [ebp-10]
0051BF80   .  E8 EFFBFEFF   call    <RsaDecrypt>
寄存器:
EAX 00EB2EA8        1                test  即C
ECX 0012FDD8        3                D
EDX 0012FDE0        2                N
EBX 0043D76C b.0043D76C
ESP 0012FBC0
EBP 0012FDF8
ESI 00EA17C8
EDI 00516AC0 b.00516AC0
EIP 0051BF80 b.0051BF80

不知以上分析是否正确,忘指教 :)

看其值:
C/eax=[00eb2ea8]

00EB2EA8  3F A8 4C 5C 53 D3 F8 F2 86 DA 59 98 78 29 CA BE  ?↙\S峪騿赮榵)示
00EB2EB8  2D 30 8D 3A C1 DF 82 15 D9 DA 20 BA 5B 2C 2C 43  -0?吝?仝 篬,,C
00EB2EC8  00 76 52 00 0C 76 52 00 B8 0A EB 00 30 11 00 00  .vR..vR.??0..

C=3FA84C5C53D3F8F286DA59987829CABE2D308D3AC1DF8215D9DA20BA5B2C2C43

D/ecx=[0012FDD8]

0012FDD8  01 00 00 00 0C 1B EB 00 01 00 00 00 68 32 EA 00  ....?...h2?
0012FDE8  A8 2E EB 00 D8 CD 51 00 64 2B EA 00 64 2B EA 00  ??赝Q.d+?d+?

C=1                      //?????这里是不是有问题?

N/edx=[0012FDE0]

0012FDE0  01 00 00 00 68 32 EA 00 A8 2E EB 00 D8 CD 51 00  ...h2???赝Q.
0012FDF0  64 2B EA 00 64 2B EA 00 1C FE 12 00 87 18 47 00  d+?d+??.?G.

N=1                     //...

RSADecrypt后得到明文M

00EB2E88  55 6E 52 65 67 69 73 74 65 72 20 56 65 72 73 69  UnRegister Versi
00EB2E98  6F 6E 00 00 32 00 00 00 01 00 00 00 20 00 00 00  on..2...... ...

M="UnRegister Version"

前面还有一段代码,觉得有点可疑

Base10StringToFGInt()
333335333939333634343735373034383137303933393439373735383035343732353832363033

Base10StringToFGInt()
3633343632333337323731343932303238373136383536313837333630333930393637363130393931333833393837373530363235393934383134313230383431313637343836393332313337

难道这两个才是D和M?但长度相差...

还有一个问题就是如果确定这个是RSA几?RSA128?RSA93?等等...
对RSA不了解呵

指点迷津 不胜感激

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
  • 2.jpg (78.77kb,164次下载)
  • 1.jpg (17.75kb,162次下载)
收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 439
活跃值: (619)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
咋没人回啊~~~睡啦明天早上要升旗...希望升完旗回来能有一点提示 :)
2008-9-21 02:18
0
雪    币: 439
活跃值: (619)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
老大能不能提示一点?....原来是明天升旗..看错星期...
2008-9-21 16:38
0
雪    币: 296
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
晋升的吧?~~~~~~~~~
2008-9-21 16:52
0
雪    币: 1126
活跃值: (156)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
5
FGInt内部数据结构使用的31bit,因此你不能直接COPY内存。除非你转成BASE256的字符串.
[+0]=Sign
[+4]才是真正的数据指针.
2008-9-21 17:29
0
雪    币: 439
活跃值: (619)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
啥?你是说FGInt 还是说升旗?
2008-9-22 07:31
0
雪    币: 439
活跃值: (619)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
[QUOTE=DiKeN;511644]FGInt内部数据结构使用的31bit,因此你不能直接COPY内存。除非你转成BASE256的字符串.
[+0]=Sign
[+4]才是真正的数据指针.[/QUOTE]

刚升完旗回来,很高兴看到有人回哈哈.DikeN兄能不能就着我上面的分析说明一下?
Sign即不变的喽?
[+4]是什么的数据指针?即指向D或N的?好我去看看这个哈.
FGInt 数据结构我去查一下,希望能继续提示 :)
2008-9-22 07:35
0
雪    币: 439
活跃值: (619)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
DiKeN兄的意思是否:
寄存器:
EAX 00EB2EA8  1    test  即C
ECX 0012FDD8  3    D
EDX 0012FDE0  2    N
EBX 0043D76C b.0043D76C
ESP 0012FBC0
EBP 0012FDF8
ESI 00EA17C8
EDI 00516AC0 b.00516AC0
EIP 0051BF80 b.0051BF80



但指向的数据是



其实我的目的就是能从这个RSADecrypt(M=C^D mod N)找出D和N来 :)
理解能力有限,多多指教啊!
上传的附件:
  • 3.jpg (18.08kb,145次下载)
  • 4.jpg (21.23kb,146次下载)
2008-9-22 07:57
0
雪    币: 1126
活跃值: (156)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
9
对好像是对的,但怎么你这个数据不对呢. 你这个数肯定是个偶数啊。
N=P*Q正常情况下绝对是奇数。
//
  zq: array[0..19] of byte = (
        $04, $00, $00, $00, $67, $2B, $60, $3D, $6A, $F0, $F4, $4A, $64, $34, $2B, $1A,
        $B4, $8D, $3B, $07
  );
//

  q.Sign := positive;
  SetLength(q.Number, Sizeof(zq) shr 2);
  Move(zq, q.Number[0], SizeOf(zq));
  FGIntToBase10String(q, str);
  Memo1.Lines.Add('q:' + str);

这样就可以转成十进制。也可以转成别的进制。

zq是内存中Dump出来的,
01 xx xx xx Number Pointer
从Number Pointer指针里面复制出来的。
可以看到 Number Pointer - 4 的地方应该是[Number Pointer] + 1= [Number Pointer - 4]
2008-9-22 13:15
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
10
中国股市配色方案啊
2008-9-22 13:26
0
雪    币: 439
活跃值: (619)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
对了[Number Pointer] + 1= [Number Pointer - 4] ->5+1=6


可是为什么呢?你有FGInt的想关资料吗?比连源码或库
我上网找没找着....呵

zq的大小你是如何确定的?根据FGInt?

那我这里
zq[]="/x05/x00/x00/x00/x00/x00/x00/x00/xCB/x2B/x68/x21/x00/x00/x00/x00/xCB/x1B/x34/x09";
是吗?

那ECX即D呢?那里会得到什么?
09 00 00 00 00 00 00 00 A9 54 85 78 00 00 00 00 1F 9D F4 2F

11点了要睡觉啦写不赢啦
我还是不知道如何得到D,N
DikeN继续指点:)
上传的附件:
  • 5.jpg (16.69kb,125次下载)
2008-9-22 23:04
0
雪    币: 1126
活跃值: (156)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
12
http://www.submanifold.be/triade/GInt/gint.html
自己去调试吧.
2008-9-24 18:11
0
雪    币: 721
活跃值: (350)
能力值: ( LV9,RANK:1250 )
在线值:
发帖
回帖
粉丝
13
呵呵                       .
2008-9-25 10:31
0
雪    币: 439
活跃值: (619)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
几天没上网,没想DikeN还是那么有耐心
上次发完贴后就逛了一下,最后在submanifold.be找到了FGInt,和DiKeN说的一样 :)
然后又下载了个DELPHI 7精简版。
以前没用过delphi,这次也算是上手了呵

终于有点头绪了 : ) 主要就是弄明白FGInt的结构:)
FGInt
{
        Sign:TSign;
        Number:Array of Cardinal;   //可以由Length(fgint.Number)来取得元素个数
}

其实挺简单的...

0051BE5C   .  8D55 E8       lea     edx, dword ptr [ebp-18]              ;335399364475704817093949775805472582603

0051BE5F   .  A1 80815200   mov     eax, dword ptr [528180]
0051BE64   .  E8 7FD8FEFF   call    <Base10StringToFGInt>
0051BE69   .  8D55 E0       lea     edx, dword ptr [ebp-20]              ;63462337271492028716856187360390967610991383987750625994814120841167486932137

0051BE6C   .  A1 84815200   mov     eax, dword ptr [528184]
0051BE71   .  E8 72D8FEFF   call    <Base10StringToFGInt>

Delphi代码如下

program Project1;

{$APPTYPE CONSOLE}

  uses
  Windows,
  Messages,
  FGInt,
  FGIntRSA;

Var
    n,e: TFGInt;
    name,sn: String;
    size,i:Integer;
  Begin

    Base10StringToFGInt('335399364475704817093949775805472582603', n);

    size:=SizeOf(n);
    writeln('Size of n:',size);
    size:=SizeOf(TFGInt);
    writeln('Size of TFGInt:',size);
    size:=SizeOf(n.Sign);
    writeln('Size of Sign:',size);
    size:=SizeOf(n.Number);               //写这些时还没看帮助,这时还不知道Length可以取得array of的长度 :)
    writeln('Size of Number:',size);

    size:=Length(n.Number);      //length可以取得
    writeln('Lenght of n.Number:',size);

    for i:=0 to size do
      Writeln(i,':',n.Number[i]);

      Base10StringToFGInt('63462337271492028716856187360390967610991383987750625994814120841167486932137', n);

    size:=SizeOf(n);
    writeln('Size of n:',size);
    size:=SizeOf(TFGInt);
    writeln('Size of TFGInt:',size);
    size:=SizeOf(n.Sign);
    writeln('Size of Sign:',size);
    size:=SizeOf(n.Number);
    writeln('Size of Number:',size);

    size:=Length(n.Number);
    writeln('Lenght of n.Number:',size);

    for i:=0 to size do
      Writeln(i,':',n.Number[i]);
  End;

OD里调试我的程序,看到内存里


目标程序里的则是

为什么会这样?
问题W:这里n.Number的每个元素都会空一个DWORD??


D=335399364475704817093949775805472582603
N=63462337271492028716856187360390967610991383987750625994814120841167486932137
M=3FA84C5C53D3F8F286DA59987829CABE2D308D3AC1DF8215D9DB30BA5B2C2C43

So

C=????
最后C得出乱码...
这种情况是因为目标程序的Base10StringToFGInt有变形是吗?

几天没想这个问题了,下午放学回来再弄弄,上课去了

再次感谢DikeN :)
上传的附件:
2008-9-26 14:02
0
游客
登录 | 注册 方可回帖
返回
//