Icc 发表于 2017-1-4 22:48

再发一个新手CM

成功图片:



不许伪造成功提示哦~.~

凉游浅笔深画眉 发表于 2017-1-4 22:48

本帖最后由 凉游浅笔深画眉 于 2017-1-5 15:49 编辑




感谢楼主分享,小菜学习了一下。

下面把解题过程奉上:

用户名和注册码都是12位,论坛不支持特殊符号,只能显示十位,蛋疼了!截个图吧,其中一组key:



分析:
普通汇编指令进行了部分变异,分析这个CM需要留心观察程序如何修改EIP实现不同代码段之间的调用。
用户名和注册码都必须是12位。
然后将我们输入的用户名和注册码,按字节拆成两个数组。之后对每一位进行加密,每一位加密的时候,都会调用64次这个加密函数。
最后将加密的结果写到内存中,完毕后直接push这个内存地址给MessageBox函数。
原始密钥key数组:byte arrKeys[]={0xC8,0xF5,0xF6,0xE6,0xE5,0xB2,0xF7,0xA2,0xBC,0xA4,0xE4,0x81};

举个例子:

假如我们输入

   用户名:123456789qwe
   注册码:abcdefghijkl

第一次循环,取出1和a,然后配合0xC8进行加密,一共调用64次加密函数

第二次循环,取出2和b,然后配合0xF5进行加密,一共调用64次加密函数
.............

分析方法:

   第一种暴力碰撞,穷举出每一位通过加密后可以变成Hello world!的结果。

   第二种是手动修改这个key,然后自己计算一组可用的结果就行了。


下面是通过暴力碰撞。穷举出每一位,所有成功的结果对:





#include <stdio.h>
#include <windows.h>

intEncrypt(int a1, int a2)
{
      return ~a2 & ~a1;
}

