1. 程式人生 > 實用技巧 >Buuoj rot

Buuoj rot

線索

題目給了密文:

83 89 78 84 45 86 96 45 115 121 110 116 136 132 132 132 108 128 117 118 134 110 123 111 110 127 108 112 124 122 108 118 128 108 131 114 127 134 108 116 124 124 113 108 76 76 76 76 138 23 90 81 66 71 64 69 114 65 112 64 66 63 69 61 70 114 62 66 61 62 69 67 70 63 61 110 110 112 64 68 62 70 61 112 111 112

嘗試rot解碼

  1. 最開始嘗試rot5,得到的結果沒什麼意義。後來想到rot13是字母移位13,何不試一下對密文的數字加減13看看結果。減13轉ASCII發現前4個數字對應FLAG因此程式碼如下:  
c = "83 89 78 84 45 86 96 45 115 121 110 116 136 132 132 132 108 128 117 118 134 110 123 111 110 127 108 112 124 122 108 118 128 108 131 114 127 134 108 116 124 124 113 108 76 76 76 76 138 23 90 81 66 71 64 69 114 65 112 64 66 63 69 61 70 114 62 66 61 62 69 67 70 63 61 110 110 112 64 68 62 70 61 112 111 112"
c = c.split(" ")

flag = ""
for i in c:
    i = int(i) - 13
    flag += chr(i)
print(flag)
  1. 跑出來結果如下:

FLAG IS flag{www_shiyanbar_com_is_very_good_????}
MD5:38e4c352809e150186920aac37190cbc

  1. 原以為這就是最終的flag了,提交發現不對。意識到尾部的四個?是需要通過現有字串已知部分和最終的MD5值求解的~

通過md5值爆破字串中4位未知字元

程式碼如下,只會這個笨方法,跑出結果大概一兩分鐘。應該有更優的方法。。。

import hashlib

head = "flag{www_shiyanbar_com_is_very_good_"
tail = "}"
md5 = "38e4c352809e150186920aac37190cbc"

for c1 in range(33,127):
    for c2 in range(33,127):
        for c3 in range(33,127):
            for c4 in range(33,127):
                st = head + chr(c1) + chr(c2) + chr(c3) + chr(c4) + tail
                a = hashlib.md5()
                a.update(st.encode())
                if a.hexdigest() == md5:
                    print(st)

flag{www_shiyanbar_com_is_very_good_@8Mu}