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}`

Original writeup (https://github.com/xryuseix/CTF_Writeups/blob/master/SpaceHeroes2022/Writeups.md#mobile-infantry).