再发一个新手CM
成功图片:不许伪造成功提示哦~.~ 本帖最后由 凉游浅笔深画眉 于 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();
}
成功报毒{:5_117:} 谢谢楼主分享 感谢分享,谢谢楼主,哈哈 这个可以学习下,补充姿势{:5_121:} 本帖最后由 凉游浅笔深画眉 于 2017-1-5 13:05 编辑
控制台没法输入特殊符号,而且还没法复制粘贴,不知道楼主的截图是怎么来的。
为什么我打不开。。打开程序直接停止工作 win7 64打不开 凉游浅笔深画眉 发表于 2017-1-5 10:36
控制台没法输入特殊符号,而且还没法复制粘贴,不知道楼主的截图是怎么来的。
特殊字符可以输入。
复制粘贴的话,按住鼠标左键选中要复制的部分,在选中部分上点击鼠标右键(相当于选中后Ctrl+C),然后在未选中状态点击鼠标右键(相当于Ctrl+V)
在command中,右键即使复制,又是粘贴。区别在于是否有选中部分。
页:
[1]
2