问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
某软件逆向算法探源
硬件与物联网
记录一下日常学习软件逆向的过程,文章探讨了关于某开源软件的逆向分析过程,主要涉及爆破和加密算法分析两个方面,供程序分析新手入门小白分析交流
熟悉程序&&爆破尝试 ------------------ 先乱输一波看程序暴露什么错误信息  可以看到错误时会返回“无效的ID或名字”这一报错字符串,将程序载入olldbg,右键单击,使用中文搜索引擎搜索“无效”。双击跳转  找到入口点并向上溯源,找到使程序跳到此错误处的跳转指令  找到跳转指令,可以看到一个非常常见的指令组合。常常用于输入的正确性 ```php 004C2ABF处是一个call 命令,调用的是验证算法 004C2AC4 处将算法的返回值进行比较。比较相同赋1 不同为0 004C2AC6处 代表比较结果为0时跳转,为1时候不跳转 ```  选中算法call,回车进入这个call看一下。 向下看到这个函数是以retn返回的,我们就可以放心大胆的爆破了。 对push ebp做如下修改,让其直接返回  运行软件测试一下,可以看到软件显示已经注册,说明我们爆破成功了  算法分析部分 ------ ### 输入寻址 重载程序,重新定位报错信息,在加密函数调用处和函数头处下断点   下好端点后运行程序,进入注册页面输入名字和ID(乱输的)。程序随即运行到第一个断点处  断点处f8单步观察edx寄存器的变化,edx被赋值0019f364该地址我们在堆栈窗口处锁定该地址,继续f8 看到该地址存储了我们输入的用户名  继续单步跟进程序,可以看到程序又给edi赋值了一个新地址,我们堆栈窗口中跟随->锁定堆栈继续单步f8可以看到这个地址存储了我们输入的序列号   ### 绕过长度限制 接下来继续单步跟进到我们刚才下断点的加密函数处,f7进入该函数调用。 简要分析以下这个函数的关键信息,发现A1910,A1423两串神秘字符,这两串字符现在有什么用呢?我们不得而知,从函数头开始单步跟进分析吧  跟进到此处发现一个函数调用,函数调用后是将eax中的值和0xA也就是10进制的10进行比较,单步运行过该函数,看到eax中的值是8 联想到我们刚才输入的序列号“12345678”长度为8 合理猜测刚才那个函数的作用是检测字符串长度,在该处下个端点重载程序重新运行  ### 加密探源 成功绕过长度检测后,我们将程序走到A1910处,进入调用该字符串的函数  这里是一个典型的堆栈平衡,对我们程序分析并没有什么帮助,直接步过  这里首先取出了A1910的第一位A和我们输入的序列号做运算  接下来我们看到一个没见过的命令 **repne scasb**百度搜索一下 这里我们看到repne scasb 逐位调取了我们输入的序列号和A进行比对   循环结束后程序加密部分就结束了 我们重载一遍程序,在序列号处输入A191012345,回到repne scas指令处,单步F7可以看到’A‘和’A‘数据匹配了,这时程序没有继续循环而是直接跳到了下一行,并且这个jnz没有跳转   继续运行看到edx的值赋值给了ecx   接下来又到了一个我们不认识的命令  百度搜索一下 > 当repe cmps配合使用时就是字符串按位比较,当相同时继续比较,不同时不比较  可以看到是A1910和输入字符串进行比较。 这里我们就可以判断出这个循环的作用就是将我们的输入和A1910A1423进行比较,假如判断失败就在圈1处return 判断成功就在圈2处return   回到程序主函数继续运行,接下来是一个判断流程。这段程序比较明显是将我们输入的数据从第二位开始(注意下图第一行给eax复制的0x2)按位比较,保证其在0~9的大小范围内  这里做了一系列运算,首先将eax和edx相加存储在eax然后将ecx赋值为10,将eax和ecx做除法运算,商存在eax处, 余数存在edx处  再接下来是一个比较,比较edx也就是刚才加法除法过后的余数是4,否则跳转  由于这里我们的余数不是4 因此跳转了,继续跟进我们就返回了,出来看到一个al比较....原来如此  搞明白了判定,我们回跳分析,可以看到决定输入是否正确的元素在于**mov eax,ebx。**因为如果上面edx和0x4比较如果相等的话,就不会跳转,bl就会被赋值为1 eax也会被赋值为1,这样al的值就为1了,  这样我们就搞明白了这个题的序列号检测算法 首先前五位必须是A1910或者A1423 中间三位为任意0~9数字,**最后两位的ascii码相加后**与10相除余数必须为4(也就是个位为4) 参考文章 ---- [repne scasb 详解*LqL\_1的博客-CSDN博客*repne scasb](https://blog.csdn.net/abc_670/article/details/79479364) [repne scasb详解*kunlong0909的博客-CSDN博客*repne](https://blog.csdn.net/kunlong0909/article/details/8729741) [repne scasb 用法**\_N4c1**的博客-CSDN博客\_repne scasb指令](https://blog.csdn.net/qq_43504939/article/details/102855783) [repe cmps指令 - 紅人 - 博客园 (cnblogs.com)](https://www.cnblogs.com/feizianquan/p/15036716.html) P.S:本文仅供技术交流,请勿用于商业及非法用途。
发表于 2023-01-29 10:57:55
阅读 ( 6600 )
分类:
硬件与物联网
0 推荐
收藏
0 条评论
请先
登录
后评论
绿冰壶
学生
18 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!