破解flashFXP密码全过程

破解flashFXP密码全过程

2008年12月4日 xmxoxo

flashFXP是一个FTP客户端,无意中看了一下密码的保存方式,是存在一个INI格式中,
突发奇想来破解一下:

先改几个密码保存一下,把密文记下来
‘——————————————————————

明码 密码
a 968E
a 73AD
a A671
a A57E
a 3EE6
a 4BD5

 

b 1902
c 23FF
d 9D78

aa 0F092B
aa BE59FB
aa 9C84A4

aaa DC47E978
1 410B

‘——————————————————————
规则猜想:
FTP的密码在发送的时候是需要用明码的,所以
flashFXP软件在保存密码的时候肯定用的是可逆的算法;

猜想:
密文(P)为明码字串(S)长度+1,再乘2
猜想是这样加密的:
先随机生成一个byte数R,然后用这个字节
数作为key对明码进行加密,因为要还原,
肯定要用到xor运算,得到的结果称为T
将K和T都转为字节表示,最终结果连接为:RT
假设加密方法为F,则加密方式为:
F(S,R) = T
P=RT

以下假设密码的头2个字母为随机数K
a 968E
可猜想得到:
a的ascii为61,则
F(61,96) = 8E
其它几组为:
F(61,73) = AD
F(61,A6) = 71
F(61,A5) = 7E
F(61,3E) = E6
F(61,4B) = D5

以下几组
b 1902
c 23FF
d 9D78
推出:
F(62,19) = 02
F(63,23) = FF
F(64,9D) = 78

汇总:
‘——————————————————————
F(61,96) = 8E
F(61,73) = AD
F(61,A6) = 71
F(61,A5) = 7E
F(61,3E) = E6
F(61,4B) = D5
F(62,19) = 02
F(63,23) = FF
F(64,9D) = 78

‘——————————————————————

第二点:
以下几组对照:
aa 0F092B
aa BE59FB
aa 9C84A4
aaa DC47E978

根据这三组可以猜想,加密的方式也可能是:
逐字节循环加密,因为字母相同时,不
同位置上的密码是不同的,但是随机数只有一个,
很可能是前一位算出来的密文,来做为下一位计算的随机码;
T(0)=K
F(S(i),T(i-1))=T(i)

当然,也可能是:
使用一个固定的密码序列K,然后
像RC4那样逐位移动,循环加密,密文的第
一个字符则加入到函数F中,这种方式相对于循环加密
来说更简单些,只要找出固定的密码序列就可以了;

先来处理这种简单的方式,如果使用的是循环加密的方式,
对于一位的密码,也是没有循环的,相当于是简单方式了;

因为加入了固定密码序列K,
假设密码序列第一位为K1,
对应上面单个字母a的明文和密文,
则函数变成:

F(61,96,K1) = 8E
F(61,73,K1) = AD
F(61,A6,K1) = 71
F(61,A5,K1) = 7E
F(61,3E,K1) = E6
F(61,4B,K1) = D5

上面猜想算法中肯定用到了异或,所以先XOR一下:

61 xor 8E = EF
61 xor AD = CC
61 xor 71 = 10
61 xor 7E = 1F
61 xor E6 = 87
61 xor D5 = B4

加入随机码进行比较关系:

EF 96
CC 73
10 A6
1F A5
87 3E
B4 4B

这两列数据之间应该得出一个共同的定值,这个定值就是K1

先进行加法试算,
EF + 96 = 85
CC + 73 = 3F
10 + A6 = BD
1F + A5 = C4
87 + 3E = C5
B4 + 4B = FF

结果不对,换成减法:

EF – 96 = 59
CC – 73 = 59
10 – A6 = 6A
1F – A5 = 7A
87 – 3E = 49
B4 – 4B = 69

咦,有两个数相同,后面几个不同,
第三个式子跟上面两个有个区别,
被减数小于减数,将10向高位借1来试试:

EF – 96 = 59
CC – 73 = 59
10 – A6 = 69
1F – A5 = 79
87 – 3E = 49
B4 – 4B = 69

得到的结果高位不同但是低位已经相同,
‘——————————————————————

