[SWPU2019]Network
知识点
TTL隐写
参考
IP报文在路由间穿梭的时候每经过一个路由,TTL就会减1,当TTL为0的时候,该报文就会被丢弃。
TTL所占的位数是8位,也就是0-255的范围,但是在大多数情况下通常只需要经过很小的跳数就能完成报文的转发,
远远比上限255小得多,所以我们可以用TTL值的前两位来进行传输隐藏数据。
如:须传送H字符,只需把H字符换成二进制,每两位为一组,每次填充到TTL字段的开头两位并把剩下的6位设置为1(xx111111),这样发4个IP报文即可传送1个字节。
根据上述规则,可以知道TTL隐写中用到四个值:00 111111
(63),01 111111
(127),10 111111
(191),11 111111
(255),解密的时候只取前两位,然后转换成ascii
简化一下,可以这么认为:
用
00 替换 63
01 替换 127
10 替换 191
11 替换 255
于是可以写脚本:
import binascii
f=open("attachment.txt","r")
f2=open("result.txt","wb")
num=''
res=''
for i in f:
if int(i)==63:
num+="00"
if int(i)==127:
num+="01"
if int(i)==191:
num+="10"
if int(i)==255:
num+="11"
for j in range(0,len(num),8):
res += chr(int(num[j:j+8],2))#转换为字符
res = binascii.unhexlify(res)#unhexlify:从十六进制字符串返回二进制数据
f2.write(res)
查看
容易知道这是zip,修改后缀,解压,会发现文件看起来被加密了,在010editor查看发现好像有好几个压缩包堆叠在了一起,存在一个伪加密,修正之后可以解压
解压得到一个base64文本,解码几次发现加密了很多层,于是写脚本跑一下
import base64
f=open("flag.txt","r")
a=f.read()
print(f,a)
res=base64.b64decode(a)
while(1):
res=base64.b64decode(res)
print(res)