首页 电脑 电脑学堂 查看内容

海洋顶端2006+ 密码加密、编码算法分析

2011-3-2 13:46 734 0

摘要:   海洋顶端是很出名的 ASP 木马,2006 年海洋顶端出了最新版本也是最后一个版本:2006 Plus (2006+)。  海洋顶端2006+ 密码加密、编码算法分析  海洋顶端以往的各个版本密码...
关键词: 顶端 密码 算法 加密 海洋 编码 2006 分析 数位 字符

  海洋顶端是很出名的 ASP 木马,2006 年海洋顶端出了最新版本也是最后一个版本:2006 Plus (2006+)。  海洋顶端2006+ 密码加密、编码算法分析  海洋顶端以往的各个版本密码都是明文存放的,这回 2006+ 专门有个 vbs 脚本 (以下采用 Asp 脚本的加密函数,和 vbs 的功能一模一样) 用于加密密码。  海洋顶端2006+ 密码加密、编码算法分析  加密密码的脚本是在 down 回来的 vbs 目录里面名为 Encode.vbs 的文件,先看海洋顶端 2006+ 原始密码加密算法代码:  海洋顶端2006+ 密码加密、编码算法分析  海洋顶端 2006+ 原始密码加密算法:  海洋顶端2006+ 密码加密、编码算法分析  <%  Function IIf(var, val1, val2)  If var = True Then  IIf = val1  Else  IIf = val2  End If  End Function  海洋顶端2006+ 密码加密、编码算法分析  Function Encode(strPass)  Dim i, theStr, strTmp  For i = 1 To Len(strPass) 'for循环得到密码各个字符的Ascii值,每位值都在0-9  strTmp = Asc(Mid(strPass, i, 1)) '求每位字符的Ascii码  theStr = theStr & Abs(strTmp) '将得到的Ascii码拼接起来  Next  strPass = theStr  theStr = ""  Do While Len(strPass) > 16 '当拼接起来Ascii码大于十六位执行JoinCutStr函数处理,使之小于等于16位  strPass = JoinCutStr(strPass)  Loop  For i = 1 To Len(strPass) '这个for循环处理每个字符,把 7、8、9 转为 C、D、E,其余不变  strTmp = CInt(Mid(strPass, i, 1)) '取每位数字转换为整型(没啥实际效果,转不转都一样)  strTmp = IIf(strTmp > 6, Chr(strTmp + 60), strTmp) '如果这位数字大于6,则加上60转成Ascii码,并从Ascii码转换为字符(也就是 C、D、E),否则不变。  theStr = theStr & strTmp '将结果拼接起来  Next  Encode = theStr  End Function  海洋顶端2006+ 密码加密、编码算法分析  Function JoinCutStr(str) 'JoinCutStr函数把奇数位和偶数位的ascii相加整除2得到新字符,取值在0-9  Dim i, theStr  For i = 1 To Len(str)  If Len(str) - i = 0 Then Exit For  theStr = theStr & Chr(CInt((Asc(Mid(str, i, 1)) + Asc(Mid(str, i + 1, 1))) / 2))  i = i + 1  Next  JoinCutStr = theStr  End Function  %>  海洋顶端2006+ 密码加密、编码算法分析  海洋顶端2006+ 密码加密、编码算法分析  先说明一下什么是:把奇数位和偶数位的ascii相加整除2得到新字符。如一串数字:0123456789,然后依次把奇数位和偶数位的数字相加,再把相加的结果除以2,并取整数,运算过程如下:  海洋顶端2006+ 密码加密、编码算法分析  运算:(0+1)/2 (2+3)/2 (4+5)/2 (6+7)/2 (8+7)/2,并将结果取整数,得到:0 2 4 6 8。  海洋顶端2006+ 密码加密、编码算法分析  这个加密算法不是很复杂,其主要思想是:先依次把每个字符取ascii值,得到的一串数字作为字符对待,如果位数大于16,则折半处理(把奇数位和偶数位的ascii相加整除2得到新字符串,得到的字符串位数为原来的一半),直至小等于16,然后把7、8、9分别替换为C、D、E得到最后结果。  海洋顶端2006+ 密码加密、编码算法分析  我们得到了密文,第一步,我们可以把密文中的C、D、E替换回去,也就是分别替换为7、8、9,然后我们得到一串数字组成的字符串。比如字符lake2编码之后是10DEC10C10150,我们替换之,得到1089710710150,由于字符的ascii在32-127,所以可以很轻松的把字符区分开:108、97、107、101、50,正好是lake2各个字符的ascii值。  海洋顶端2006+ 密码加密、编码算法分析  千万不要以为这个算法这么简单就破解了,因为上述情况只是若干种情况里面最简单的一种而已。  海洋顶端2006+ 密码加密、编码算法分析  字符lake2的ascii值位数是11,所以并没有经过JoinCutStr函数处理,如果明文密码是lake2lake2的话,问题就复杂得多了。  海洋顶端2006+ 密码加密、编码算法分析  JoinCutStr函数把奇数位和偶数位的ascii相加整除2得到新字符串,但这里造成了逆向的困难。因为1234经过处理,得到的是13;1133、1134、1233、1234、1124等等经过处理,得到的仍然是13。即同一个结果对应不同的原因,多数情况下我们不知道到底哪一个才对,只好穷举。但是即使是穷举且排除那些包含不可显示字符的密码,也很难知道哪一个密码才是对的。  海洋顶端2006+ 密码加密、编码算法分析  我们虽然不知道使用者真正的密码是多少,但是却可以利用得到的任意一个密码登陆,因为它和真正密码加密之后的值是一样的。这个有点像MD5的碰撞,只是这个算法可以根据hash比较容易的构造碰撞,而MD5则很困难。  海洋顶端2006+ 密码加密、编码算法分析  还有一种比较麻烦的情况:明文密码包含中文。中文的ascii绝对值都很大,要逆向回去还是很麻烦的,所以我们还是构造碰撞吧。  海洋顶端2006+ 密码加密、编码算法分析  针对最简单的那种情况我们也可以用一个Asp来反编码明文密码,以下代码即实现此功能,copy保存为Asp文件运行即可。  海洋顶端2006+ 密码加密、编码算法分析  由于海洋顶端2006+这个猥琐的密码加密算法,当原始明文密码大于8位的时候,解码算法变得非常棘手,以下是小于等于8位解法:  海洋顶端2006+ 密码加密、编码算法分析  海洋顶端2006+密码小于等于8位解密算法:  海洋顶端2006+ 密码加密、编码算法分析  <%  Function Decode(Tmp)  Dim S, X, F  For i = 1 To Len(Tmp)  S = Mid(Tmp, i, 1)  If Asc(S) > 60 Then S = Asc(S) - 60  X = X & S  Next  S = ""  For i = 1 To Len(X)  S = Mid(X, i, 2)  F = F & Chr(S)  i = i + 1  Next  Decode = F  End Function  海洋顶端2006+ 密码加密、编码算法分析  Response.Write Decode(Encode("123456")) & "<br>"  %>  海洋顶端2006+ 密码加密、编码算法分析  海洋顶端2006+ 密码加密、编码算法分析  后面两种情况,如果要编程序破解的话感觉比较困难,就不写了。  海洋顶端2006+ 密码加密、编码算法分析  下面让我们通过构造碰撞来破解海洋顶端 2006 Plus 的默认密码。  海洋顶端2006+ 密码加密、编码算法分析  打开海洋顶端 2006 Plus文件,得到它的编码过的密码是:02200200251001,我的程序不能恢复,看来是经过JoinCutStr函数处理的。让我们大胆的还原:10 31 22 10 01 22 10 01 22 55 11 10 01 11,整合一下:103 122 100 122 100 122 55 11 100 111,这里有个ascii值11,这个字符也是可以显示的,既然是碰撞,只好将就了。我们得到我们的明文密码:gzdzdz7 chr(11) do  海洋顶端2006+ 密码加密、编码算法分析  因为chr(11)是换行符,格式原因不能显示,你可以把以下代码保存为vbs运行之,得到密码:  海洋顶端2006+ 密码加密、编码算法分析  Call InputBox("海洋的默认密码碰撞", , "gzdzdz7" & chr(11) & "do")  海洋顶端2006+ 密码加密、编码算法分析  然后你用它登陆没有改过密码的海洋顶端木马,呵呵,进去了吧。下面再提供一个可以登陆但不同的密码用以证明这是碰撞:  海洋顶端2006+ 密码加密、编码算法分析  Call InputBox("海洋的默认密码碰撞", , "gqdzdz7ne" & chr(11))  海洋顶端2006+ 密码加密、编码算法分析  如上所述,当原始明文密码大于八位的时候,编程进行还原太复杂了,还不如手工碰撞算法来得快,过程如下:  海洋顶端2006+ 密码加密、编码算法分析  海洋顶端 2006+ 手工碰撞解密算法:  海洋顶端2006+ 密码加密、编码算法分析  原密文:  DD0301646431  海洋顶端2006+ 密码加密、编码算法分析  第一步:  将 C、D、E 分别替换为 7、8、9。  880301646431  海洋顶端2006+ 密码加密、编码算法分析  第二步:  把奇数位和偶数位的运算还原,拆开并分组。  88 88 10 51 00 11 66 44 66 44 51 11  海洋顶端2006+ 密码加密、编码算法分析  第三步:  按照 Ascii 码的取值范围:32-127,进行拆分重组。  88 88 105 100 116 64 46 64 45 111  海洋顶端2006+ 密码加密、编码算法分析  第四步:  输出 Ascii 码对应的字符,便是结果,既:XXidt@.@-o。  Response.Write Chr(88) & Chr(88) & Chr(105) & Chr(100) & Chr(116) & Chr(64) & Chr(46) & Chr(64) & Chr(45) & Chr(111)  海洋顶端2006+ 密码加密、编码算法分析  海洋顶端2006+ 密码加密、编码算法分析  最后,我们来下个结论:在得到海洋顶端2006+编码后的密码之后,就算不能恢复出明文密码,也可以利用碰撞来登陆系统。至于如何得到编码后的密码,呵呵,那就超出本文的范围了。
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部