逆向学习crackme160题-003-Cruehead-CrackMe-3的 write up

简介: 逆向学习crackme160题-003-Cruehead-CrackMe-3的 write up

003-Cruehead-CrackMe-3的 write up

抄一百篇不如自己实践操作写一篇,尊重知识产权,写笔记辛苦,禁止转载!!

1. 执行程序测试

如上图,程序执行后什么也没有,就是一些字符串,猜测有一些内容是需要破解之后才能够显示出来。

2. 程序查壳

解释:程序无壳

3. 静态调试

  1. 首先将程序拖入32位IDA后先点击View(查看)——>Open subviews——>Strings,结果如下图:

    解释:可以看到有一些字符串是程序运行的时候没有显示出来的,这应该是需要破解之后才能显示的,猜测CRACKME3.KEY可能是一个文件名。
  2. 查看输入表,点击View——>Open subviews——>Imports,结果如下:

解释:这里只截屏来部分重要的API,并不是全部,但是可以猜测到这是和文件操作有关系。

详情:https://blog.csdn.net/jeanphorn/article/details/44982273
GreateFileA 创建或打开文件或I / O设备,返回值句柄(写的时候记得头文件: Fileapi.h)详情见https://blog.csdn.net/weixin_42810844/article/details/103246109
ReadFile   从文件指针指向的位置开始将数据读出到一个文件中
WriteFile     将数据写入一个文件
OpenFile    以不同方式打开文件的操作
  1. 可以用跟踪关键的字符串,或者是API函数,通过IDA的交叉引用,找到关键的主函数start。如果是流程图的形式,可以采用右键——>Text vie,以整篇形式观察加注释。如下图:

解释:可以知道程序的大致思路是需要打开一个包含注册码的文件,00401035文件存在则跳转,文件不存在则顺序执行,0040103C执行call调用的函数是拼接字符串,进入函数如下图:

解释:可见拼接的字符串是在CrackMe v3.0后面回车然后拼接“-Uncracked”,这是由于程序是由大端序模式存储的,所以数据高位在低位。

如果文件存在则跳转到00401043,开始读取文件内容并读取18个字符,保存到缓冲区402008,然后再来判断读取到的文件内字符串是不是18个字符,00401074的call调用00401311的函数进行

解密操作,如下图:

解释:解密时将把18个字符中的前14个字符每一个依次与“A~N"字符进行异或,所以是14次,然后将每次异或的结果储存到004020F9进行累加。最后回到第一张图,将累加出来的结果进行四个字节的异或,结果继续保存到了4020F9。

  1. 接下来的操作如下图:

注意重要知识点:SETZ AL //取标志寄存器中ZF的值, 放到AL中. SETNZ取得ZF值后, 取反, 再放到AL中.

解释:把校验结果保存在al里入栈了,接下来到后面还会进行一次检验。

  1. 然后经过一段窗口创建的操作之后,在进入消息循环之前,做了这样一个校验,校验文件内容是否正确,正确就弹框提示,正是通过刚刚push的al进行校验的

4. 动态调试

动态调试结合会让很多的数据看起来比较清晰。

  1. main函数,关节处加入了断电如下

5. 程序复现

注册码的检验是:

  1. 18个字符串中取出前14个字符依次分别与”A~N"进行异或运算
  2. 将每次异或出来的结果累加保存
  3. 最后累加的结果和0x123456再次进行异或
  4. 最后异或的结果和最后面四个字符比较。

注册机的生成思路是:

  1. 随便输入14个字符串,然后分别依次和“A~N”的结果进行异或
  2. 每次异或的结果累加保存起来,最后和0x123456异或
  3. 然后将最后异或出的结果拼接到14个字符后面,即可完成生成。
#include <stdio.h>
#include <windows.h>
#include <string.h>

