用結果中的 iv 和 key 的替換掉 encrypt 函式中的隨機數。加密的過程很簡單。首先是將 flag 分割成了 8 字元一段的 parts 列表,然後對每一個 part 執行 reduce(xor, [part, iv if index == 0 else results[-1], key])——實際上對應的 result 就是 part、上一個結果或 iv 和 key 的異或。
import operatorimport randomimport refrom functools import reduce# from secret import flagdef pad(s): padding_length = (8 - len(s)) % 8 return s + chr(padding_length) * padding_lengthdef xor(a, b): assert len(a) == len(b) return bytes(map(operator.xor, a, b))def encrypt(s): iv = b'\xba=y\xa3\xc6)\xcf\xf7' # bytes(random.randint(0, 255) for _ in range(8)) key = b'}6E\xeb(\x91\x08\xa0' # bytes(random.randint(0, 255) for _ in range(8)) parts = list(map(str.encode, map(pad, re.findall(r'.{1,8}', s)))) print(parts) results = [] for index, part in enumerate(parts): print(index, part) results.append(reduce(xor, [part, iv if index == 0 else results[-1], key])) return iv, key, results# xor(part, result[-1], key)# xor(part, y) = result, y = xor(result, y)iv, key, parts = encrypt( "BUAACTF{abcdefgh}")print(f"iv = {iv}")print(f"key = {key}")print(f"parts = {parts}")
由異或的性質,,據此編碼根據結果倒序還原,便可解出原 parts。
parts = [b'\x85^}\t\xad\xec\x81,', b'\xba\x04W\xa1\xee"\xea\xc5', b'\xb7ZW\x18\x99\x82\xd6:', b'\x99\x03}\x9c\xde|\xb1\xc5', b'\xa1Tk.\x8b\xee\xbaf']decrypted = ""for i, value in reversed(list(enumerate(parts))): value = xor(value, key) prev = parts[i-1] if i > 0 else iv value = xor(value, prev) print(value) decrypted = value.decode() + decryptedprint("Flag:", decrypted)
A magical variable is available in every template if you want to print the current context: __tera_context.
隨意構造一個錯誤的語句,從返回的報錯中可以發現使用了 Tera::one_off one off template。
fetch("{% println!(__tera_context) %}")Error while rendering: Error { kind: Msg("Failed to parse '__tera_one_off'"), source: Some(Error { kind: Msg(" --> 18:35 |18 | <div class="result">您的身高為 {% println!(__tera_context) %} cm</div> | ^--- | = unexpected tag; expected end of input or some content"), source: None })
與字串相關的有 filter,但是並沒有實際可以使用的,也沒有函式可分割字串。查閱文件發現 for 迴圈可以逐字元,不過比較坑的是 Playground 的版本可能舊了,這個功能無法使用。
{% for letter in "hahahaha" %} {% if loop.index % 2 == 0%} <span style="color:red">{{ letter }}</span> {% else %} <span style="color:blue">{{ letter }}</span> {% endif %}{% endfor %}
評論