首页
社区
课程
招聘
[原创]菜鸟起步2,记一次逆向分析学习
发表于: 2023-4-3 16:28 5489

[原创]菜鸟起步2,记一次逆向分析学习

2023-4-3 16:28
5489

crackme0x02-crackme0x06分析

分析工具:radare2,IDA

  • Crackme0x02分析

1.运行文件,依旧是输入密码

 

Untitled

 

2.查看一下汇编代码

 

Untitled

 

可以看出该函数主要部分实现的是:

 

(1)使用 scanf 函数读取一个整数值并存储在 var_4 变量中,该整数值是用户输入的密码。

 

(2)将常量值 5AH存储在 var_8 变量中,并将常量值 0x1EC 存储在 var_C 变量中。

 

(3)将 var_C 变量的值加载到 edx 寄存器中,然后将 var_8 的地址加载到 eax 寄存器中,将 var_C 的值加到 var_8 指向的内存地址上。

 

(4)将 var_8 的值加载到 eax 寄存器中,然后将其乘以自身的值,并将结果存储在 var_C 变量中,此时 var_C 中存储的是一个计算后的值。

 

(5)将 var_4 变量的值加载到 eax 寄存器中,然后将其与 var_C 变量的值进行比较。如果它们不相等,则跳转到 loc_8048461 标签指示的代码块,否则继续执行后续代码。

 

3.经过以上分析,可以计算出密码就是(90+492)^2=338724,运行程序进行验证

 

Untitled

 

4.也可以利用IDA的反汇编插件进行分析,可直接看到密码为338724

 

Untitled

  • Crackme0x03分析
  1. 依旧是输入密码,我们这里直接放进IDA进行分析,先看main函数部分

Untitled

 

2.还是常规的一个密码判断,不过这个程序中还有一个test函数

 

Untitled

 

3.本质上就是利用test判断输入的值是否为338724

 

Untitled

 

4.验证密码是否为338724,密码正确

 

Untitled

  • Crackme0x04分析
  1. 还是熟悉的密码判断,放进反汇编工具进行分析,先看main函数

Untitled

 

2.发现关键的密码判断处调用了一个check函数,我们去分析check函数

 

Untitled

 

3.对check函数进行分析,该程序读取一个字符串s,然后迭代字符串的每个字符。然后使用sscanf()将每个字符转换为整数并将其添加到变量v5中。如果所有整数的总和等于15,则打印“Password OK!”并退出程序。否则,它会打印“Password Incorrect!”并返回0。

 

4.简单来说,就是输入的字符串从前往后一个数一个数的相加,能满足和为15即可,我们输入555进行验证

 

Untitled

 

5.同样的,我们输入一串5进行验证,同样满足

 

Untitled

  • Crackme0x05分析

1.还是输入密码类题目,依旧是直接放进IDA进行分析,发现结构与crackme0x04类似

 

Untitled

 

2.进入check函数进行分析,chec函数与crackme0x04中的一致,这里就不过多赘述,实现的是每一位相加和为16即可满足正确,但在最后一行发现在check函数中又调用了parell函数

 

Untitled

 

3.继续进入parell函数,发现在该函数中,有一个按位与运算

 

Untitled

 

4.parell函数中的代码读取一个字符串s,然后使用sscanf()将字符串转换为整数并将其存储在变量v2 中。然后,它将v2与1进行按位与运算,并将结果存储在变量result中。如果(v2 & 1) == 0 ,则打印“Password OK!”并退出程序。否则,返回result

 

5.根据以上分析,如果像上一题一样输入一串1的话,密码是错误的,输入22222222,4444这类不会报错,运行程序进行验证。

 

Untitled

  • Crackme0x06分析
  1. 依然是输入密码这类题目

Untitled

 

2.放进IDA进行分析

 

Untitled

 

3.在主函数中调用了check函数进行判断,我们进入check函数进行分析,check函数一如crackme0x05和crackme0x04,这里不过多讲了,可以翻翻上面的分析。

 

Untitled

 

4.最后有个parell函数,与上一个题类似,不过多了个dummy函数

 

Untitled

 

5.进入dummp函数

 

Untitled

 

6.代码分析

 

(1)main函数首先输出了一个提示信息,然后通过scanf函数接收一个字符串作为密码输入。

 

(2)main函数调用了check函数,并将刚刚输入的字符串和envp参数(环境变量)作为参数传递给check函数。

 

(3)check函数对输入的字符串进行了处理,将每个字符转化成数字并累加起来。当累加结果为16时,调用parell函数。

 

(4)parell函数将输入的字符串转化成数字并将其作为参数传递给dummy函数。如果dummy函数返回值非零,即输入的密码符合要求,程序输出Password OK!并退出。否则,程序将继续执行,输出Password Incorrect!。

 

(5)dummy函数在一个循环中遍历环境变量envp,如果找到以字符串LOLO开头的环境变量,就返回1;否则返回0。

 

综上,该程序的密码检验流程是:将输入的密码每个字符转化成数字后相加,如果和为16,将其作为参数调用dummy函数,如果返回值非零则认为输入的密码正确。同时,程序中使用了环境变量envp,但是并没有直接使用其值,而是将其作为参数传递给了check函数。因此,环境变量可能被用于调试或其他目的。

 

7.完成代码分析后,一切明朗了起来,我们首先要定义一个环境变量LOLO,然后题目便成为了crackme0x05,利用密码4444,88,这类即可成功。

 

Untitled


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 26399
活跃值: (63262)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
2
图片丢失了
2023-4-7 15:08
0
雪    币: 3004
活跃值: (30861)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
图片挂了
2023-4-7 16:15
1
游客
登录 | 注册 方可回帖
返回
//