38b5bf095a514f2dbb64618f7e084d0941016fc5
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 |