###### 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! ``` 完璧