Rating:
パスワードを入力するとフラグが得られる仕組みです.
```txt
Welcome to Ricos Roughnecks. We use 1-time-pads to keep all our secrets safe from the Arachnids.
Here in the mobile infantry, we also implement some stronger roughneck checks.
Enter pad >
```
パスワードは以下の形式である必要があります.
1. 全部で38文字
2. 先頭20文字は大文字
3. 後半18文字は小文字
4. 前半19文字は,次の文字が文字コードで1多くする(ABC...)
5. 20文字目以降は,次の文字が文字コードで1少なくする(zyx...)
まず私は`ABCDEFGHIJKLMNOPQRSTzyxwvutsrqponmlkji`を入力しました.すると`[+] Welcome the mobile infantry, keep fighting.`とだけ出力され,フラグえられませんでした.
そこでDiscordを見てみるとこのようなヒントが出ていました.
```py
pad = input("Enter pad > ")
result = otp(secret, pad)
if (result == flag):
print("[+] The fight is over, here is your flag: %s" % result)
else:
print("[+] Welcome the mobile infantry, keep fighting.")
```
今回正しい`pad`となる文字は(len(upper_chers)-20+1)*(len(lower_chers)-18+1)=7*9=63しかありません.例えばこのようなものです.
```txt
ABCDEFGHIJKLMNOPQRSTzyxwvutsrqponmlkji
BCDEFGHIJKLMNOPQRSTUzyxwvutsrqponmlkji
CDEFGHIJKLMNOPQRSTUVzyxwvutsrqponmlkji
...
GHIJKLMNOPQRSTUVWXYZtsrqponmlkjihgfedc
GHIJKLMNOPQRSTUVWXYZsrqponmlkjihgfedcb
GHIJKLMNOPQRSTUVWXYZrqponmlkjihgfedcba
```
よってこれらを全探索します.
```py
from pwn import *
up = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
low = "abcdefghijklmnopqrstuvwxyz"
for i in range(7):
for j in range(9):
up_sub = up[i : i + 20]
low_sub = "".join(list(reversed(low[j : j + 18])))
pad = up_sub + low_sub
io = remote("0.cloud.chals.io", 27602)
for _ in range(100):
line = str(io.recvline())[2:-3]
print(line)
if (
line
== "Here in the mobile infantry, we also implement some stronger roughneck checks."
):
break
line = str(io.recvline())
line = str(io.recv())[2:-1]
print(line)
io.send(pad + "\n")
for _ in range(7):
line = str(io.recvline())[2:-3]
print(line)
if "flag" in line:
exit()
if "[+] Welcome" in line:
break
```
最終的にフラグが出力されました.
`[+] The fight is over, here is your flag: shctf{Th3-On1Y-G00d-BUg-I$-A-deAd-BuG}`
`shctf{Th3-On1Y-G00d-BUg-I$-A-deAd-BuG}`