整理一下刚才用到的函数:
F(S,R,K1) = T
S:明文,R:随机码,K1:密码第一位,T:密文
假设加密函数为:
F(S,R,K1) = (S xor K1 ) – R = T
上面将
F(61,96,K1) = 8E
计算:61 xor 8E = EF
是将S xor T

换一下,由结果倒推回去,
假设FN是F的逆函数
FN(T,R,K1) = (T + R)  xor K1 = S

多设几种可能
J=T+R
N= J xor S

M=T-R
Q=M xor s

Z=S xor T

X=S+R
X1=X xor T

Y=S-R
Y1 = Y xor T

凡是大于FF的都减去FF

S R T K1 Z  J  N  M  Q  X  X1  Y Y1
61 96 8E ? EF  25  44  F7  96  F7  79  CA 44
61 73 AD ? CC  20  41  3A  5B  D4  79  ED 40
61 A6 71 ? 10  18  79  ff  ff  8  79
61 A5 7E ? 1F  24  45      7  79
61 3E E6 ? 87          9F  79
61 4B D5 ? B4          AC  79

计算了三个后发现了X,X1这两列,后面只计算这两列
得出:
验证函数是:
(S+R) xor T=K
即加密函数是:
F(S,R,K) = (S+R) xor K = T

密码第一位是79,即:”y”

‘——————————————————————
找二位数的明文来查第二位密码:
aa 0F092B
aa BE59FB
aa 9C84A4

先验证一下第一位有没错:

X=S+R
X1=X xor T

S R T K1 X X1
61 0F 09 79 70 79
61 BE 59 79 20 79
61 9C 84 79 FD 79

OK,第一位正确了,按道理第二位应该是:
K2=(S+R) xor T2
或者是循环加密,即R用的是上一位的密文T1:
K*=(S+T1) xor T2
两种同时算一下:
S R T1 T2 K2 K*
61 0F 09 2B 5B 41
61 BE 59 FB DB 41
61 9C 84 A4 59 41

OK,K*的值全部相同,第二位密码是:41,即”A”

剩下密码的可以写一个程序来求了,
先去软件里设置一个超级长的密码,
不知道密码有多长,搞一个100个a的密码:
“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa”

得到的密文是:
948CAC3DA87090C51FE4030C0B1E090D0620D35286D05A8EBA709580D24DEF62F52DCF055EDB78B175A470B67096A560F461AA39CF5DFA2AB86385D5011838AD37FC1B14130611151E38CB4A9E37F0679D92B76FE33CDC0D58C364F16BA84FD85CCF47CF59
长度是202,正好是100*2+2

得到密文后,用上面的公式求:
K(n)=(S+T(n-1)) xor T(n)
其中S=61
简单用VB写一段程序来求吧:

Public Sub Main()
    Const T = “948CAC3DA87090C51FE4030C0B1E090D0620D35286D05A8EBA709580D24DEF62F52DCF055EDB78B175A470B67096A560F461AA39CF5DFA2AB86385D5011838AD37FC1B14130611151E38CB4A9E37F0679D92B76FE33CDC0D58C364F16BA84FD85CCF47CF59”
    Dim Key As String
   
    Dim Tn As String
    Dim Tp As String
    Dim S As Integer
    Dim R As Integer
   
    Dim i As Integer
    Dim X As Integer
   
    S = &H61
    Tp = Left(T, 2)
   
    For i = 1 To 100
        Tn = Mid(T, i * 2 + 1, 2)
        X = S + CInt(“&H” & Tp)
        If X > 255 Then X = X – 255
       
        Key = Key & Chr(X Xor CInt(“&H” & Tn))
        Tp = Tn
    Next
   
    Debug.Print Key
End Sub
‘——————————————————————
运行后得到以下结果:
yA36zA48dEhfrvghGRg57h5UlDv3yA36zA48dEhfrvghGRg57h5UlDv3yA36zA48dEhfrvghGRg5 h5UlDv3yA36zA48dEhfrvgh

寻找一下最开始的5个字母,即可得到密码重复出现的位置,
最后得到密码:
yA36zA48dEhfrvghGRg57h5UlDv3

剩下的工作就是还原出加密和解密的函数和程序了,
上网找了一下,靠,原来网上早就有了!
对照了一下,是一样的,那就不写了.

 

 

点赞