2019西湖論劍——一小小部分writeup

Misc: 奇怪的TTL

題目描述:

我們截獲了一些IP數據報,發現報文頭中的TTL值特別可疑,懷疑是通信方嵌入了數據到TTL,我們將這些TTL值提取了出來,你能看出什麼端倪嗎?

通過不斷嘗試找到一種正確的思路:

在TTL字段中隱藏


IP報文在路由間穿梭的時候每經過一個路由,TTL就會減1,當TTL爲0的時候,該報文就會被丟棄。TTL所佔的位數是8位,也就是0-255的範圍,但是在大多數情況下通常只需要經過很小的跳數就能完成報文的轉發,遠遠比上限255小得多,所以我們可以用TTL值的前兩位來進行傳輸隱藏數據。

如:須傳送H字符,只需把H字符換成二進制,每兩位爲一組,每次填充到TTL字段的開頭兩位並把剩下的6位設置爲1(xx111111),這樣發4個IP報文即可傳送1個字節。

from http://drops.the404.me/1981.html?tdsourcetag=s_pctim_aiomsg

寫個python腳本跑一下

f = open("ttl.txt")
flag = ""
count = 0
tmp = ""

for i in f.readlines():

    count += 1
    if count == 5:
        print(tmp)
        flag += chr(int(tmp, 2))
        tmp = ""
        count = 1

    s = i.split('=')
    str = s[1]
    num = bin(int(str))
    num = num.split('b')[1].zfill(8)
    tmp += num[0:2]

print(flag)
print(flag.__len__()) # 73843

得到解密後的信息是:ffd8ffe10……

很明顯是jpeg圖片16進制頭

找了個java程序把16進制字符串轉換爲圖片

tips: 將python腳本跑出來的字符串保存到txt中,需要注意字符串尾是FFD,需要加一個9 (FFD9是jpg文件結尾標誌)

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;

/**
 * 十六進制轉成圖片
 */
public class Hex2Image
{
    public static void main(String[] args) throws Exception
    {
        Hex2Image to = new Hex2Image();
        InputStream is = new FileInputStream("D:/111.txt");
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String str = null;
        StringBuilder sb = new StringBuilder();
        while ((str = br.readLine()) != null)
        {
            System.out.println(str);
            sb.append(str);
        }
        to.saveToImgFile(sb.toString().toUpperCase(), "D:/bbb.jpg");
    }

    public void saveToImgFile(String src, String output)
    {
        if (src == null || src.length() == 0)
        {
            return;
        }
        try
        {
            FileOutputStream out = new FileOutputStream(new File(output));
            byte[] bytes = src.getBytes();
            for (int i = 0; i < bytes.length; i += 2)
            {
                out.write(charToInt(bytes[i]) * 16 + charToInt(bytes[i + 1]));
            }
            out.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    private int charToInt(byte ch)
    {
        int val = 0;
        if (ch >= 0x30 && ch <= 0x39)
        {
            val = ch - 0x30;
        }
        else if (ch >= 0x41 && ch <= 0x46)
        {
            val = ch - 0x41 + 10;
        }
        return val;
    }
}

得到

這只是二維碼的一部分,winhex修改寬高,並不行,但是看到裏面存在好幾個圖片exif開頭,所以使用foremost分離,

得到了6張二維碼圖片,拼接到一起掃描

得到

key:AutomaticKey cipher:fftu{2028mb39927wn1f96o6e12z03j58002p}
很明顯自動密鑰密碼在線工具解密

得到

flagabdfdeabee

再把對應位置的數字加上就行了

 

 

 

 Misc:哈夫曼

這個題目很簡單沒什麼彎,就是普通的huffman編碼,學過數據結構的都會,就不多說了。

畫出哈夫曼樹後  根據flag{}這幾個字符再調整一下,就可以拿哈夫曼樹解碼了。

tips:這裏面d和5這兩個字符比較坑,如果不對就相互替換一下。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章