参考:大佬的题解 入手一个pcapng文件,拿到wireshark看一下
初步想法: 从所有文件里找data length不一样的,于是在所有的文件里面发现了42号包,其data length为113,拿出data内容用base64解码一下,得到如下结果:
b'SEQ = 9; DATA = 0x26debd9510c16fbed4f6264e8b60L; SIG = 0x4ae0f894af2e414835513891bd55L;'发现了三个元素,seq为序号,data为数据,sig为签名 那么大致流程就是:
data是A发送给B的数据用B的公钥加密后的密文sig是A发送给B的数据用A的私钥进行的签名那么seq或许是个题号?我们将data用B的私钥进行解密后得到的是一个一字节的数据,可以猜测seq是题号
解题
那么我们解题思路就是
取出A发送给B的包(包的长度大于70B)取出包中的数据部分,并进行base64解码对于seq题号,我们用B的私钥对data进行解密得到明文m,再用A的私钥对m进行签名,若该签名与给出的sig相同,则说明seq题号的m是对的最后按照seq的顺序将所有的m组合到一起 用wireshark将该文件另存为pcap文件我们需要pycapfile包来解析pcap文件 import base64 import gmpy2 from pcapfile import savefile n1 = 0x53a121a11e36d7a84dde3f5d73cf n2 = 0x99122e61dc7bede74711185598c7 e = 0x10001 p2 = 49662237675630289 q2 = 62515288803124247 d2 = int(gmpy2.invert(e, (p2 - 1) * (q2 - 1))) p1 = 38456719616722997 q1 = 44106885765559411 d1 = int(gmpy2.invert(e, (p1 - 1) * (q1 - 1))) def int_str(data): s = '' while data: s += chr(data & 0xff) data >>= 8 return s[::-1] cf = savefile.load_savefile(open('prove.pcap', 'rb')) output = {} key = [] for p in cf.packets: p = str(p.packet)[2:-1] if len(p) <= 140: continue p = str(base64.b64decode(int_str(int('0x' + p[140:], 16)))) # ' b'SEQ = XX; DATA = XXX; SIG = XXX;' ' p = p.split(';') seq = int(p[0].split()[-1]) cipher = int(p[1].split()[-1][:-1], 16) sig = int(p[2].split()[-1][:-1], 16) ming = int(gmpy2.powmod(cipher, d2, n2)) if int(gmpy2.powmod(ming, d1, n1)) == sig: output[seq] = ming key.append(seq) key = sorted(key) print(''.join(chr(output[k]) for k in key))