加藤祐介ブログ

AlpacaHackで始めるCTF入門7:AlpacaHack Round 5 - XorshiftStreamに挑戦

記事投稿日: 2024年12月9日(月)

最終更新日: 2024年12月9日(月)

目次

はじめに

概要

かなり遅れてにはなりますが、今回はAlpacaHack Round 5の問題に挑戦してみます。 今回は一問目の「XorshiftStream」を解いてみます。 ジャンルとしては「Crypto」とのことで、すなわち暗号解読みたいな問題ということになります。 今回もChatGPTに教えてもらいながら挑戦できたらと思います。

※ 注意:解けていません!

AlpacaHack Round 5のトップページ

AlpacaHack

AlpacaHackへのリンクはこちら

AlpacaHackのサイトへのリンク

私のCTF環境

前回の記事

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という変数にバイト形式の文字列として連結しているようです。

def encrypt(self, data: bytes):
  ct = b""
  for i in range(0, len(data), 8):
      pt_block = data[i : i + 8]
      ct += (int.from_bytes(pt_block, "little") ^ self._next()).to_bytes(
          8, "little"
      )[: len(pt_block)]
  return ct

最後にXorshiftStreamクラスを使用しています。

FLAGが求めるべき文字列っぽいです(encodeでバイト形式に変換されているっぽい)。

FLAG = os.environ.get("FLAG", "fakeflag").encode()

xssではランダムな初期値(secrets.randbelow(2**64)、keyとなる)を渡してクラスをインスタンス化しています。

xss = XorshiftStream(secrets.randbelow(2**64))

keyではFLAGと同じ長さのランダムなバイト列を取得しています。

key = secrets.token_bytes(len(FLAG))

最後に、encrypt関数にFLAGを含んだバイト列を渡して暗号化した結果のcを取得しています。 hex()は16進数として扱うためのものらしいです。 strxor()は二つの引数をXORするための関数らしいです。

c = xss.encrypt(key.hex().encode() + strxor(key, FLAG))
print(c.hex())

解法の方針

chall.pyの暗号化の手順を逆方向に辿っていけば解けそうな気はしますが、 そんなに簡単な話なのかは分かりません。 この後は時間がかかりそうなので他の方のwriteupなどを参考にしながら進めてみます。

おわりに

今日もAlpacaHackに挑戦させていただきました。 Cryptoジャンルの問題はどこから手を付けたらよいのか分からないぐらい理解できていないので、 やっぱりAlpacaHack以外(DreamHackなど)でも勉強が必要そうな感じです。 それでは、また。

お知らせ

過去のお知らせ

シリーズ記事一覧

各シリーズの記事を下記にまとめてあります。

我が家のインコ「れもん&ぽぽ&ぐぐ」の日記 我が家のインコ「れもん&ぽぽ&ぐぐ」の日記17 : れもんもぐぐも平和な日々を送っています 我が家のインコ「れもん&ぽぽ&ぐぐ」の日記16 : れもんが本に掲載されたり、愛鳥祭に行ったりなど 我が家のインコ「れもん&ぽぽ&ぐぐ」の日記15 : 落花生、新聞紙、れもんとぐぐの邂逅 インコの飼い方と注意点(2024年版) 我が家のインコ「れもん&ぽぽ&ぐぐ」の日記14 : 大人に近づくれもんと遊ぶ余裕が出てきたぐぐ 我が家のインコ「れもん&ぽぽ&ぐぐ」の日記13 : 生後4ヶ月を迎えたれもんと我が家に慣れてきたぐぐ 我が家のインコ「れもん&ぽぽ&ぐぐ」の日記12 : ぽぽが亡くなりました、そしてぐぐがやってきました インコ仲間「れもん&ぽぽ」の日記11 : ズグロシロハラインコのぽぽ、我が家へ セキセイインコ「れもん」の日記10 : 生後100日のれもん、ついに喋る セキセイインコ「れもん」の日記9 : 換羽期のれもん セキセイインコ「れもん」の日記8 : 病院へ挑戦! セキセイインコ「れもん」の日記7 : 外出用ゲージにチャレンジ! セキセイインコ「れもん」の日記6 : 新宿ことり博に行ってきました! セキセイインコ「れもん」の日記5 : 3週間経って順調に成長している模様 セキセイインコ「れもん」の日記4 : 鳥フェス千葉2024に行ってきました! セキセイインコ「れもん」の日記3 : 2週間経って我が家にも慣れてきた模様 セキセイインコ「れもん」の日記:第2回 セキセイインコの「れもん」が我が家にやってきました!
AlpacaHackで始めるCTF入門 AlpacaHackで始めるCTF入門7:AlpacaHack Round 5 - XorshiftStreamに挑戦 AlpacaHackで始めるCTF入門6:AlpacaHack Round 4 - Simple Flag Checkerに挑戦 AlpacaHackで始めるCTF入門5:AlpacaHack Round 3 - qrimeに挑戦 AlpacaHackで始めるCTF入門4:AlpacaHack Round 2 - Simple Loginに挑戦 AlpacaHackで始めるCTF入門3:初めてのCTFに参加 AlpacaHackで始めるCTF入門2:DreamhackでCTF入門 AlpacaHackで始めるCTF入門1:初めてのCTF
シェル芸 第66回シェル芸勉強会メモ 第64回シェル芸勉強会メモ ChatGPTでシェル芸勉強会の問題が解きたい シェル芸botで遊びたい(Bash)
ROS 2 ROS 2シェル芸:URDFを置換してRVizで表示する 改訂新版『ROS 2ではじめよう』を読了&メモ書き ROS 2 Jazzy公式チュートリアル02: ROS 2のノードとトピックについて ROS 2 Jazzy公式チュートリアル01: ROS 2 Jazzyのインストールから動作確認まで ROS 2 Humble 公式チュートリアル 02: ROS 2 のノード関係のコマンド ROS 2 Humble 公式チュートリアル 01: 環境構築から turtlesim まで
ポケポケブログ ポケポケブログ2:「幻のいる島」環境でもベトベトンデッキが強いです ポケポケブログ1:ベトベトン+マタドガスデッキをおすすめする
読書日記 改訂新版『ROS 2ではじめよう』を読了&メモ書き
映画日記 映画日記『ラストマイル』感想【ネタバレあり】
料理日記 料理日記:オムライス 料理日記:豆腐春巻き 料理日記:鶏肉とナスのほりにし炒め 料理日記:卵焼き 料理日記:鶏肉の照り焼き&小松菜のおひたし 料理日記:納豆蕎麦 料理日記:ローストビーフ 料理日記:バターガーリックチキン
その他 HTMLのvideoタグで貼った動画のサムネイルがSafariで表示されない問題を解決 WSL2上のUbuntuのVimで矩形選択するための設定 JR東日本公式のお忘れ物チャットにお世話になった話 HTMLとCSSで画像のスライドショーを作成 GitHub Actionsでサーバ上のブログを自動更新 『Omega Crafter』プレイ日記: チュートリアル編 自作ブログ大改造計画 Windows と Ubuntu のデュアルブート HTML数式表示テスト 自作ブログ開始

加藤祐介ブログの著作物はCC BY-NC-ND 4.0で公開されています。
加藤祐介ブログのソフトウェアはApache License 2.0で公開されています。
About License: GitHub - YusukeKatoBlog/LICENSE
© 2023 YusukeKato All Rights Reserved.