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、&lt;&lt;と&gt;&gt;がシフト演算となります。 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という変数にバイト形式の文字列として連結しているようです。 ...

2024年12月9日 · Yusuke Kato

AlpacaHackで始めるCTF入門6:AlpacaHack Round 4 - Simple Flag Checkerに挑戦

はじめに 概要 今日は祝日なので遅ればせながらAlpacaHack Round 4の問題に挑戦してみます。 今回は最初の問題の「Simple Flag Checker」を解いてみます。 ジャンルとしては「Rev」とのことです。 いわゆるリバースエンジニアリングの問題でバイナリのファイルが与えられるので、 そのファイルを解析してflagを取得するような問題っぽいです。 バイナリとかアセンブラとかよく分かっていないのでいつも通りChatGPTに助けてもらいながらやっていこうと思います。 AlpacaHack Round 4のトップページ AlpacaHack AlpacaHackへのリンクはこちら AlpacaHackのサイトへのリンク 私のCTF環境 Windows 11/WSL2 Ubuntu 22.04 LTS Ghidra 前回の記事 2024年10月13日の記事です。 AlpacaHackで始めるCTF入門5:AlpacaHack Round 3 - qrimeに挑戦 問題内容 問題ページを開くとcheckerというファイルをダウンロードできます。 おそらくこのファイルが何かしらの言語で書かれたソフトのソースコードをコンパイルしてできた実行ファイル(バイナリ)みたいなものだと思います。 つまり、このバイナリの実行ファイルをソースコードに戻せたらflagが取得できそうです。 checkerを調べてみる まずはfileコマンドでcheckerファイルの形式を確認してみます。 $ file checker checker: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=c2dd390ecbb794a78e20db0151832e9dd5c6359d, for GNU/Linux 3.2.0, not stripped ChatGPTに聞いたところ一般的なバイナリファイルらしいです。また、not strippedだと関数名や変数名の情報が残っていて解析しやすいっぽいです。 次にstringsコマンドで中身を確認してみます。 $ strings checker /lib64/ld-linux-x86-64.so.2 mgUa __cxa_finalize fgets __printf_chk __libc_start_main puts memcmp stdin ... fgetsやstdinがあるのでC/C++言語っぽいです。 ...

2024年10月14日 · Yusuke Kato

AlpacaHackで始めるCTF入門5:AlpacaHack Round 3 - qrimeに挑戦

はじめに 概要 かなり遅れてになりますが、今回はAlpacaHack Round 3の問題に挑戦してみます。 今回は最初の問題の「qrime」を解いてみます。 ジャンルとしては「Crypto」とのことです。 Cryptoは暗号関係の問題ということで私はほとんど暗号の知識を持っていませんが、調べつつ頑張ってみます。 AlpacaHack Round 3のトップページ AlpacaHack AlpacaHackへのリンクはこちら AlpacaHackのサイトへのリンク 私のCTF環境 Windows 11/WSL2 Ubuntu 22.04 LTS 前回の記事 2024年9月8日の記事です。 AlpacaHackで始めるCTF入門4:AlpacaHack Round 2 - Simple Loginに挑戦 問題内容 この問題ではprime.tar.gzというファイルが与えられます。 中身を展開してみるとchall.pyとchall.txtの二つのファイルが入っています。 chall.pyを読んでみると素数を使ってflagを暗号化してそうな感じがしました(全然違かったらすみません)。 chall.txtはchall.pyの実行結果を保存したファイルっぽいです。 この2つのファイルからflagを取得する問題のようです。 chall.pyを実行してみる 実行にはCryptoというライブラリが必要そうなのでインストールしておきます。 おまけで下記の記事のとおりに他のライブラリもインストールしてみます。 pip install pycryptodome gmpy2 pwntools z3 参考記事↓ Zenn - Crypto で便利なツールを紹介する とりあえず下記のコマンドで実行してみますが、処理が終わらず、出力結果が返ってきません。 python3 chall.py どうやらいい感じの乱数(素数?)が取得できるまでループしているっぽいです。 flagの取得方法を考えてみる ということで、おそらくchall.pyを自分の環境で実行する必要はなくて、chall.pyを実行した際にchall.txtが結果として返ってきた場合、 flagはどうなるかということを考えれば良さそうです。 chall.pyを読み解いてみる chall.pyの内容を箇条書きしてみます。 nextPrime関数:入力n以上の素数を返しそう gen関数:変数p,q,rを生成しそう r:ランダム整数 q:ランダム素数 p:rとqから生成した素数っぽい(本当に?) flag:文字列をバイト列に変換したもの? m:flagを整数に変換したもの?(long intかな?) n:p*q phi:(p-1)*(q-1)、dを求めるのに使ってるけど、ヒント的なもの? e:65537 d:pow(e,-1,phi)、使ってなさそうだけど、ヒント的なもの? c:pow(m,e,n)、これがflagを暗号化したもの?、flagを65537乗してからnで割った余りをとっているらしい 何にも分からないけど、逆に計算していけばflagが求まる? ...

