###### tags: `InterKosenCTF2020`
# [InterKosenCTF2020] in question
初手fileしてみると
```
$ file chall
chall: ELF 64-bit MSB *unknown arch 0x3e00* (SYSV)
```
うーん何だこれは.
stringsをすると
```
Usage: %s <FLAG>
Correct!
Wrong...
```
が含まれていたのでとりあえずcrackmeっぽい
`ELF 64-bit MSB *unknown arch 0x3e00* (SYSV)`でぐぐると https://pentester.blog/?p=24 が見つかった.
これによると、
>The 5th byte defines format 32 bits (1) or 64 bits (2)
>
>The 6th byte defines endianness LSB (1) MSB (2)
ということなので、6つ目を適当なhexeditorで1に変更すると、
```
$ file chall
chall: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped
```
となり、ツール関連でエラーが出ることがなくなる.
idaで開いて、適当に見ていくとそれっぽい関数を発見
![](https://i.imgur.com/C97hNbk.png)
`Corrects!`, `Wrong...`の前に`0x4002BA`が引数に入力と謎のデータが渡されて呼ばれているので謎のデータを気にしつつその関数を読む.
![](https://i.imgur.com/Fef7IBW.png)
謎データを`table`、indexを`i`とすると、
```
input[i]^input[i+1]^i^0xff = table[i]
```
となる.これは簡単なxorの演算なので式変形をして、
```
input[i+1] = table[i]^input[i]^i^0xff
```
となり、flagのprefixを使うことで正しい入力を得ることができる.
```python=
table = [0xDB, 0xE2, 0xEB, 0xF7, 0xD6, 0xED, 0xEB, 0xC5, 0xE8, 0xA2, 0xAB, 0xEE, 0xD8, 0xC1, 0xAE, 0xB7, 0xC4, 0xC5, 0xF1, 0xB0, 0xAB, 0xC1, 0xD0, 0xBE, 0xE7, 0xBA, 0xD6, 0xCE, 0xEB, 0x9F]
flag = b"K"
for i in range(len(table)-1):
flag += bytes([table[i] ^ flag[i] ^ i ^ 0xff])
print(flag)
```
ぽんぽんぽーん
```
$ python solver.py
b'KosenCTF{d0nt_l3t_th4t_f00l_u}'
```
こういうのは事故ってる可能性もなきにしもあらずなので、確認
```
$ ./chall KosenCTF{d0nt_l3t_th4t_f00l_u}
Correct!
```
完璧