https://qiita.com/howmuch515/items/b86f7341c574edcbc717#war
こちらに上級者によるWriteupがあるので私が書くまでもないのですが…picoCTFのこの問題で手こずる初心者(=私)にはわかりにくいところがあるので説明をメモします
調査
まず問題文に”Connect on shell2017.picoctf.com:15646.”とありますがpicoCTFのサイトで用意されているシェルではtelnetコマンドが使えないのでncコマンドを使います。ncコマンドは多分どこでも使えるので、ncコマンドを使うのが普通みたいです
で、ちょっとプレイすると勝てないらしいことがわかります。
ソースコードを見ると、プレイヤーが勝った場合に表示する文に「あれ?勝った?おかしいな…」旨の文章が書いてあり、勝てないように作ってあることがわかります。
ゲーム自体は、26枚のカードデッキが2人のプレイヤー(コンピュータと人間)に作られ、それのマーク(suit)と数字を比較し、強い方が勝ち…で、26枚全て使い切ると終わりということになっています。使い切ったらカードスイッチング(?)をする予定だが未実装、という表示が出ます。
26枚のデッキ2組は、毎回固定値で生成され、乱数でシャッフルするのですが、コンピュータ側のデッキはどのカードも人間プレイヤーのカードより強くなるように生成されているので絶対に勝てません。
構造体の中身
ここで、gamestate構造体の中身は、「人間プレイヤーのカード配列、char型name配列、deckSize変数、コンピュータプレイヤーのカード配列」の順に並んでいます。
name配列に値を受け取るときに使われるreadInput関数は、末尾のインデックス+1に’