ctf/IERAE CTF 2024 writeup.md
... ...
@@ -62,6 +62,24 @@ curl "192.0.2.1:3000/search?user=http%3A%2F%2F192.0.2.2%3000"
62 62
63 63
## derangement
64 64
65
+`magic_word`に含まれる文字は
66
+
67
+```python
68
+LENGTH = 15
69
+CHAR_SET = string.ascii_letters + string.digits + string.punctuation
70
+
71
+def generate_magic_word(length=LENGTH, char_set=CHAR_SET):
72
+ return ''.join(random.sample(char_set, length))
73
+```
74
+
75
+によって生成されるため、
76
+
77
+- `ascii_letters`: 52文字
78
+- `digits`: 10文字
79
+- `punctuation`: 32文字
80
+
81
+の計94文字が候補になる。
82
+
65 83
```python
66 84
def is_derangement(perm, original):
67 85
return all(p != o for p, o in zip(perm, original))
... ...
@@ -69,6 +87,10 @@ def is_derangement(perm, original):
69 87
によって、`deranged`のi文字目と`magic_word`のi文字目と一致しない。
70 88
つまり、`deranged`に1度でも出現した文字は除外することができる。
71 89
90
+299回まで試行出来るので、299回の試行によって93文字を除外できればOK。
91
+
92
+ここで、
93
+
72 94
- `candidate_char_set`: ヒント文字列で出現した全ての文字の集合
73 95
- `appeared_char_set_dict[i]`: ヒント文字列のi文字目に出現した全ての文字の集合
74 96