2024年10月13日 · Yusuke Kato

AlpacaHackで始めるCTF入門4:AlpacaHack Round 2 - Simple Loginに挑戦

はじめに はじめに リアルタイムではないですが、AlpacaHack Round 2の問題に挑戦してみます。 今回は最初の問題の「Simple Login」を解いてみます。 ジャンルとしては「Web」とのことです。 CTFの問題はまだ数問しか解いたことがないので初心者も初心者ですが、 調べながらやっていこうと思います。 AlpacaHack Round 2のトップページ AlpacaHack AlpacaHackへのリンクはこちら AlpacaHackのサイトへのリンク 私のCTF環境 Windows 11/WSL2 Ubuntu 22.04 LTS 前回の記事 2024年8月19日の記事です。 AlpacaHackで始めるCTF入門3:初めてのCTFに参加 Simple Login 問題を確認 問題はこんな感じです。 ログイン処理があるウェブサイトが題材のようです。 これまでCTFに参加してこなかったのでCTFの普通というものが分かっていないですが、基本的にはCTFでは問題文的なものはないっぽいです(もちろん問題文があるコンテストもあるとは思います)。 flagを回収するというルールは変わらないので問題文は必要ないのかもしれません。 問題情報 問題用サーバにアクセスしてみる 「simple-login.tar.gz」をクリックすると問題のデータをダウンロードできます。 「.tar.gz」は圧縮ファイルなので展開します。 中身を確認するとウェブサイトのトップページとログインページのHTMLファイル、サーバ側の処理のPythonスクリプト、データベースのファイルが存在しています。 次に「Spawn Challenge Server」ボタンをクリックして問題用サーバを起動します。 とりあえずアクセスしてみるとログイン画面が表示されます。 データベースのファイルを読んでみるとユーザ名がadminでパスワードがpassのユーザデータがあるっぽいので入力してみます (hackerというユーザもいる)。 INSERT INTO users (username, password) VALUES ('admin', 'pass'); INSERT INTO users (username, password) VALUES ('hacker', '1337'); ログイン画面↓ ログイン画面 ログインできるとこのような表示になります↓ ログインできた flagの場所を確認 データベースのファイルを読んでみると「flag」が挿入されている箇所が見つかるので、おそらくデータベースからflagを奪取できれば良いのだろうと分かります。 INSERT INTO flag (value) VALUES ('Alpaca{REDACTED}'); flagを奪取する方針 ウェブ上での動作は確認できたのでサーバ側の処理も確認します。 Pythonスクリプトを読んでみるとログインページにPOSTされた時に、 データベースからユーザ情報を照合しているようです。 つまりここでSQLインジェクションを行える可能性があります。 ...

2024年9月8日 · Yusuke Kato

AlpacaHackで始めるCTF入門3:初めてのCTFに参加

