2024 南邮 软件安全 第三次作业
1.概述
1.1目标概述
crackme找出对应的输入规则,按照规则去理解需要什么样的用户名和密码,按照对应的方式输入,进行破解Md5算法,找到算法的入口出口,不要求分析算法的逻辑,输入输出的映射关系,
爆破:
1.执行,查看程序的形态
2.静态分析,定位逆向分析关键的位置
3.对关键位置在x64dbg中进行断点的调试
1.2使用软件
继续使用CM-2
这个我们可以先对其进行简单的测试可以发现存在报错字符串:
也就是说,我们可以用之前的方法进行字符串查找然后定位关键的跳转进行爆破。但这次我们不进行爆破,进行算法的理解,并且使用对应规则的用户名和密码进行crackme。
然后我们使用peid进行查看该文件:
一般的,如果peid直接显示出来编程语言,那么这个软件就是没有壳的。(特殊情况是伪造出一个语言,但其实是有壳的)
说明我们直接可以放入ida32进行静态的分析。
2.静态分析
我们进入ida,然后我们找到这个字符串:
然后我们进入4032B9找到调用这个字符串的地方:
我们可以看到一个交叉引用:DialogFunc,也就是这个函数的向上偏移13D的地方使用了这个字符串。
我们找到对应的地方,这里是401B45
我们直接进入动态调试,在401B4C处下断点,看看怎么判断是不对的序列号的
3.动态调试
程序拖进去运行后,我们这么输入:
然后我们看看od:
点击try now我们可以看到这里调用了这个函数:
也就是读取字符串的函数:getdlgItemTextA,地下这一串应该都是函数本身,我们可以看到调用的windows的内置函数getdlgItem
在获取完字符串后,我们看到进入到了判断阶段:
然后我们一路步进,发现关键的判断函数就是下面的&lstrcat,这个函数调用结束后,如果错误,就调用了我们的错误信息字符串,我们在401B02地方下一个断点,我们可以看到lstrcat里面是这样的:
可以看到,这里应该不是判断函数,而是一个获取字符串的过程
然后我们进入lsstrcmpA这个函数里面,我们发现他一直在把我们输入的444和字符串“”进行比较,也就是说,这个关键字符串,可能是333对应的MD5加密字符串,我们实验一下:
我们输入该字符串后发现,确实是333对应的序列号:
但是问题是:这个字符串我们在哪里生成的?现在我们需要找到MD5算法的出入口:
回到静态分析,我们在流程图里面找到了该判断处,是用LpString1和LpString2进行比较,生成第后者的前者的是上面的sub_401000函数,
点进来以后,我们看到这里面一大串的东西应该就是MD5加密:
我们在40100这个地方打个断点,进去步进一下怎么生成该序列号的,这是我们的输入333:
我们发现,对应的生成的部分放在EDI里面了,我们将EDI放在内存窗口里面进行步进,可以看到一位一位的生成了一个字符串:
我们步进了一会,生成了一个E6263,这个我们和找到的关键字符串对比发现:
7DC3A9484373626E21D1C8CF48D556BD
说明就是在生成该字符串,我们找到开始一位位生成字符串的地方,是751E6CB5,然后步进:
然后我们发现,字符串接着生成了F和C:
紧接着生成了8:
对应了一下几位;
7DC3A9484373626E21D1C8CF48D556BD
我们又找到了生成的一部分,我们接着找到底在哪一位生成的:
我们找到了,在751E66AA运行完,就会生成一位;
现在我们已经生成了:
7DC3A9484373626E21D1C8CF48D556BD
接着步进,我们发现了以下代码:
这一段循环运行完后,刚才的反向字符串排列整齐了:
我们接着步进:
发现开始生成最后的DB6,应该是和前面一样,先从后往前生成,再进行排序
现在后面生成完成了:
7DC3A9484373626E21D1C8CF48D556BD
我们发现先生成完成就进行了排序:
然后我们发现,前面8位不再生成了,已经进入到报错信息的加载了:
接着步进,我们找了对444加密的过程:
然后程序发生报错退出,现在说明分析结束了。