首页
社区
课程
招聘
[转帖]mars2's crackme(适合新手)
发表于: 2009-11-28 11:17 6745

[转帖]mars2's crackme(适合新手)

2009-11-28 11:17
6745
在crackmes.de上面看到的一个unsolved crackme
跟了一下有点儿意思,发上来给大家看看。

由于序列号是唯一的,算出来了就不要发上来了,偷着乐吧

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 228
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我成功了,呵呵!
上传的附件:
2009-11-28 22:31
0
雪    币: 220
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
[QUOTE=飞天蜈蚣;719068]我成功了,呵呵![/QUOTE]

恭喜恭喜
2009-11-29 10:00
0
雪    币: 151
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
好一朵美丽的xx花
2009-12-19 19:55
0
雪    币: 246
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
5
似乎作者是想说明VMP也不是很难
到最后是个数学问题,不知我跟对了没,我写个小程序跑跑验证下
2009-12-19 22:24
0
雪    币: 246
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
贴下自己的分析,请大家看看是不是正确的,怎么求不出正确的注册码啊
004011E1   > /8A81 40304000 MOV AL,BYTE PTR DS:[ECX+403040]          ;  假码处理过程
004011E7   . |2C 30         SUB AL,30
004011E9   . |3E:88044D 503>MOV BYTE PTR DS:[ECX*2+403050],AL        ;  得到假码的数值
004011F1   . |3E:DF044D 503>FILD WORD PTR DS:[ECX*2+403050]
004011F9   . |41            INC ECX
004011FA   . |3BCF          CMP ECX,EDI
004011FC   .^\75 E3         JNZ SHORT 004011E1
004011FE   .  90            NOP                                      ;  假码放入00403050
004011FF   .  90            NOP
00401200   .  90            NOP
00401201   .  90            NOP
00401202   .  90            NOP
00401203   .  33F6          XOR ESI,ESI
00401205   .  33C9          XOR ECX,ECX
00401207   >  3E:8A044D 503>MOV AL,BYTE PTR DS:[ECX*2+403050]        ;  假码处理,6次方
0040120F   .  F7E0          MUL EAX
00401211   .  F6244D 503040>MUL BYTE PTR DS:[ECX*2+403050]
00401218   .  F7E0          MUL EAX
0040121A   .  03F0          ADD ESI,EAX
0040121C   .  41            INC ECX
0040121D   .  33C0          XOR EAX,EAX
0040121F   .  3BCF          CMP ECX,EDI
00401221   .^ 75 E4         JNZ SHORT 00401207                       ;  每位的6次方累加到esi
00401223   .  8935 A0304000 MOV DWORD PTR DS:[4030A0],ESI            ;  esi放入4030a0
00401229   .  90            NOP
0040122A   .  90            NOP
0040122B   .  90            NOP
0040122C   .  90            NOP
0040122D   .  90            NOP
0040122E   .  90            NOP
0040122F   .  90            NOP
00401230   .  90            NOP
00401231   .  90            NOP
00401232   .  90            NOP
00401233   .  90            NOP
00401234   .  90            NOP
00401235   .  C705 70304000>MOV DWORD PTR DS:[403070],0A             ;  累加值要等于0186A0

然后就用c写了个小程序跑下。一直没结果。编程上应该没啥问题,那就是分析错了,请各位指点下。
#include<iostream.h>
void main()
{
        int sum,temp,i,n;
        for (i=222222;i<999999;i++)
        {
                temp=i,sum=0;
                while(temp!=0)         
                 {     
          n=temp%10;
                  sum=sum+(n*n*n*n*n*n);
          temp=temp/10;
                 }  
                 if (sum==100000)
                 {
                        cout<<"num is "<<i<<endl;
                 }

        }

}
2009-12-23 10:27
0
雪    币: 440
活跃值: (87)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
7
/*

  mars's mars2.exe

  寻找一个6位数,满足
  (1)各个位上的数字在2~9之间;
  (2)各个位上的数字的6次方的和=该数本身。

*/
#include <stdio.h>

int pow6(int x)
{
	int y = x * x;
	y *= x;
	y *= y;
	return y;
}

