CTF

西湖论剑

TTL writeup

Posted by pic4xiu on April 7, 2019

TTL

An interesting misc

拿到本题很奇怪,题目文件是

TTL=127
TTL=191
TTL=127
TTL=191
TTL=127
TTL=191
TTL=127
TTL=191
TTL=127
TTL=191
TTL=127
TTL=63
TTL=63
TTL=255
TTL=191
TTL=63
...

我们没什么思路,只是看到很多TTL的值

TTL是 Time To Live的缩写,该字段指定IP包被路由器丢弃之前允许通过的最大网段数量。TTL是IPv4包头的一个8 bit字段。 –摘自百度百科

没什么思路,在网上搜索了一波发现

IP报文在路由间穿梭的时候每经过一个路由,TTL就会减1,当TTL为0的时候,该报文就会被丢弃。TTL所占的位数是8位,也就是0-255的范围,但是在大多数情况下通常只需要经过很小的跳数就能完成报文的转发,远远比上限255小得多,所以我们可以用TTL值的前两位来进行传输隐藏数据。

如:须传送H字符,只需把H字符换成二进制,每两位为一组,每次填充到TTL字段的开头两位并把剩下的6位设置为1(xx111111),这样发4个IP报文即可传送1个字节。 –摘自此处

Analysis

My thought

于是思路有了,想到把TTL直接用python按下列替换

  • 63 = 00111111
  • 127 = 01111111
  • 191 = 10111111
  • 255 = 11111111

但是想到要提取前2位,所以我们按下列替换

  • TTL=63 -> 00
  • TTL=127-> 01
  • TTL=191-> 10
  • TTL=255-> 11
  • “\n” -> ““(趁机把换行替换)

py脚本类似下方

fp1=open("ttl.txt","r")
fp2=open("ttl_1.txt","w")
 
for s in fp1.readlines():#读出
    fp4.write(s.replace("TTL=63","00")) #替换并写入
fp1.close()
fp2.close()

之后我们得到一串二进制数字(具体是295326组),然后我们就要把这串数字转换为字符串

import re
aa="(那串数字,当然打开文件也可以)"
bb=re.findall(r'.{8}',aa)#以八位为一组进行读取
str1 = ""
for b in bb:
    str1 += chr(int(b,2))

print(str1)

终于得到了一堆二进制数字看到开头是FFD8FF,我们可以直接将这串字符串另存为png格式(就叫a.png),奇迹发生了,是1/6个二维码,我们想到应该是图片分离,利用 foremost a.png得到六个二维码,画图大法直接拼接即可扫码,然后就得到二位码内容

key:AutomaticKey 
cipher:fftu{2028mb39927wn1f96o6e12z03j58002p}

看到AutomaticKey我们就理解了,本题是Autokey Cipher,我们直接到这在线解题,得到flag??怎么比原来短了,看了看发现,哦,数字都消失了,没事,我们直接手动填写,Get!

Summary

A zibi day

今天做西湖论剑,本来本人想做逆向和pwn,结果全程划水,就解了几道题,还没逆向和pwn,看了看杂项和密码,把最简单的做了。逆向第一题是C++的时候心态都爆了,之后心情极度难受,主要还是太菜了,焦灼等待writeup,继续学习啊~

TTL