-
-
[原创]2017CTF第二题_lelfei攻击手法
-
-
[原创]2017CTF第二题_lelfei攻击手法
在xp里调试运行上传的攻击脚本,然后在00401257这个地址(push "WELL DONE!")下普通断点,等待程序跑到这个地址断下来就穷举出结果
说明:这个攻击脚本是在原来程序上,直接修改exe内容,通过汇编代码修改程序流程,来达到优化后穷举的目的,
主要分2大步骤,第一步:修改exe使得程序可以自行穷举,第二步:优化使得穷举变快,其中优化是关键
优化的地方:
1)nop掉GetTickCount,跟GetTickCount相关的保存结果,和结果保存后,将来再进行运算的代码都可以nop掉,因为分析代码得出结论GetTickCount并没有什么影响到注册码的判断
2)sub_401A60里的从(00401A8B到00401AA8)的这个循环可以被优化掉,完全是废代码,此处费代码会在循环里调用sub_4019E0,此处浪费时间非常多,将循环优化掉后,就完全不计算GetTickCount相关的代码了,IDA分析如下:
v1 = this;
v2 = 0;
v3 = (char *)this + 4104;
v4 = (char *)this + 4104;
do
{
v4 += 4;
v5 = v2++ & 0x3FF;
*((_DWORD *)v4 - 1) = v5;
}
while ( v2 < 1024 );
v6 = 1024;
//下面紧接着的这个循环可以完全干掉,毫无用处
do
{
v7 = *(_DWORD *)v3;
v8 = sub_4019E0(v1);
*(_DWORD *)v3 = *((_DWORD *)v1 + v8 + 1026);
v3 += 4;
--v6;
*((_DWORD *)v1 + v8 + 1026) = v7;
}
while ( v6 );
result = (int)((char *)v1 + 8);
v10 = (int)((char *)v1 + 8196);
v11 = 1024;
do
{
v12 = *(_DWORD *)v10;
v10 -= 4;
*(_DWORD *)result = v12;
result += 4;
--v11;
}
while ( v11 );
return result;
}
上面的代码,第二处也就是中间的循环可以完全干掉,节约大量穷举的时间
3)在00401168处,修改jnz跳转的地址到准备开始下次穷举的位置,此处用IDA分析是
while ( 1 )
{
CObj5_CObj5_szKey(&obj5_2, szKey);
LOBYTE(v23) = 1;
v8 = sub_401840((int)&obj5_2, (int)&obj5, (int)&obj5_2);
v9 = sub_401730(v8, (int)&obj5, 9) + v8;
nullsub_1();
if ( v9 || sub_4013A0(&obj5) % 2 != 1 )
goto LABEL_16;
v10 = sub_4013A0(&obj5);
v11 = sub_4013B0((int)&obj5, v10 >> 1);
v12 = sub_4013B0((int)&obj5_2, 0);
v13 = &obj5_2;
if ( v11 == v12 )
break;
LABEL_17:
LOBYTE(v23) = 0;
CObj5_Destructor(v13);
if ( v9 )
{
printf("WRONG KEY...\n");
goto LABEL_19;
}
}
v14 = sub_4013A0(&obj5_2) - 1;
v15 = 1 - sub_4013A0(&obj5_2);
v16 = sub_4013A0(&obj5);
v17 = sub_4013E0(&obj5, (int)&obj5_2, v16 + v15, 1, v14, 0);
v18 = sub_4013A0(&obj5_2);
if ( sub_4013E0(&obj5, (int)&obj5_2, 0, 1, v18 - 1, 1) + v17 )
{
v9 = 0;
LABEL_16:
v13 = &obj5_2;
goto LABEL_17;
}
[注意]看雪招聘,专注安全领域的专业人才平台!