int main()
{
	int a[6], b, c;
	for (a[0]=2; a[0]<=9; a[0]++)
	{
		for (a[1]=2; a[1]<=9; a[1]++)
		{
			for (a[2]=2; a[2]<=9; a[2]++)
			{
				for (a[3]=2; a[3]<=9; a[3]++)
				{
					for (a[4]=2; a[4]<=9; a[4]++)
					{
						for (a[5]=2; a[5]<=9; a[5]++)
						{
							b = pow6(a[0])+pow6(a[1])+pow6(a[2])+
								pow6(a[3])+pow6(a[4])+pow6(a[5]);
							c = a[0] + a[1]*10 + a[2]*100 +
								a[3]*1000 + a[4]*10000 + a[5]*100000;
							if (b==c)
							{
								printf("%d\n", b); /* print out 548834 */
							}
						}
					}
				}
			}
		}
	}
	return 0;
}
2009-12-23 13:09
0
雪    币: 246
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
8
原来是等于自己本身啊,分析错了
感谢asdfslw的指点,我再仔细看看对注册码处理的那一段
对自己的代码改动下,很乱的说,呵呵。而且扩展性,重用性很差
#include<iostream.h>
void main()
{
  int sum,temp,i,n;
  for (i=222222;i<999999;i++)
  {
    temp=i,sum=0;
    while(temp!=0)         
     {     
          n=temp%10;
          sum=sum+(n*n*n*n*n*n);
          temp=temp/10;
     }  
     if (sum==i)
     {
      cout<<"num is "<<i<<endl;
     }
  }
}
我觉得用while语句获取各位上的数字更为方便,而且代码简洁,100位的也没关系
2009-12-23 13:47
0
雪    币: 67
活跃值: (581)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
。。老是大牛呀
2009-12-23 14:20
0
雪    币: 197
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
最近在看C++ Template,用Template写了个注册算法,编译时进行模板展开进行运算,耗时
未知,仅测试了 100~999 内 d2^3+d1^3+d0^3=n 的结果。

template <int n, int i>
struct get_digit{
	static int value(){
		//return get_digit<(n/10), i - 1>::value();
		return m_value;
	}
	static int const m_value = get_digit<n/10, i-1>::m_value;
};

template <int n>
struct get_digit<n, 0>{
	static int const value(){
		return m_value;
	}
	static int const m_value = n%10;
};

template <int n, int i>
struct power{
	static int value(){
		return n*power<n, i-1>::value();
	}
};

template <int n>
struct power<n, 0>{
	static int const value(){
		return 1;
	}
};

template <int n>
struct check{
	static bool value(){
		const int sum = 
			power<get_digit<n, 5>::m_value, 6>::value() + 
			power<get_digit<n, 4>::m_value, 6>::value() + 
			power<get_digit<n, 3>::m_value, 6>::value() + 
			power<get_digit<n, 2>::m_value, 6>::value() + 
			power<get_digit<n, 1>::m_value, 6>::value() + 
			power<get_digit<n, 0>::m_value, 6>::value()
			;
		return sum == n;
	}
};

template <int a, int b>
struct find{
	static int value(){
		return find<a, a>::value() != -1 ? a : find<a+1, b>::value();
	}
};

template <int a>
struct find<a, a>{
	static int value(){
		return check<a>::value() ? a : -1;
	}
};

void main()
{
	cout << (find<100000, 999999>::value()) << endl;
}
2010-1-2 23:45
0
雪    币: 238
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
我明白了,

0040127B   .  DB05 A0304000 FILD DWORD PTR DS:[4030A0]               ;  将数压栈,装入ST0
00401281   .  D8D9          FCOMP ST(1)                              ;  实数比较:ST(0)-ST(i),设置标志位,执行一次出栈操作
00401283   .  DFE0          FSTSW AX                                 ;  将FPU状态字保存到AX,检查非屏蔽浮点异常
2010-1-4 13:13
0
雪    币: 101
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
一直跟到6位数每一位的6次方的和
往下就看不懂了……
2010-1-5 15:38
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
<script>
  var sum=0;
  for(var a=2;a<=9;a++){
    suma=Math.pow(a,6);
    for(var b=2;b<=9;b++){
      sumb=Math.pow(b,6);
      for(var c=2;c<=9;c++){
         sumc=Math.pow(c,6);
         for(var d=2;d<=9;d++){
           sumd=Math.pow(d,6);
           for(var e=2;e<=9;e++){
             sume=Math.pow(e,6);
             for(var f=2;f<=9;f++){
               sumf=Math.pow(f,6);
               sum=suma+sumb+sumc+sumd+sume+sumf;
               if(sum>234567 && sum<987654){
                 if(a*100000+b*10000+c*1000+d*100+e*10+f==sum)                  
                  document.write(sum+"<br>");
              }
              sum=0;
            }       
          }
        }
      }
    }
  }
