Crackme-《fty_crkme3》解析
本帖最后由 Corax 于 2023-11-14 14:11 编辑## fty_crkme3
这个是原160CM里面的一个,我看算法分析难度有三星,自己做出来之后还是挺有成就感的。
解压压缩包出来三个东西
!(https://typora-1321221957.cos.ap-shanghai.myqcloud.com/image1/202311131939661.png)
一个信息文件,一个未脱壳的exe,一个号称已脱壳的exe。
直接拿脱完壳的exe放ida里面看看
如脱,脱是脱了,但是不喜欢这个代码段字样。还是自己脱吧。
!(https://typora-1321221957.cos.ap-shanghai.myqcloud.com/image1/202311131939662.png)
### 手工脱
esp平衡,在esp下个段
!(https://typora-1321221957.cos.ap-shanghai.myqcloud.com/image1/202311131939663.png)
中转一下
!(https://typora-1321221957.cos.ap-shanghai.myqcloud.com/image1/202311131939664.png)
然后就来到oep了。
传统upx公式就能解决,但一些别的壳就不是了。。明天把esp平衡给再看看吧。
再dump下来
!(https://typora-1321221957.cos.ap-shanghai.myqcloud.com/image1/202311131939665.png)
出来一个新程序,扔进od里面,已经成功了。
!(https://typora-1321221957.cos.ap-shanghai.myqcloud.com/image1/202311131939666.png)
### 工具脱
upx最经典的-d大法。
!(https://typora-1321221957.cos.ap-shanghai.myqcloud.com/image1/202311131939667.png)
!(https://typora-1321221957.cos.ap-shanghai.myqcloud.com/image1/202311131939668.png)
直接拿下。
### 爆破
开始接触到程序内部了。
这道CM字符串可以直接定位
定位进去之后可以看到,错误信息的跳转源多的一比。一个个改太慢了,干脆直接在错误信息处jmp
!(https://typora-1321221957.cos.ap-shanghai.myqcloud.com/image1/202311131939669.png)
如下,不管输的什么,就算输错了,也会通过调用错误回显来跳转到正确回显
!(https://typora-1321221957.cos.ap-shanghai.myqcloud.com/image1/202311131939670.png)
跑跑看,非常ok
!(https://typora-1321221957.cos.ap-shanghai.myqcloud.com/image1/202311131939671.png)
## 算法逆向
还是比较麻烦的,如上所述,题目的跳转非常之多。
但是还是得看,为了方便起见,我们给错误回显处起个标签
从第一个地方444b92看起
这段代码的作用就是逐位读入所写字符串,然后和0,9的ascii比较,意图就是要输入的就是0-9之间的数字
!(https://typora-1321221957.cos.ap-shanghai.myqcloud.com/image1/202311131939672.png)
再接着这段,判断长短好像要9位-11位
!(https://typora-1321221957.cos.ap-shanghai.myqcloud.com/image1/202311131939673.png)
之后开始进入正式校验。首先是两个位置2和6,但从0开始嘛,就是第三位和第七位是不是“-”,就是说最后的key应该xx-xxx-xx的一个格式。现在我们的123456789显然不是,下个断再跑一趟。
!(https://typora-1321221957.cos.ap-shanghai.myqcloud.com/image1/202311131939674.png)
然后经过一大长串 内存和栈内的处理,将我们输入的12-345-67变成十六进制形式的1234567存在eax里面
!(https://typora-1321221957.cos.ap-shanghai.myqcloud.com/image1/202311131939675.png)
再把7给ebx
然后经过取第一个字符也就是1,经过三个函数的调用结果放进edi里面
!(https://typora-1321221957.cos.ap-shanghai.myqcloud.com/image1/202311131939676.png)
这个时候出来是1,目前我们对三个函数基本上一无所知,再跑
根据最后一句计算结果来看,我们需要的,关键的东西应该是存在ex里面,而eax用444b20跑出来,我们着重看一下。
应该是进行一个运算,参数是原本ebx当中的7和读到的数字,计算结果存在eax当中。
!(https://typora-1321221957.cos.ap-shanghai.myqcloud.com/image1/202311131939677.png)
点进函数内部看一下,就长这个样子,作用也很清楚,n次幂,这里n是7。
!(https://typora-1321221957.cos.ap-shanghai.myqcloud.com/image1/202311131939678.png)
出函数,发现对每一位都这么处理
!(https://typora-1321221957.cos.ap-shanghai.myqcloud.com/image1/202311131939679.png)
跑到最好的结果存在edi当中,我们输入的1234567是
!(https://typora-1321221957.cos.ap-shanghai.myqcloud.com/image1/202311131939680.png)
后面和esi也就是我们符号的数字存储作比较。
!(https://typora-1321221957.cos.ap-shanghai.myqcloud.com/image1/202311131939681.png)
!(https://typora-1321221957.cos.ap-shanghai.myqcloud.com/image1/202311131939682.png)
现在算法也算摸清楚了。
有一个7位数,每一位的7次方加在一块,等于原本的7位数。
写一个脚本(我写的这个效率比较低,大家尽情发挥)
```
nAns = [] #用来存储当前七位数的每一位
nSum = 0 #存储当前计算之和
for i in range(1000000,10000000):
nNumber = i
for _ in range(7):
digit = nNumber % 10# 获取个位数字
nAns.insert(0, digit)# 将数字插入数组最前面
nNumber //= 10# 去掉已经处理过的最后一位数字
for m in nAns:
nSum += m ** 7 #进行7次方
if i == nSum:
print(nSum)
nSum = 0
nAns.clear() #清空i的每一位数用作下一轮
```
跑出来四个数
!(https://typora-1321221957.cos.ap-shanghai.myqcloud.com/image1/202311131939683.png)
每一个都是能用的,我就演示一个,成了。
!(https://typora-1321221957.cos.ap-shanghai.myqcloud.com/image1/202311131939684.png) 学习了,谢谢 学到了,谢谢 这个学到了,多谢分享了。 学到了,多谢分享了。 好思路,学习了! 这些 CrackMe 程序怎么写出来的,有没有教程或者书籍推荐,我也想学着写这些CrackMe,反调试等各种检测程序,但我真不知道从哪里下手,想先找个书本或者教程学着写,请大神们赐教
页:
[1]