cm2 逆向分析

cm2 逆向分析

前言

这是逆向实战之CTF比赛篇的第3篇,在这里我就不再讲的特别小白了,有些简单操作可能会略过。

查壳

程序未加壳,可直接IDA分析。

image-20210927114023717

逆向分析

其实这程序和第2篇的挺像的,变量名和函数重命名后如下,主要分析encrypt函数.

image-20210926153546033

encrypt函数

判断输入字符串的长度是否位27.

image-20210926154602498

//修改后
int i;
for( i=0;i<27 && szInput[i];i++) //逻辑与 (只有两个操作数都是真,结果才是真。) 
{
    ;
}
//如果i不为27 就报错,所以这里应该是判断szInput,输入的字符串长度是不是27,不是就保存
if ( i != 27 )
{
    printf("Error length!", v4);
    system("pause");
    exit(0);
}

异或加解密算法

image-20210926154631086

//修改后  
  for ( j = 0; j < 27; ++j )
  {
    if ( szInput[j] != (1 ^ szDest[j]) )//a2我这里直接改成了1,因为外面传进来的第二个参数就是1
    {                                   //szDest中的所有数组元素 与 1进行异或。
      printf("Error flag!", v4);
      system("pause");
      exit(0);
    }
  }

POC代码

#include <stdio.h>
#include <string.h>

int main()
{
    char szDest[36]=".....................";
    char szInput[104]={0};
    for ( int j = 0; j < 27; ++j )
    {
        szInput[j] = szDest[j] ^ 1;
    }
    
    printf("-------------------------------------\n");
    printf("%s\n",szInput);
    printf("-------------------------------------\n");   
}

得到flag:flag{xxxxxxx}

image-20210927114144172

posted @ 2021-08-29 15:58  VxerLee昵称已被使用  阅读(229)  评论(0编辑  收藏  举报