AlpacaHackで始めるCTF入門7:AlpacaHack Round 5 - XorshiftStreamに挑戦
はじめに 概要 かなり遅れてにはなりますが、今回はAlpacaHack Round 5の問題に挑戦してみます。 今回は一問目の「XorshiftStream」を解いてみます。 ジャンルとしては「Crypto」とのことで、すなわち暗号解読みたいな問題ということになります。 今回もChatGPTに教えてもらいながら挑戦できたらと思います。 ※ 注意:解けていません! AlpacaHack Round 5のトップページ AlpacaHack AlpacaHackへのリンクはこちら AlpacaHackのサイトへのリンク 私のCTF環境 Windows 11/WSL2 Ubuntu 24.04 LTS 前回の記事 2024年10月14日の記事です。 AlpacaHackで始めるCTF入門6:AlpacaHack Round 4 - Simple Flag Checkerに挑戦 問題内容 XorshiftStreamの問題ページを開くと「tar.gz」ファイルが取得できます。 これを下記のようなコマンドで展開すると「chall.py」「output.txt」が取得できます。 chall.pyを実行してoutput.txtが出力された場合、chall.pyの中に書かれているflagはどういう文字列になるか求める問題っぽいです。 tar -zxvf xorshift-stream.tar.gz chall.pyを読んでみる output.txtは一つの文字列が書かれているだけなので、 読み解くべきものはchall.pyだけです。 chall.pyにはXorshiftStreamというクラスが用意されていて、このクラスの中のencryptという関数を実行して得られた出力がoutput.txtとなるみたいです。 まずXorshiftStreamクラスではインスタンス化の際に引数として受け取ったkeyを2の64乗で割った余り(64ビットの範囲におさめるため?)をstateという変数に格納しています。 def __init__(self, key: int): self.state = key % 2**64 次に_next関数では問題のタイトルにも含まれているXORShiftを使って疑似乱数的なものを生成しているようです。 ^がXOR、<<と>>がシフト演算となります。 def _next(self): self.state = (self.state ^ (self.state << 13)) % 2**64 self.state = (self.state ^ (self.state >> 7)) % 2**64 self.state = (self.state ^ (self.state << 17)) % 2**64 return self.state そして肝心のencrypt関数では引数で受け取ったdataを8バイトずつ切り出して、_next関数で生成した疑似乱数とのXORを取っているようです。 そしてその結果をctという変数にバイト形式の文字列として連結しているようです。 ...