はじめに はじめに 記念すべきAlpacaHack初のCTFに参加しました。 結果としては一問も解けずに終了しましたが、 とてもおもしろくて勉強にもなったので記録に残しておきます。 AlpacaHack Round 1のトップページ AlpacaHack AlpacaHackへのリンクはこちら AlpacaHackのサイトへのリンク 私のCTF環境 Ubuntu 22.04 LTS 前回の記事 2024年8月14日の記事です。 AlpacaHackで始めるCTF入門2:DreamhackでCTF入門 AlpacaHackのCTFに参加 参加登録 まずはAlpacaHack Round 1のトップページにアクセスして手順に従って参加登録を行います。 トップページ 問題一覧 今回はPwnジャンルの問題が4つ出題されました。 とりあえず一番上の比較的簡単な問題に挑戦します。 ただし、相対的に簡単というだけでPwnの問題はCTFの中でも基本的に難しいらしいです。 問題一覧 問題:echo 問題「echo」はこんな感じです。 echo ソースコードを読んでみたところ、 ユーザから入力文字数と文字列を受け取ってから、 受け取った文字列をそのまま出力するシステムだということは理解できました。 また、ソースコードの中にwin関数というものがあって、 このwin関数をどうにかして実行できればflagを取得できるようでした(CTFにおいてwin関数はよく出てくるものっぽいです)。 pwnにおけるwin関数をググってみたら下記の記事が見つかりました。 こちらの記事ではスタックバッファオーバーフローを発生させてReturn Addressを上書きする方法が丁寧に説明されています。 とてもわかりやすくて助かりました。 Qiita:(CTF) Pwn入門 私もこちらの記事を参考にしながらどうにかしてスタックバッファオーバーフローを起こしたかったのですが、 どうにもなりませんでした。 まだまだ分からないことだけです。 それでもいろいろ調べて勉強できたので参加して良かったと思います。 公式Writeup 公式のWriteupが公開されています。 AlpacaHack Round 1 (Pwn)のWriteup 公式アンケート AlpacaHackに関してアンケート調査が行われているようです。 keymoonさんのXのポスト おわりに 初めてリアルタイムでCTFに参加しました。 とても楽しかったので今後もまた参加したいと思います。 それでは、また。 次の記事 2024年9月8日の記事です。 AlpacaHackで始めるCTF入門4:AlpacaHack Round 2 - Simple Loginに挑戦

2024年8月19日 · Yusuke Kato

AlpacaHackで始めるCTF入門2:DreamhackでCTF入門

はじめに はじめに AlpacaHackでCTFを始めてみましたが、私のようにCTFが何なのかもよく分かっていない場合は スタートラインに立つために他のサイトでも勉強したほうが良いみたいです。 ということで今回は韓国のCTFサイトである「Dreamhack」に挑戦してみようと思います。 DreamhackはCTFのコンテストを開催しているのはもちろんのこと、 幅広いジャンルの教育講座も充実しているため、 かなり初心者にも優しい気がしました。 また、サイト上では韓国語も使われていますが、 教育講座の説明文は私が確認した範囲では英語で書かれていたのである程度は読めると思います。 Dreamhackのサイトへのリンク Dreamhack AlpacaHack AlpacaHackへのリンクはこちら AlpacaHackのサイトへのリンク 私のCTF環境 Ubuntu 22.04 LTS 前回の記事 2024年8月13日の記事です。 AlpacaHackで始めるCTF入門1:初めてのCTF Dreamhackの始め方 ログイン まずはDreamhackへアクセスし、アカウントを作成してからログインします。 ログインしないと教育講座は受けられないっぽいです。 Dreamhackのサイトへのリンク(再掲) Dreamhackにログインした後のホーム画面↓ Dreamhack(再掲) 教育講座を受ける 画面上部にタブがいくつかありますが、今回は勉強したいので「Learn」をクリックします。 Learnタブのページには各ジャンルごとのロードマップが表示されます。 Learnタブのページ↓ Learnタブのページ まずはその中から「Beginners」>「Dream Beginners」を選択します。 すると選択したロードマップのコンテンツが表示されるので 「Introduction」を選んで「Start」をクリックすれば教育講座を始められます。 Dream Beginnersのコンテンツ Dreamhackの初心者講座 後は講座内容に従って進めていくだけです。 ここでは初心者講座のさわり部分だけ箇条書きします。 扱う主なジャンル Web:webサイトやwebアプリのサーバやクライアントのシステムに関する問題 Pwnable:プログラムの脆弱性に関する問題 Reversing:リバースエンジニアリングに関する問題 Crypto:暗号に関する問題 Forensics:情報セキュリティにおけるインシデントの調査方法や技術に関する問題 Professional Programming and Coding(PPC):競技プログラミング Misc:その他 より具体的な領域:Network、kernel、browser、blockchain、etc… Wargameとは Wargame:意図的に脆弱性が存在するように設計された環境をハッキングするゲーム Wargameは実践環境を想定して行うものっぽい CTFは競技に特化して問題を設定して競うものっぽい flagとは ハッキングが成功したことを証明するための文字列 Dreamhackでは基本的にDH{…}の形式(例外あり) 便利なエンコードツール Dreamhack Tools emn178.github.io/online-tools ...

