这道题目做出来的人挺多的
大概意思就是作者开发了一个加密聊天程序,并且提供了一个pcap和聊天程序源代码。
程序的代码逻辑很简单。
1. 从一个csv里读取源地址,目的地址,需要发送的消息。第一列源ip,第二列为目的ip,第三列为明文消息。
2. 通过encrypt函数加密消息,加密函数逻辑也很简单,读取消息中每个字符将其转换为ascii码,然后随机生成一个1-100的整数key,每个字符的密文=明文字符ascii码*随机key。
3. 每给对方发送一个消息后,需继续在把对应的key发送给对方
这里等于给消息接受者写一个解密程序就行了.
逻辑很简单,先用scapy读取pcap,过滤出目的端口为80的所有数据包。因为发送题目给我们的source.py中就是将消息发送到目的的80端口。
因为source.py中发送的数据是list类型,所以只需要检索出包内容为List的数据就行。我这里用try catch来完成检索。
try:
x = list(payload)
if num % 2 != 0:
message_num_list.append(eval(payload.decode('utf-8')))
else:
key_list.append(eval(payload.decode('utf-8')))
num+=1
except:
pass
之后我得到两个列表,一个是所有聊天的加密消息ascii码list,一个是所有对应的key list
message_num_list = [[1234,578,325],[5958,4828,1234,2222],[2222]]
key_list = [[10,20,30],[11,24,32,13],[42]]
这里message_num_list[i]和key_list[i]的长度是一样的,message_num_list[i]代表这一条消息有几个字符,key_list[i] 表示每个字符对应的密钥
然后读取message_num_list[i]中的每一个元素以及key_listp[i]中的每个元素。
message_num_list[0][0] = 3104
key_list[0][0] = 32
3104 / 32 = 97
97对应的字符是a
执行解题程序,找到flag
这题目也可以靠手搓(用wireshark观察数据包,找到每个聊天数据包和密钥数据包,然后相除就可以了)
可以看到这个TCP Stream有6个数据包。
奇数行为加密消息
偶数行为key
手搓花的时间至少是写代码的好几倍。比赛中如果可以访问互联问,直接GPT。不允许访问互联网的话,就得提前安装好scapy库,了解其用法。既然是搞安全的,我相信应该不会有人不会写代码吧
原文始发于微信公众号(信息安全笔记):corCTF 2024-the-conspiracy writeup