Add 4 reproducible solved examples (ps_and_qs, lost_modulus, a2s, russian_threesome) + examples README
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
"""
|
||||
EXAMPLE: Hack.lu 2020 — "Russian threesome" (RE, 500p, 5 solves)
|
||||
https://github.com/p4-team/ctf/tree/master/2020-10-23-hacklu/russian_threesome
|
||||
|
||||
VULN: a balanced-ternary drum-machine dumps two permutation sectors `s7` (40
|
||||
bytes of ciphertext) and `s17` (a 256-byte S-box). The flag is recovered by
|
||||
repeatedly applying the INVERSE permutation to each `s7` byte until the sum of
|
||||
the resulting bytes equals the number of applications (a fixed-point/self-
|
||||
consistency check). Final bytes decode as CP1251 (Russian proverb).
|
||||
|
||||
Run:
|
||||
cd /home/code/ctfkit
|
||||
python3 examples/russian_threesome/solve.py
|
||||
Expected flag: "Кто хочет много знать, тому мало спать."
|
||||
"""
|
||||
import os
|
||||
|
||||
HERE = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
|
||||
def main():
|
||||
s7 = [int(c, 16) for c in open(f"{HERE}/s7").read().split()]
|
||||
s17 = [int(c, 16) for c in open(f"{HERE}/s17").read().split()]
|
||||
s17 = s17[1::2]
|
||||
inverse = [0] * 256
|
||||
for i, j in enumerate(s17):
|
||||
inverse[j] = i
|
||||
|
||||
for potential_sum in range(256 * len(s7)):
|
||||
flag = []
|
||||
for ch in s7:
|
||||
c = ch
|
||||
for _ in range(potential_sum):
|
||||
c = inverse[c]
|
||||
flag.append(c)
|
||||
if sum(flag) == potential_sum:
|
||||
b = bytes(flag)
|
||||
try:
|
||||
flag_str = b.decode("cp1251")
|
||||
except Exception:
|
||||
flag_str = b.decode("latin1")
|
||||
print("FLAG =", flag_str)
|
||||
return flag_str
|
||||
print("no flag found")
|
||||
return None
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user