int main()
{
  void generatekey(char key);  //声明函数
  char key[19] = { 0 };//储存用户输入的字符,做实际参数
  printf("enter you username: ");
  scanf("%s", key);
  generatekey(key);    //调用函数
  system("pause");
  return 0;
}
void generatekey(char key[19])
{
  char KEY[19] = { 0 };           //存储序列号
  int i = 0;          //充当字符串的下标
  int k = 0;          //充当循环计数
  char bl = 'A';        //用来解密的字符串
  unsigned int sum = 0;   //每次异或的累加值储存到这里
  unsigned char* tmp = { 0 };   //无符号的字符串指针初始化0
  strcpy(KEY, key);      //将用户输入的字符串复制到KEY
  do                    //循环解密
  {
    KEY[i] ^= bl;
    sum += KEY[i];
    i++;
    bl++;
    if (!KEY[i]) break;
  } while (bl!='O');
  sum ^= 0x12345678;    //累加值异或
  *(unsigned int*)&KEY[0xE] = sum;  //将前面异或出来的结果拼接到KEY的后4个字符
  for ( k = 0; k < 18; k++)     //循环遍历以两位十六进制数输出KEY
  {
    tmp = (unsigned char*)&KEY;
    printf("%02x ", tmp[k]);
  }
  printf("\nstrlen(tmp)=%d\n", strlen(tmp));//求输出字符串的实际长度(不包含/0)
  //由于前14个字符储存的是异或的结果,所以下面要把前14个字符逆向异或回原来的字符
  int j = 0xD;  //充当下标
  char al = 'N';//充当解密字符
  do
  {
    tmp[j] ^= al;
    j--; 
    al--;
    if (!tmp[j])break;
  } while (al!='@');
  for (k = 0; k < 18; k++)//循环遍历以两位十六进制数输出KEY
  {
    tmp = (unsigned char*)&KEY;
    printf("%02x ", tmp[k]);
  }
  printf("\nstrlen(tmp)=%d\n", strlen(tmp));//求输出字符串的实际长度(不包含/0)
  printf("KEY: %s", KEY);//以字符串的形式输出KEY
  HANDLE hFile = CreateFileA  //函数的返回值是一个句柄
  ( "CRACKME3.KEY", //要打开的文件名字
    GENERIC_ALL, //允许设备进行所有操作
    0, //不共享
    NULL, //指针
    CREATE_ALWAYS,        //总是创建文件
    //OPEN_ALWAYS, //如果文件不存在则创建它
    FILE_ATTRIBUTE_NORMAL, //默认属性
    NULL    //指定文件句柄
  );
  DWORD retNum = 0;
  WriteFile
  ( hFile, //文件句柄
    KEY, //要写入的数据
    sizeof(KEY), //要写入的字节数,结果应该是给了后面的取地址
    &retNum, //实际写入的字符串
    NULL  //OVERLAPPED 结构,一般设定为 NULL
  );
  CloseHandle(hFile); //关闭句柄
}


相关文章
|
22天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
15天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
19天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2570 22
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
17天前
|
人工智能 IDE 程序员
期盼已久!通义灵码 AI 程序员开启邀测,全流程开发仅用几分钟
在云栖大会上,阿里云云原生应用平台负责人丁宇宣布,「通义灵码」完成全面升级,并正式发布 AI 程序员。
|
1天前
|
存储 人工智能 搜索推荐
数据治理,是时候打破刻板印象了
瓴羊智能数据建设与治理产品Datapin全面升级,可演进扩展的数据架构体系为企业数据治理预留发展空间,推出敏捷版用以解决企业数据量不大但需构建数据的场景问题,基于大模型打造的DataAgent更是为企业用好数据资产提供了便利。
152 2
|
19天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1565 16
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
2天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
21天前
|
编解码 JSON 自然语言处理
通义千问重磅开源Qwen2.5,性能超越Llama
击败Meta,阿里Qwen2.5再登全球开源大模型王座
920 14
|
16天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
684 9
|
15天前
|
存储 监控 调度
云迁移中心CMH:助力企业高效上云实践全解析
随着云计算的发展,企业上云已成为创新发展的关键。然而,企业上云面临诸多挑战,如复杂的应用依赖梳理、成本效益分析等。阿里云推出的云迁移中心(CMH)旨在解决这些问题,提供自动化的系统调研、规划、迁移和割接等功能,简化上云过程。CMH通过评估、准备、迁移和割接四个阶段,帮助企业高效完成数字化转型。未来,CMH将继续提升智能化水平,支持更多行业和复杂环境,助力企业轻松上云。