一个密码学算法的crackme的分析.docx
- 文档编号:30751886
- 上传时间:2023-08-20
- 格式:DOCX
- 页数:12
- 大小:149.34KB
一个密码学算法的crackme的分析.docx
《一个密码学算法的crackme的分析.docx》由会员分享,可在线阅读,更多相关《一个密码学算法的crackme的分析.docx(12页珍藏版)》请在冰豆网上搜索。
一个密码学算法的crackme的分析
一个密码学算法的crackme的分析
-----文/KYO
这次写一篇关于软件运用了经典密码学算法的分析的文章。
希望能给初学者带来进步。
首先这个程序是happytown的第14个crackme,在看雪已经有人写了注册机,不过分析过程没有写,可能对初学者来说不太好看懂,我这里就做一次详细的分析吧。
首先运行下这个程序,随便填写一个用户名(kyo327)和密码(1234567)点击注册,没有任何提示。
接着用PEID加载,
从抓图可以看到该程序没有加壳,编程语言采用的是VC++,用PEID的插件KANAL分析出它所采用的密码算法有SHA1和RSA,这样我们心里至少先有个底。
***************************************************************
这里插播个广告,黑友们请无视,只是为朋友的网站能被搜索引擎收录,多加点流量。
返利网,淘你喜欢,淘宝返利,淘宝返现购物。
***************************************************************
准备工作做完后,用OD加载,用万能断点下断,程序断在这里。
先粗略的用F8走一遍,发现一直走到这里,
到了0040108a处,跳转实现了,跳向了失败,这说明只要上面的eax不等于0就能注册成功。
再看这里
程序是走到004013e5经过了RETN后才到了00401087testeax,eax的。
上面有个字符串比较函数,我们知道如果两个字符串相等,返回值eax=0,否则返回非0值。
在经过了negeax,sbbeax,eaxinceax后,只有当eax=0才能通过验证。
因此只要上面两个字符串相等就可以注册成功,现在看来就只有这一处验证。
当然如果把0040108a处的
Je0040111d改为jne0040111d就可以暴了它了。
不过我们还是分析算法为主。
现在回到开始,一步步F8来到这里
可以看到从0040121c到00401260之间,是用输入的密码的长度做一个循环,来验证密码必须为0-9,a-f,A-F之间的字符,否则会跳向失败。
我最开始输入的1234567算是混过去了,呵呵。
接着看:
紧接着下面有一个call,右键点跟随,发现代码是这样的
这里面有5个常数的赋值,分别是67452301h,EFCDAB89h,98BADCFEh,10325476h,C3D2E1F0h.这个是SHA1密码加密的标志,这里估计是SHA1的初始化。
先不管f8过去。
一直走到这里
经过了call00404060后,ddesp+1a0可以看到一串字符,根据上面代码我们知道这是对用户名kyo327做了sha1的加密。
我现在通过zobox这个工具验证一下看看是否正确。
可以看到kyo327通过SHA1加密后是D81E2A1A72F5A4F570B0F05BAAA0CFFC5D2D6820,刚好和上面的字符串一样。
那么可以肯定我们的猜想是正确的。
***************************************************************
这里插播个广告,黑友们请无视,只是为朋友的网站能被搜索引擎收录,多加点流量。
返利网,淘你喜欢,淘宝返利,淘宝返现购物。
***************************************************************
接下来继续F8走来到这里,看下面这堆代码
从004012b2到0040131c这段代码作用是把上面用SHA1加密的字符数转换为16进制。
送到[esi],也就是ss:
[esp+268]处。
然后下面一句movbyteptrss:
[esp+278],0,这句代码用0刚好把转换成16进制的密文从中间截断了。
那么此时ss:
[esp+268]对应的字符串就变成了D81E2A1A72F5A4F5,对应的16进制就是:
44383145324131413732463541344635。
也就是取了加密后的前8位字符。
至此SHA1的加密已经结束。
现在看下面的代码。
下面是RSA的加密。
对于RSA,我先在这里说点基础知识,磨刀不误砍柴功嘛。
RSA的整个算法可以描述如下:
(1)选取两个大素数p和q(保密);
(2)计算n=p*q(公开),r=(p-1〉(q-1)(保密);
(3)随机选取整数e(公开,加密密钥),使得gcd(e,r)=1;
(4)计算d(保密,私人密钥),使得ed≡1(modr),即d=e^-1(modr);
(5)加密:
c=m^emodn;
(6)解密:
m=c^dmodn.
用RSA因为要用到大数的计算,所以它必须要引用miracl库的函数。
而针对RSA需要用到这几个函数
mirvar(iv),cinstr(x,s),powmod(x,y,z,w),big_to_bytes(max,x,ptr,justify),mirkill(x)
mirvar(iv)的作用是初始化一个变量。
它只有一个参数。
例:
x=mirvar(0);这样就创建了一个变量x=0。
cinstr(x,s)的作用是字符串s所对应的整数赋值给大整数x。
有两个参数。
powmod(x,y,z,w)作用是w=x^ymodz。
big_to_bytes(max,x,ptr,justify)将一个大整数转x换成一个字节串(ptr指向那个字节串)。
mirkill(x)的作用是消灭一个大整数并清空内存
现在这几个函数作用都已经清楚了。
可是在分析反汇编的代码时如何定位这些函数呢?
当然ida是可以的,不过有些时候也定位不出来。
有一个高人给出了手工定位的方法。
我现在拿出来给大家分享。
废话我不多说了,只讲主要的:
“无论你用何种选项编译MIRACL,movdwordptr[esi+eax*4+20h],xxh,这句代码都会出现在反编译的程序里。
而我们就可以根据xxh,再来查表来定位MIRACL函数了。
”现在我给出上面这4个函数的xxh:
mirvarequ17h,cinstrequ4Eh,powmodequ12h,big_to_bytesequ8Dh。
现在准备工作做完了,继续分析代码吧。
往下看发现,call00401890连续用了4次,并且只有一个参数,参数值每次也都是0,这样我们就不得不怀疑是mirvar(iv)函数,不过还是跟随进去看看。
果然,代码中有一句,movdwordptrds:
[eax+ecx*4+20],17h。
这样就可以对上号了,也可以确定是mirvar函数了。
那么下面几句代码作用就是初始化四个变量,并都赋值为0。
四个变量分别是esi,ebp,edi,ebx.然后看下面
通过上面的方法,可以依次定位出,call00403ab0为cinstr函数,call00403480为powmod函数,call00403230为big_to_bytes函数,call00402260为mirkill函数。
首先第一个0040135b处的cinstr函数把输入的密码1234567(字符串)转化为一个大整数送到edi里面。
注意这里查看返回结果应该是ddedi+c。
因为这是存放了一个大数的原因,其中edi,edi+4,edi+8可能是三个参数。
我猜测字符串有8位则edi=1,符串有16位则edi=2依次类推,而edi+4代表指向那个大整数的指针。
Edi+8可能是保留参数。
接下来把字符串6199855658D504EBC98DF20A2F170CD1=n和10001=e转化为大整数。
下面call00402790,这个call的作用是必须使我输入的密码1234567小于6199855658D504EBC98DF20A2F170CD1的大小,否则就跳向失败,当然这也是为了符合RSA算法的需要。
紧接着就是powmod(x,y,z,w)和big_to_bytes(max,x,ptr,justify).
那么ecx就是加密后的密文。
可以这样表达,
[ecx]=1234567^10001mod6199855658D504EBC98DF20A2F170CD1
F8到004013a0处时,通过ddecx可以得到字符串为:
52DC2CDBA03C0D132194F08AB76ED78D。
下面就是收尾工作了。
连续用4次mirkill函数,清空变量。
最后有一个字符串比较函数。
可以从抓图看到,是比较ss:
[esp+330]与ss:
[esp+268]这两个值的。
我们知道ss:
[esp+268]是开始分析的SHA1加密用户名后取密文的前8位D81E2A1A72F5A4F5,这是不变的。
又因为D81E2A1A72F5A4F5此时是个字符串,转化为16进制为44383145324131413732463541344635。
所以只要RSA加密密码后等于44383145324131413732463541344635就OK了。
现在一切都很明朗了。
现在只须解密44383145324131413732463541344635它就可以得到注册码了。
由上面解密公式m=c^dmodn得知,m=.44383145324131413732463541344635^dmod6199855658D504EBC98DF20A2F170CD1.
现在未知数只有d。
现在拿出工具RSA-TOOL来算N。
可以得到d为64A5ECDB1EC08E51537F4F96B221A1。
现在再用工具RASKIT解密
现在解出来密码是2EFC8735EDD33B306FAEA3485C6CD0B1。
好了马上测试一下看是否能注册成功。
通过上图看来我们是通过注册了。
知道了算法,写注册机也很简单。
因为现在网上sha1,rsa的代码满天飞,随便下载一个然后结合起来就很容易写出注册机了。
我向来比较懒,这个工作还是留给大家做吧:
)
***************************************************************
这里插播个广告,黑友们请无视,只是为朋友的网站能被搜索引擎收录,多加点流量。
返利网,淘你喜欢,淘宝返利,淘宝返现购物。
***************************************************************
本来到这里就可以结束了,不过我还想罗嗦几句。
我先声明,本文高手和中手都可以飘过,省得说我写文章罗里罗嗦的象个老太婆,也许你们以为很简单,可是请你们给新手一个学习的机会,希望我这篇文章能给刚开始玩破解的新手们带来帮助,这样的话我的目的就达到了。
在此也感谢黑客手册能给这么一个好的平台让我和广大朋友一起交流学习。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一个 密码学 算法 crackme 分析