一个简单的逆向,
收获:
1、IDA Pro逆向时对字符串大小把握不够精准;
2、char数组逆向时会逆向成int数组的指针;
3、if else语句判断条件不那么精准。
4、逆向时会多出一些变量,如int等,没有实际意义。
感谢eastmount大神!!!更详细的实现可参考大神的文章。 参考文章:安全验证 - 知乎知乎,中文互联网高质量的问答社区和创作者聚集的原创内容平台,于 2011 年 1 月正式上线,以「让人们更好的分享知识、经验和见解,找到自己的解答」为品牌使命。知乎凭借认真、专业、友善的社区氛围、独特的产品机制以及结构化和易获得的优质内容,聚集了中文互联网科技、商业、影视、时尚、文化等领域最具创造力的人群,已成为综合性、全品类、在诸多领域具有关键影响力的知识分享社区和创作者聚集的原创内容平台,建立起了以社区驱动的内容变现商业模式。https://zhuanlan.zhihu.com/p/461862715
原程序:
int main()
{
int i;
int len;
char key[20] = "";
char res[20] = "";
char num[20] = "eastmount"; //密钥
char right[20] = "123456789"; //正确值
//请输入正确的密码
printf("please input the key:");
scanf_s("%s", &key,20);
//判断
len = strlen(key);
if (len < 6 || len>10) {
printf("Error, The length of the key is 6~10\n");
}
else {
//加密
for (i = 0; i < len; i++) {
res[i] = (key[i] ^ num[i]); //异或加密
}
//printf("%s\n", res);
if (strcmp(res, right) == 0) {
printf("You are right, Success.\n");
}
else {
printf("Error, please input the right key.\n");
}
}
return 0;
}
IDA pro逆向程序:
int __cdecl main(int argc, const char **argv, const char **envp)
{
char Str2[4]; // [esp+D0h] [ebp-88h] // 字符串大小有差异
int v5; // [esp+DAh] [ebp-7Eh]
int v6; // [esp+DEh] [ebp-7Ah]
__int16 v7; // [esp+E2h] [ebp-76h]
int v8; // [esp+ECh] [ebp-6Ch] // 原程序为char字符串
int v9; // [esp+F6h] [ebp-62h]
int v10; // [esp+FAh] [ebp-5Eh]
__int16 v11; // [esp+FEh] [ebp-5Ah]
char Str1[28]; // [esp+108h] [ebp-50h] //字符串大小有差异
char Str[28]; // [esp+124h] [ebp-34h]
int v14; // [esp+140h] [ebp-18h]
int i; // [esp+14Ch] [ebp-Ch]
j___CheckForDebuggerJustMyCode(&unk_41C00E);
strcpy((char *)&v8, "eastmount");
v9 = 0;
v10 = 0;
v11 = 0;
strcpy(Str2, "123456789");
v5 = 0;
v6 = 0;
v7 = 0;
j_printf("please input the key:");
j_scanf_s("%s", Str, 20);
v14 = j__strlen(Str);
if ( v14 >= 6 && v14 <= 10 ) // 与原来程序相反
{
for ( i = 0; i < v14; ++i )
Str1[i] = *((_BYTE *)&v8 + i) ^ Str[i];
if ( !j__strcmp(Str1, Str2) )
j_printf("You are right, Success.\n");
else
j_printf("Error, please input the right key.\n");
}
else
{
j_printf("Error, The length of the key is 6~10\n");
}
return 0;
}
解密程序
int main()
{
char str2[10] = "123456789";
char str1[10] = "eastmount";
char key[10];
for (int i = 0;i < 10;i++)
{
key[i] = str1[i] ^ str2[i];
}
printf("The key is %s", key);
return 0;
}