2024年8月14日 · Yusuke Kato

AlpacaHackで始めるCTF入門1:初めてのCTF

はじめに はじめに 個人戦CTFを開催するプラットフォーム「AlpacaHack」を通じて本日からCTFに挑戦してみようと思います。 大学生の頃に競技プログラミングは少し触れたことがあって、いずれはCTFにも挑戦してみたいとは常々考えていました。 そんな中でタイミング良くAlpacaHackが公開されたのでさっそく挑戦してみようと思います。 私のCTF環境 Ubuntu 22.04 LTS AlpacaHackとは AlpacaHackは2024年8月(おそらく)に公開された個人戦CTFを開催するプラットフォームです。 CTFでは複数人でチームを組んでコンテストに参加するのが一般的っぽいですが、 AlpacaHackでは個人で参加できます(チーム参加は禁止っぽいです)。 AtCoderのような競技プログラミングサイトのCTF版という感じでしょうか。 また、AlpacaHackのコンテストでは簡単な問題から難しい問題までが出題されるので、 初心者から上級者まで楽しめるそうです。 AlpacaHackのサイトへのリンク CTFとは CTFは「Capture The Flag(旗取り合戦?)」の略称で、情報セキュリティに関する競技のことを指すようです。 基本的には与えられた問題を解く速さを競います(他にも競技内容がいろいろあるっぽいです)。 たとえば、ウェブサイトのシステムのデータが与えられたら、そのシステムの脆弱性を見つけて「flag」と呼ばれる文字列を奪取します。そのflagを提出することで問題クリアとなります(あくまでこれは一例で他にもいろいろな問題の種類があるみたいです)。 また、競技ではありますが、過去の問題にも挑戦できるので他人と競わなくても問題を解くことができます。 AlpacaHackにアクセス Home それではさっそくAlpacaHackにアクセスし、アカウントを作成してからログインします。 下記の画像がAlpacaHackのHomeページです。 Homeでは次に開催するコンテストの日程を確認できます。 AlpacaHackのサイトへのリンク(再掲) AlpacaHackのHomeページ Homeのページ最下部では下記の画像のように解いた問題数のユーザランキングも確認できます。 2024年8月13日現在では18問解いた方が一位です(ちなみに私はまだ3問しか解いていません)。 問題を解いた数のランキング CTFs CTFsページでは今後開催されるコンテストと過去のコンテストを確認できます。 CTFsページ Challenge Archive Challenge Archiveページでは過去問を解くことができます。 自分が解いた問題はチェックマークが付いています。 Challenge Archiveページ さっそく解いてみる まずはテスト問題的な「Welcome」を解いてみます。 とはいっても特にやることはなくて、 この問題の概要に「Here is the flag: Alpaca{Welcome to AlpacaHack!}」と書かれているので、 flagが「Alpaca{Welcome to AlpacaHack!}」であることが分かります。 AlpacaHackではflagは「Alpaca{…}」の形式となっているようです。 正解のflagを入力して「Submit」ボタンを押すと「Solved」と表示されます。 Welcome 追記(2024/08/14) AlpacaHack開発者のkeymoonさんがCTF入門のために参考になるサイトをXで紹介してくださっていたので、 私もそれらのサイトを利用してみようと思います。 皆様もぜひ。 keymoon(ID:kymn_)さんのポストのリンク ...

2024年8月13日 · Yusuke Kato