1. 程式人生 > >2018/11/19-湖湘杯Re-Common Crypto

2018/11/19-湖湘杯Re-Common Crypto

Common Crypto

題目連結:https://pan.baidu.com/s/1NMXHOyu8F6YzbjDx84I2eg
提取碼:qt6u 

 

首先要求輸入32個字元,然後接著兩個函式的是對輸入的前16位進行aes加密。

 

 

在第一個函式是aes的一部分對金鑰進行處理,我們在裡面發現找到金鑰賦值的部分,金鑰為16個位元組,可以寫出金鑰的十六進位制為{0x1b,0x2e,0x35,0x46,0x58,0x6e,0x72,0x86,0x9b,0xa7,0xb5,0xc8,0xd9,0xef,0xff,0xc}

 

 

 

下面的一個函式即是對輸入的前

16位進行了加密,後16位沒有變化。

緊接著是一個do-while迴圈,對aes加密後的輸入的32位的每個個位元組進行處理。每個位元組經過函式後能生成兩個位元組。

 

 

 

這個do-while迴圈中的fun作用是將每個位元組的十六進位制以兩個位元組的形式寫在最後的比較地址上。

例如字元1’,ascii值為31,經過函式後生成0x30x1兩個位元組。

 

最後經過do-while迴圈生成64個位元組,最後和"934d8706bed74cd6eea683c7be86b2eb32616562363039383965386433333531"進行比較。

 

 

 

 

我們知道後flag的後16位只經過do-while迴圈中的函式處理了,我們可以直接根據比較資料的後32位“32616562363039383965386433333531”每兩位一組寫出flag的後16為  “2aeb60989e8d3351”。

 

16位則是根據金鑰加密得到的密文,我們也可以寫出來密文的十六進位制陣列為{0x93,0x4d,0x87,0x06,0xbe,0xd7,0x4c,0xd6,0xee,0xa6,0x83,0xc7,0xbe,0x86,0xb2,0xeb}

 

 

現在我們只需要根據金鑰和密文寫進行

aes解密即可得到flag的前十六位

Python指令碼如下

L1=[0x1b,0x2e,0x35,0x46,0x58,0x6e,0x72,0x86,0x9b,0xa7,0xb5,0xc8,0xd9,0xef,0xff,0xc]

for i in range(len(L1)):

    L1[i] = chr( L1[i])

key = ''. join( L1)

aes = AES.new(key, AES.MODE_ECB)

L2=[0x93,0x4d,0x87,0x06,0xbe,0xd7,0x4c,0xd6,0xee,0xa6,0x83,0xc7,0xbe,0x86,0xb2,0xeb]

for i in range(len(L2)):

    L2[i] = chr( L2[i])

cipher = ''. join( L2)

plain = aes.decrypt( cipher)

print plain

 

可以解出來前16位為“hxb2018{853ecfe5”。

 

 

加上後十六位flag就是“hxb2018{853ecfe52aeb60989e8d3351”我們嘗試提交發現flag錯誤,補全大括號後,顯示正確。

 

flaghxb2018{853ecfe52aeb60989e8d3351}