[SWPU 2019]Network-TTL加密和涉及的一些知识


TTL解释:  

TTL是IP协议包中的一个值,它告诉网络路由器包在网络中的时间是否太长而应被丢弃。有很多原因使包在一定时间内不能被传递到目的地。例如,不正确的路由表可能导致包的无限循环。一个解决方法就是在一段时间后丢弃这个包,然后给发送者一个报文,由发送者决定是否要重发。TTL的初值通常是系统缺省值,是包头中的8位的域。TTL的最初设想是确定一个时间范围,超过此时间就把包丢弃。由于每个路由器都至少要把TTL域减一,TTL通常表示包在被丢弃前最多能经过的路由器个数。当记数到0时,路由器决定丢弃该包,并发送一个ICMP报文给最初的发送者。

不同的系统会有不一样的TTL,常用的系统默认最大TTL如下:

Linux:64或255。

微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 128。
微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 32。

window7或window10的默认TTL为127。

FreeBSD和新版本的Red Hat Linux的TTL基数是64

可以通过ping127.0.0.1查看最大的TTL:

window系统修改最大的TTL:

netsh interface ipv4 set global defaultcurhoplimit=64

 linux修改TTL:

vim /proc/sys/net/ipv4/ip_default_ttl

题目详解:

1,下载附件:

       

每一行都只有一个值,63,255,191等等,不难发现,这些值都为2的n次方减去一后的值,此处为TTL加密。

TTL加密: 

简单来说就是,图中63,127,191,255转化为二进制的值分别为 00111111,01111111,10111111,11111111。

发现只有前两位不同,TTL加密就是利用前两位进行加密,将每个前两位重新进行合并,8位为一组。

所以TTL加密的解密方法:

1,将所有前两位合并为8位,并且每八位一组。

2,将上面的每组转化为十六进制的字符

脚本:

import binascii

f = open('[SWPU 2019]Network.txt', "r")
str = ''
Binary = ''
number = ''
while 1:
    num = f.readline()
    if not num:
        break
    if num.rstrip() == '63':  # 去掉每行后面的空格
        Binary = '00'
    elif num.rstrip() == '127':
        Binary = '01'
    elif num.rstrip() == '191':
        Binary = '10'
    elif num.rstrip() == '255':
        Binary = '11'
    str += Binary
for i in range(0, len(str), 8):
    number += chr(int(str[i:i + 8], 2))
data = binascii.unhexlify(number)

f2=open('1.txt','wb')
f2.write(data)
f2.close()

把1.txt文件放入winhex中查看:

文件头为50 4B 03 04这是zip的头文件标记,00 08 08 00 偶数,无加密压缩,直接把文件名改为zip发现里面存在flag.txt文件。

后面双==,并且内容中存在大于7的数字和a-z,为base64加密,使用base64解密。

 Base64加密原理:

         Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。

 例子:

 对10101101,10111010,01110110进行base64加密,从尾开始每六位为一组,前面补两组0

转换后 00101011, 00011011 ,00101001 ,00110110。

十进制 43 27 41 54对应base64表中的r b p 2。

假如要加密的数据加密数据不足三位,就得使用=进行填充,比如原文a,不足三位,后面就得补==号,缺一位就补一个=号。z

base32加密原理

任意给定一个二进制数据,以5个位(bit)为一组进行切分,不足用0填充,对切分而成的每个组进行编码,转换为十进制对应base32表中的一个字符。

例子:对01100010,01101000,01110011,01110100进行base64加密

每5个bit切割:01100,01001,10100,00111,00110,11101,00000

十进制对应 12,9,20,7,6,29,0

对应base32索引表中的:MJUHG5A。

同样Base32按5比特切分的二进制数据必须是40比特的倍数(5个8比特),不足则用=填充。

base32和base64显著区别: base64的范围为(a-z,A-Z,0-9,/,+),base32范围(A-Z,0-7)。

对flag.txt进行base64解密:

脚本:

        

import base64

f3 = open('flag.txt', 'r')
str = f3.readline()
while 1:
    strs = base64.b64decode(str)
    print(str)

读出flag

 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

M03-Aiwin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值