一道逆向题
查壳后程序是一个32位无壳的程序
拉到od和ida中分析一下
经过分析,
首先分析第一个字符串比较的call
取字符串的第一个字符,循环字符串n次(n为字符串的长度),将第一个字符相加n次,然后这个值=550也就是0x226
所以这里只要满足 字符*n=550 就可以,经过后面的分析这里n需要填10(见下文)
也就是 7开头长度为10 的字符串
接下来调试程序
在段首004010770地址下个断点(ida中main函数开头的地址)
我们一路单步(F8)来到这里,这里必须跳转(可以修改标志寄存器的S位改变是否跳转),不然程序是不会进行字符串比较的
下面那个call就是进行字符串比较的call了
我们单步(F7)进入,发现这里面有两个跳转
第一个jnz就是==550的判断
第二个jnz是字符串是否相等的判断
对应ida中
这里我们看到一串类似base64的字符串
搜索字符串看一下
猜测这里他自定义了base64编码表
解密得到
因为这里解密到的长度是10,所以上面的n才为10,不然加密后的字符串长度是不够的
此时我们测试一下,
当算法call执行完成后我们修改字符串为 上面解密到的,我们看能不能成功
在内存窗口中修改后
然后来到字符串比较的地方
我们可以看到要进行比较的两个字符串是一样的
所以现在
只需要让我们输入的字符串经过算法call后等于 =>=:<2>?=2
然后分析一下算法的call
算法call里主要就是这个call,然后这个call执行了4次,我们点进去
分析
第一次执行的是4
第二次1
第三次2
第四次3
此时只需要将 =>=:<2>?=2 反推回来
也就是
先每一位+1,再除啦第一位后面每一位-3,再每一位xor9 就可以了
然后写脚本
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