先是一串密文,发现了一些规律:AB的组合一定是5个一组成对出现的。然后count了一下组合的数量,一共是6种情况。猜测这个一个组合是对应的一个字母,6个话,这里应该是16进制,按照顺序对应ABCDEF,是培根密码,遂写了个程序替换了一下,得到:
595270E5853B133E07BDB5D7F827D0DF6A910DE23289280801FAEFDD4078E56FB8C2B5C881F2B7F58A096A367A32BE33D7248989D6B2319F091FF4A12FF2A4717D4C01B242927BE0643F06FBE29B10AE
然后各种解密。
然后就没有思路了。去端口上nc一下,自己建了个账户给Ph转账,结果在最后看到了一样类型的数据,转换一下,在0x40-0x60的地方发现了我这次的OneTimePassword。看来这个数据结构应该是包括了发送人接收人转账金额口令balabala等一系列结构的数据。其中0x40到0x60这个区域是一次性口令。那么我们在题目开始给的数据中截取,得到了Ph的一次性口令:
然后思路就很明确了,按照题意,登陆Ph的账号,给Z2333打23333这么多钱。手动测试成功。作为一个懒人,写了个脚本以后看得爽:
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('game1.xdctf.com',50008))
a="595270AABAA5853AAAAB133AABAA07AAAABAAABBAAAAB5AAABB7AABAB827AAABB0AAABBAABAB6AAAAA910AAABBAABAA23289280801AABABAAAAAAABAAAABABAAABBAAABB4078AABAA56AABABAAAAB8AAABA2AAAAB5AAABA881AABAB2AAAAB7AABAB58AAAAA096AAAAA367AAAAA32AAAABAABAA33AAABB7248989AAABB6AAAAB2319AABAB091AABABAABAB4AAAAA12AABABAABAB2AAAAA4717AAABB4AAABA01AAAAB242927AAAABAABAA0643AABAB06AABABAAAABAABAA29AAAAB10AAAAAAABAA"
l=len(a)
print l
temp=[]
i=0
real=""
while(i<l):
if a[i]=='A' or a[i]=='B':
tem=a[i]+a[i+1]+a[i+2]+a[i+3]+a[i+4]
temp.append(tem)
if tem=="AAAAA":
real=real+'A'
if tem=="AAAAB":
real=real+'B'
if tem=="AAABA":
real=real+'C'
if tem=="AAABB":
real=real+'D'
if tem=="AABAA":
real=real+'E'
if tem=="AABAB":
real=real+'F'
i=i+5
else:
real=real+a[i]
i+=1
print real
print real[0x40:0x60].lower()
print sock.recv(1024)
print sock.recv(1024)
sock.send('2')
print sock.recv(1024)
sock.send('Ph')
print sock.recv(1024)
sock.send("b8c2b5c881f2b7f58a096a367a32be33")
print sock.recv(1024)
sock.send('3')
print sock.recv(1024)
sock.send('Z2333')
print sock.recv(1024)
sock.send('23333')
print sock.recv(1024)
sock.send('Y')
print sock.recv(1024)
print sock.recv(1024)