首页
社区
课程
招聘
[旧帖] [讨论]这个代码发了3次了,求解 0.00雪花
发表于: 2012-2-18 19:47 1555

[旧帖] [讨论]这个代码发了3次了,求解 0.00雪花

2012-2-18 19:47
1555
这段代码 我贴了好几次了,但是始终不明白。  


这个个crackme困惑我好久。。。。。开始我看到它和1比,它为什么先要与111比啊?然后第二次比的时候为什么由DWORD变为WORD?而且又和3EA比。难道3EA是密码吗? 结果证明不是。  我也不知道是谁和谁比。请各位大牛详细解释一下这些代码,作为新手的我真的很难,谢谢大家!
  最后我把整个CRACKME贴出来
1.rar

[课程]Linux pwn 探索篇!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 180
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
111 和 3EA 好像是消息响应,你可以在它们上面下断看下。
当 [esp+8]=111 且 [esp+C]=3EA 时,才表示你才按下了Regist按钮,才对你的注册码进行验证。
否则跳过。
2012-2-18 20:23
0
雪    币: 104
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
00401063   .  E8 98010000   call 1.00401200

这个函数里GetDlgItemText之后进行验证,返回值是验证的结果。1为验证通过
2012-2-18 20:34
0
雪    币: 585
活跃值: (568)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
4
signed int __cdecl sub_401200()
{
        int i; // ebx@1
        unsigned int v1; // ebp@1
        signed int v2; // esi@1
        unsigned int v3; // edi@1
        int nStringCount; // eax@1
        unsigned __int64 v5; // qax@6
        bool v6; // zf@6
        unsigned int v7; // esi@7
        unsigned __int64 v8; // kr08_8@7
        signed int result; // eax@9
        char *pChar; // [sp+10h] [bp-28h]@3
        int v11; // [sp+14h] [bp-24h]@5
        int nStringCount1; // [sp+18h] [bp-20h]@2
        unsigned int v13; // [sp+20h] [bp-18h]@1
        CHAR String; // [sp+24h] [bp-14h]@1

        i = 0;
        v1 = 0;
        v13 = 0;
        v2 = 1;
        v3 = 0;
        LOBYTE(nStringCount) = GetDlgItemTextA(dword_4056BC, 1000, &String, 20);
        if ( !(_BYTE)nStringCount )
                goto LABEL_13;
        nStringCount = (char)nStringCount;
        nStringCount1 = (char)nStringCount;
        if ( (char)nStringCount > 0 )
        {
                pChar = (char *)&v13 + nStringCount + 3;    // pChar指向String的最后一个字符
                do
                {
                        if ( i > 0 )
                        {
                                v11 = i;
                                do
                                {
                                        v5 = 10 * __PAIR__(v3, v2);           //  __PAIR__(v3, v2) == v3 * v2;
                                        v2 *= 10;
                                        v6 = v11 == 1;
                                        v3 = HIDWORD(v5);
                                        --v11;
                                }
                                while ( !v6 );
                        }
                        v8 = ((signed int)*pChar - 48) * __PAIR__(v3, v2) + __PAIR__(v13, v1);
                        v7 = (((signed int)*pChar - 48) * __PAIR__(v3, v2) + __PAIR__(v13, v1)) >> 32;
                        v1 = v8;
                        v3 = 0;
                        ++i;
                        v13 = v7;
                        v2 = 1;
                        --pChar;
                }
                while ( i < nStringCount1 );
        }
        if ( (v1 & 0xFF23301)
                + (unsigned __int64)((signed __int64)(3123612579u * __PAIR__(v13, v1)) / 34359738368i64)
                + ~v1 * v1 == -2030062152 )
                result = 1;
        else
LABEL_13:
        result = 0;
        return result;
}
2012-2-18 21:59
0
雪    币: 585
活跃值: (568)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
5
假设v13为x, v1为y,

根据 if ( (v1 & 0xFF23301)
    + (unsigned __int64)((signed __int64)(3123612579u * __PAIR__(v13, v1)) / 34359738368i64)
    + ~v1 * v1 == -2030062152 )
可以得到一个方程,

根据
    v8 = ((signed int)*pChar - 48) * __PAIR__(v3, v2) + __PAIR__(v13, v1);
      v7 = (((signed int)*pChar - 48) * __PAIR__(v3, v2) + __PAIR__(v13, v1)) >> 32;
可以得到一个方程,

最后解二元一次方程,
可以得到x,y的值,再去推注册码吧,我操,,
2012-2-18 22:02
0
游客
登录 | 注册 方可回帖
返回
//