void main()
{
      int v2;
      int v3;
      int v4;
      int v5;
      int v6;
      int v7;
      int v8;
      int v9;
      int v10;
      int v11;
      int v12;
      int v13;
      int v14;
      int v15;
      int v16;
      int v17;
      int v18;
      int v19;
      int v20;
      int v21;
      int v22;
      int v23;
      int v24;
      int v25;
      int v26;
      int v27;
      int v28;
      int v29;
      int v30;
      int v31;
      int v32;
      byte v33;
      byte v34;
      byte v35;
      byte v36;
      byte v37;
      byte v38;
      byte v39;
      byte v40;
      byte v41;
      byte v42;
      byte v43;
      byte v44;
      byte v45;
      byte v46;
      byte v47;
      byte v48;
      byte v49;
      byte v50;
      byte v51;
      byte v52;
      byte v53;
      byte v54;
      byte v55;
      byte v56;
      byte v57;
      byte v58;
      byte v59;
      byte v60;
      byte v61;
      byte v62;
      byte v63;
      byte v64;
      byte v65;
      byte v66;
      byte v67;
      byte v68;
      byte v69;
      byte v70;
      byte v99;
      int v1 = 0;
      byte arrKeys[]={0xC8,0xF5,0xF6,0xE6,0xE5,0xB2,0xF7,0xA2,0xBC,0xA4,0xE4,0x81};
      do{
                for (int k=0;k<255;k++)
                {
                        v3 = k;
                        v5 = k;

                        for (int j=0;j<255;j++)
                        {
                              v2 = j;
                              v4 = j;
                              v6 = Encrypt(v3, v4);
                              v7 = Encrypt(v4, v4);
                              v8 = Encrypt(v5, v5);
                              v9 = Encrypt(v8, v7);
                              v10 = Encrypt(v9, v6);
                              v11 = Encrypt(k, j);
                              v12 = Encrypt(v4, v4);
                              v13 = Encrypt(v5, v5);
                              v14 = Encrypt(v13, v12);
                              v15 = Encrypt(v14, v11);
                              v16 = Encrypt(v15, v10);
                              v17 = Encrypt(v5, v5);
                              v18 = Encrypt(v17, v16);
                              v19 = Encrypt(j, v18);
                              v20 = Encrypt(k, j);
                              v21 = Encrypt(v4, v4);
                              v22 = Encrypt(v5, v5);
                              v23 = Encrypt(v22, v21);
                              v24 = Encrypt(v23, v20);
                              v25 = Encrypt(k, j);
                              v26 = Encrypt(v4, v4);
                              v27 = Encrypt(v5, v5);
                              v28 = Encrypt(v27, v26);
                              v29 = Encrypt(v28, v25);
                              v30 = Encrypt(v29, v24);
                              v31 = Encrypt(v5, v5);
                              v32 = Encrypt(v31, v30);
                              v33 = Encrypt(j, v32);
                              v34 = Encrypt(v33, v19);
                              v35 = Encrypt(k, j);
                              v36 = Encrypt(v4, v4);
                              v37 = Encrypt(v5, v5);
                              v38 = Encrypt(v37, v36);
                              v39 = Encrypt(v38, v35);
                              v40 = Encrypt(k, j);
                              v41 = Encrypt(v4, v4);
                              v42 = Encrypt(v5, v5);
                              v43 = Encrypt(v42, v41);
                              v44 = Encrypt(v43, v40);
                              v45 = Encrypt(v44, v39);
                              v46 = Encrypt(v5, v5);
                              v47 = Encrypt(v46, v45);
                              v48 = Encrypt(j, v47);
                              v49 = Encrypt(k, j);
                              v50 = Encrypt(v4, v4);
                              v51 = Encrypt(v5, v5);
                              v52 = Encrypt(v51, v50);
                              v53 = Encrypt(v52, v49);
                              v54 = Encrypt(k, j);
                              v55 = Encrypt(v4, v4);
                              v56 = Encrypt(v5, v5);
                              v57 = Encrypt(v56, v55);
                              v58 = Encrypt(v57, v54);
                              v59 = Encrypt(v58, v53);
                              v60 = Encrypt(v5, v5);
                              v61 = Encrypt(v60, v59);
                              v62 = Encrypt(j, v61);
                              v63 = Encrypt(v62, v48);
                              v64 = Encrypt(v63, v34);
                              int ck = v64;
                              v65 = v64;
                              v66 = arrKeys;
                              v67 = Encrypt(v66, v64);
                              v68 = Encrypt(v65, v65);
                              v69 = Encrypt(v66, v66);
                              v70 = Encrypt(v69, v68);
                              v99 = Encrypt(v70, v67);
                                 if(v1==0 && v99==0x48){
                                       printf("第一位:i=%c,j=%c\t",k,j);
                                 }
                                 if(v1==1 && v99==0x65){
                                          printf("第二位:i=%c,j=%c\t",k,j);
                  
                                  }
/*                              if(v1==2 && v99==0x63){
                                          printf("i=%c,j=%c\n",k,j);
                                          break;
                                 }*/
                                 //if(v1==3 && v99==0x6b){
                                 //         printf("i=%c,j=%c\n",k,j);
                                 //}
                                 //if(v1==4 && v99==0x6f){
                                 //         printf("i=%c,j=%c\n",k,j);
                                 //         break;
                                 //}
                                 //if(v1==5 && v99==0x2e){
                                 //         printf("i=%c,j=%c\n",k,j);
                                 // break;
                                 //}
         /*                        if(v1==6 && v99==0x2e){
                                          printf("i=%c,j=%c\n",k,j);
                                          break;
                                 }*/
                                 //if(v1==7 && v99==0x2e){
                                 //         printf("i=%c,j=%c\n",k,j);
                                 //         break;
                                 //}
                                 //if(v1==8 && v99==0x21){
                                 //         printf("i=%c,j=%c\n",k,j);
                                 //         break;
                                 //}
                                 //if(v1==9 && v99==0x4c){
                                 //         printf("i=%c,j=%c\n",k,j);
                                 //         break;
                                 //}
                                 //if(v1==10 && v99==0x72){
                                 //         printf("i=%c,j=%c\n",k,j);
                                 //         break;
                                 //}
                                 //if(v1==11 && v99==0x21){
                                 //         printf("i=%c,j=%c\n",k,j);
                                 //         break;
                        //      }
                        }
                }
                v1++;
      }while(v1<12);
      getchar();
}



千里冰封 发表于 2017-1-4 23:10

成功报毒{:5_117:}

chengxueli 发表于 2017-1-4 23:38

谢谢楼主分享

zxf98101811 发表于 2017-1-5 00:30

感谢分享,谢谢楼主,哈哈

aajjhd 发表于 2017-1-5 07:16

这个可以学习下,补充姿势{:5_121:}

凉游浅笔深画眉 发表于 2017-1-5 10:36

本帖最后由 凉游浅笔深画眉 于 2017-1-5 13:05 编辑

控制台没法输入特殊符号,而且还没法复制粘贴,不知道楼主的截图是怎么来的。

重拾旧忆 发表于 2017-1-5 12:00

为什么我打不开。。打开程序直接停止工作

繁花丶 发表于 2017-1-5 12:19

win7 64打不开

Shark恒 发表于 2017-1-5 14:21

凉游浅笔深画眉 发表于 2017-1-5 10:36
控制台没法输入特殊符号,而且还没法复制粘贴,不知道楼主的截图是怎么来的。
特殊字符可以输入。

复制粘贴的话,按住鼠标左键选中要复制的部分,在选中部分上点击鼠标右键(相当于选中后Ctrl+C),然后在未选中状态点击鼠标右键(相当于Ctrl+V)

在command中,右键即使复制,又是粘贴。区别在于是否有选中部分。
页: [1] 2
查看完整版本: 再发一个新手CM