</script>
2010-1-22 14:53
0
雪    币: 246
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
14
0040119D   .  6A 64         PUSH 64                                  ; /Count = 64 (100.)
0040119F   .  68 40304000   PUSH 403040                              ; |Buffer = mars2.00403040
004011A4   .  68 95010000   PUSH 195                                 ; |ControlID = 195 (405.)
004011A9   .  FF75 08       PUSH DWORD PTR SS:[EBP+8]                ; |hWnd
004011AC   .  E8 6F010000   CALL 00401320                            ; \GetDlgItemTextA
004011B1   .  83F8 06       CMP EAX,6                                ;  取假码,等于六位
004011B4   .  0F85 41010000 JNZ 004012FB                             ;  mars2.004012FB
004011BA   .  33FF          XOR EDI,EDI
004011BC   >  80BF 40304000>CMP BYTE PTR DS:[EDI+403040],32          ;  在2~9之间的数字
004011C3   .  0F8C 32010000 JL 004012FB                              ;  mars2.004012FB
004011C9   .  80BF 40304000>CMP BYTE PTR DS:[EDI+403040],39
004011D0   .  0F8F 25010000 JG 004012FB                              ;  mars2.004012FB
004011D6   .  47            INC EDI
004011D7   .  48            DEC EAX
004011D8   .^ 75 E2         JNZ SHORT 004011BC                       ;  mars2.004011BC
004011DA   .  90            NOP
004011DB   .  90            NOP
004011DC   .  90            NOP
004011DD   .  90            NOP
004011DE   .  90            NOP
004011DF   .  33C9          XOR ECX,ECX
004011E1   >  8A81 40304000 MOV AL,BYTE PTR DS:[ECX+403040]
004011E7   .  2C 30         SUB AL,30
004011E9   .  3E:88044D 503>MOV BYTE PTR DS:[ECX*2+403050],AL        ;  假码放入00403050处
004011F1   .  3E:DF044D 503>FILD WORD PTR DS:[ECX*2+403050]
004011F9   .  41            INC ECX
004011FA   .  3BCF          CMP ECX,EDI
004011FC   .^ 75 E3         JNZ SHORT 004011E1                       ;  mars2.004011E1
004011FE   .  90            NOP
004011FF   .  90            NOP
00401200   .  90            NOP
00401201   .  90            NOP
00401202   .  90            NOP
00401203   .  33F6          XOR ESI,ESI
00401205   .  33C9          XOR ECX,ECX                              ;  ecx做循环器
00401207   >  3E:8A044D 503>MOV AL,BYTE PTR DS:[ECX*2+403050]        ;  把放入内存的假码依次放入al
0040120F   .  F7E0          MUL EAX
00401211   .  F6244D 503040>MUL BYTE PTR DS:[ECX*2+403050]
00401218   .  F7E0          MUL EAX
0040121A   .  03F0          ADD ESI,EAX
0040121C   .  41            INC ECX
0040121D   .  33C0          XOR EAX,EAX
0040121F   .  3BCF          CMP ECX,EDI                              ;  每个数字六次方累加放入esi
00401221   .^ 75 E4         JNZ SHORT 00401207                       ;  mars2.00401207
00401223   .  8935 A0304000 MOV DWORD PTR DS:[4030A0],ESI            ;  运算结果放入4030a0
00401229   .  90            NOP
0040122A   .  90            NOP
0040122B   .  90            NOP
0040122C   .  90            NOP
0040122D   .  90            NOP
0040122E   .  90            NOP
0040122F   .  90            NOP
00401230   .  90            NOP
00401231   .  90            NOP
00401232   .  90            NOP
00401233   .  90            NOP
00401234   .  90            NOP
00401235   .  C705 70304000>MOV DWORD PTR DS:[403070],0A
0040123F   .  DB05 70304000 FILD DWORD PTR DS:[403070]
00401245   .  C705 80304000>MOV DWORD PTR DS:[403080],186A0
0040124F   .  DB05 80304000 FILD DWORD PTR DS:[403080]               ;  假码逆序放入st2~st7
00401255   .  DCCF          FMUL ST(7),ST
00401257   .  D8F1          FDIV ST,ST(1)                            ;  st7为200000
00401259   .  DCCE          FMUL ST(6),ST
0040125B   .  D8F1          FDIV ST,ST(1)
0040125D   .  DCCD          FMUL ST(5),ST
0040125F   .  D8F1          FDIV ST,ST(1)
00401261   .  DCCC          FMUL ST(4),ST
00401263   .  D8F1          FDIV ST,ST(1)
00401265   .  DCCB          FMUL ST(3),ST                            ;  通过乘除运算得到正确的位数以便后门累加运算
00401267   .  D80D 90304000 FMUL DWORD PTR DS:[403090]               ;  st0清零
0040126D   .  D8C2          FADD ST,ST(2)
0040126F   .  D8C3          FADD ST,ST(3)
00401271   .  D8C4          FADD ST,ST(4)
00401273   .  D8C5          FADD ST,ST(5)
00401275   .  D8C6          FADD ST,ST(6)
00401277   .  D8C7          FADD ST,ST(7)                            ;  累加到st0中。295323,即用st0保存假码
00401279   .  DDC7          FFREE ST(7)
0040127B   .  DB05 A0304000 FILD DWORD PTR DS:[4030A0]               ;  把内存中六次方累加值放入st0
00401281   .  D8D9          FCOMP ST(1)                              ;  假码要和累加值相等
00401283   .  DFE0          FSTSW AX
00401285   .  9B            WAIT
00401286   .  9E            SAHF
00401287   .  7A 72         JPE SHORT 004012FB                       ;  mars2.004012FB

利用浮点寄存器st。很神奇,呵呵。刚刚又跟了一遍。总是这样,三天打渔,两天晒网,要改要改
2010-2-2 19:07
0
雪    币: 65
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
555555,我还不知道浮点运算符的含义,就跟到注册码的位数和取值范围就不行了。。。
2010-2-5 09:26
0
游客
登录 | 注册 方可回帖
返回
//