<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>picoCTF / picoGym Writeups</title><link>https://swkima-dev.github.io/ctf-writeups/</link><description>Recent content on picoCTF / picoGym Writeups</description><generator>Hugo -- 0.152.2</generator><language>ja</language><lastBuildDate>Thu, 20 Nov 2025 19:05:01 +0900</lastBuildDate><atom:link href="https://swkima-dev.github.io/ctf-writeups/index.xml" rel="self" type="application/rss+xml"/><item><title>PicoGym Crack the Gate 2</title><link>https://swkima-dev.github.io/ctf-writeups/posts/picogym-crack-the-gate-2/</link><pubDate>Thu, 20 Nov 2025 19:05:01 +0900</pubDate><guid>https://swkima-dev.github.io/ctf-writeups/posts/picogym-crack-the-gate-2/</guid><description>&lt;h2 id="問題リンク"&gt;問題リンク&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://play.picoctf.org/practice/challenge/521"&gt;https://play.picoctf.org/practice/challenge/521&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="概要"&gt;概要&lt;/h2&gt;
&lt;p&gt;ログインフォームが与えられ、「emailは特定したので
侵入してね」というもの&lt;/p&gt;
&lt;p&gt;サイトURLとEmailとは別に、パスワードのリストも与えられます&lt;/p&gt;
&lt;p&gt;本問は&lt;a href="https://swkima-dev.github.io/ctf-writeups/posts/picogym-crack-the-gate-1/"&gt;&amp;ldquo;Crack the Gate 1&amp;rdquo;&lt;/a&gt;という問題の続きという位置づけ&lt;/p&gt;
&lt;h2 id="予備知識"&gt;予備知識&lt;/h2&gt;
&lt;h3 id="x-forwarded-for-ヘッダー"&gt;X-Forwarded-For ヘッダー&lt;/h3&gt;
&lt;p&gt;リクエストヘッダーの一種です。
端的に言えば、元のクライアントのIPアドレスをウェブサーバーに
伝えるためのHTTPヘッダーフィールドです&lt;/p&gt;
&lt;p&gt;以下サイトがわかりやすいです&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/ja/docs/Web/HTTP/Reference/Headers/X-Forwarded-For"&gt;https://developer.mozilla.org/ja/docs/Web/HTTP/Reference/Headers/X-Forwarded-For&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="パスワードリスト攻撃"&gt;パスワードリスト攻撃&lt;/h3&gt;
&lt;p&gt;何らかの手法で手に入れたIDとパスワードのリストを使って
サービスに不正ログインを試みるという、攻撃手法の一種です&lt;/p&gt;
&lt;p&gt;今回の問題では、ID固定でパスワードのリストが与えられており、
これを使って擬似的にパスワードリスト攻撃を仕掛けます&lt;/p&gt;
&lt;h2 id="解き方"&gt;解き方&lt;/h2&gt;
&lt;p&gt;パスワードリストをとりあえず試すと、2回目の試行で&lt;code&gt;Too many failed attempt. Please try again in 20 minutes.&lt;/code&gt;となってしまいブロックされます&lt;/p&gt;
&lt;p&gt;前の問題(Crack the Gate 1)のバックドアである
&lt;code&gt;X-Dev-Acess: yes&lt;/code&gt;を設定してもダメです&lt;/p&gt;
&lt;p&gt;「システムはユーザーがコントロールするHeaderを信頼するかも」
というヒントが問題文で与えられていて、どうやら&lt;code&gt;X-Forwarded-For&lt;/code&gt;の値(IPアドレス)を書き換えながら
攻撃を仕掛ければこちらのIPアドレスを偽装することができるらしいです&lt;/p&gt;
&lt;p&gt;やり方としては、burpsuiteのIntruderタブから&lt;code&gt;Pitchfork attack&lt;/code&gt;を選び、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;リクエストヘッダーの&lt;code&gt;X-Forwarded-For&lt;/code&gt;を書き換え続ける&lt;/li&gt;
&lt;li&gt;リクエストボディの&lt;code&gt;password&lt;/code&gt;フィールドでパスワードリストの全パターンを試す&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ということをすればOKです&lt;/p&gt;
&lt;p&gt;実際に攻撃を仕掛けると、以下のようなResultが得られます&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;Request&lt;/th&gt;
&lt;th style="text-align: left"&gt;Payload1&lt;/th&gt;
&lt;th style="text-align: left"&gt;Payload2&lt;/th&gt;
&lt;th style="text-align: left"&gt;Status code&lt;/th&gt;
&lt;th style="text-align: left"&gt;Response receive&lt;/th&gt;
&lt;th style="text-align: left"&gt;Error&lt;/th&gt;
&lt;th style="text-align: left"&gt;Timeout&lt;/th&gt;
&lt;th style="text-align: left"&gt;Length&lt;/th&gt;
&lt;th style="text-align: left"&gt;Comment&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;1&lt;/td&gt;
&lt;td style="text-align: left"&gt;100&lt;/td&gt;
&lt;td style="text-align: left"&gt;l9xKfsH0&lt;/td&gt;
&lt;td style="text-align: left"&gt;200&lt;/td&gt;
&lt;td style="text-align: left"&gt;250&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;252&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;2&lt;/td&gt;
&lt;td style="text-align: left"&gt;101&lt;/td&gt;
&lt;td style="text-align: left"&gt;rCRnekkE&lt;/td&gt;
&lt;td style="text-align: left"&gt;200&lt;/td&gt;
&lt;td style="text-align: left"&gt;202&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;368&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;3&lt;/td&gt;
&lt;td style="text-align: left"&gt;102&lt;/td&gt;
&lt;td style="text-align: left"&gt;wqMh5SQT&lt;/td&gt;
&lt;td style="text-align: left"&gt;200&lt;/td&gt;
&lt;td style="text-align: left"&gt;196&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;252&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;4&lt;/td&gt;
&lt;td style="text-align: left"&gt;103&lt;/td&gt;
&lt;td style="text-align: left"&gt;9JL7BM3W&lt;/td&gt;
&lt;td style="text-align: left"&gt;200&lt;/td&gt;
&lt;td style="text-align: left"&gt;194&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;252&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;5&lt;/td&gt;
&lt;td style="text-align: left"&gt;104&lt;/td&gt;
&lt;td style="text-align: left"&gt;OtrkErZU&lt;/td&gt;
&lt;td style="text-align: left"&gt;200&lt;/td&gt;
&lt;td style="text-align: left"&gt;209&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;252&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;6&lt;/td&gt;
&lt;td style="text-align: left"&gt;105&lt;/td&gt;
&lt;td style="text-align: left"&gt;xr5N5yun&lt;/td&gt;
&lt;td style="text-align: left"&gt;200&lt;/td&gt;
&lt;td style="text-align: left"&gt;203&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;252&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;7&lt;/td&gt;
&lt;td style="text-align: left"&gt;106&lt;/td&gt;
&lt;td style="text-align: left"&gt;FAfQ34Dr&lt;/td&gt;
&lt;td style="text-align: left"&gt;200&lt;/td&gt;
&lt;td style="text-align: left"&gt;261&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;252&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;8&lt;/td&gt;
&lt;td style="text-align: left"&gt;107&lt;/td&gt;
&lt;td style="text-align: left"&gt;xAzOtoGy&lt;/td&gt;
&lt;td style="text-align: left"&gt;200&lt;/td&gt;
&lt;td style="text-align: left"&gt;205&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;252&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;9&lt;/td&gt;
&lt;td style="text-align: left"&gt;108&lt;/td&gt;
&lt;td style="text-align: left"&gt;NT4Vm1FC&lt;/td&gt;
&lt;td style="text-align: left"&gt;200&lt;/td&gt;
&lt;td style="text-align: left"&gt;191&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;252&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;10&lt;/td&gt;
&lt;td style="text-align: left"&gt;109&lt;/td&gt;
&lt;td style="text-align: left"&gt;aRhrp17j&lt;/td&gt;
&lt;td style="text-align: left"&gt;200&lt;/td&gt;
&lt;td style="text-align: left"&gt;204&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;252&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;11&lt;/td&gt;
&lt;td style="text-align: left"&gt;110&lt;/td&gt;
&lt;td style="text-align: left"&gt;5vcxz5xZ&lt;/td&gt;
&lt;td style="text-align: left"&gt;200&lt;/td&gt;
&lt;td style="text-align: left"&gt;184&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;252&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;12&lt;/td&gt;
&lt;td style="text-align: left"&gt;111&lt;/td&gt;
&lt;td style="text-align: left"&gt;SooyOtMf&lt;/td&gt;
&lt;td style="text-align: left"&gt;200&lt;/td&gt;
&lt;td style="text-align: left"&gt;232&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;252&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;13&lt;/td&gt;
&lt;td style="text-align: left"&gt;112&lt;/td&gt;
&lt;td style="text-align: left"&gt;qpTlHqaG&lt;/td&gt;
&lt;td style="text-align: left"&gt;200&lt;/td&gt;
&lt;td style="text-align: left"&gt;207&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;252&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;14&lt;/td&gt;
&lt;td style="text-align: left"&gt;113&lt;/td&gt;
&lt;td style="text-align: left"&gt;0AwkENeB&lt;/td&gt;
&lt;td style="text-align: left"&gt;200&lt;/td&gt;
&lt;td style="text-align: left"&gt;160&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;252&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;15&lt;/td&gt;
&lt;td style="text-align: left"&gt;114&lt;/td&gt;
&lt;td style="text-align: left"&gt;tfkwkm3g&lt;/td&gt;
&lt;td style="text-align: left"&gt;200&lt;/td&gt;
&lt;td style="text-align: left"&gt;189&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;252&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;16&lt;/td&gt;
&lt;td style="text-align: left"&gt;115&lt;/td&gt;
&lt;td style="text-align: left"&gt;UToyxdBs&lt;/td&gt;
&lt;td style="text-align: left"&gt;200&lt;/td&gt;
&lt;td style="text-align: left"&gt;204&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;252&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;17&lt;/td&gt;
&lt;td style="text-align: left"&gt;116&lt;/td&gt;
&lt;td style="text-align: left"&gt;NWj5rDBm&lt;/td&gt;
&lt;td style="text-align: left"&gt;200&lt;/td&gt;
&lt;td style="text-align: left"&gt;204&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;252&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;18&lt;/td&gt;
&lt;td style="text-align: left"&gt;117&lt;/td&gt;
&lt;td style="text-align: left"&gt;LiVR9e3g&lt;/td&gt;
&lt;td style="text-align: left"&gt;200&lt;/td&gt;
&lt;td style="text-align: left"&gt;306&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;252&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;19&lt;/td&gt;
&lt;td style="text-align: left"&gt;118&lt;/td&gt;
&lt;td style="text-align: left"&gt;3v6avTIP&lt;/td&gt;
&lt;td style="text-align: left"&gt;200&lt;/td&gt;
&lt;td style="text-align: left"&gt;197&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;252&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;20&lt;/td&gt;
&lt;td style="text-align: left"&gt;119&lt;/td&gt;
&lt;td style="text-align: left"&gt;jcEoe8hx&lt;/td&gt;
&lt;td style="text-align: left"&gt;200&lt;/td&gt;
&lt;td style="text-align: left"&gt;204&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;false&lt;/td&gt;
&lt;td style="text-align: left"&gt;252&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;上記は攻撃1回ごとに対応するレスポンスの統計値を表しているのですが、
&lt;code&gt;Length&lt;/code&gt;(つまりレスポンスの長さ)に注目すると一つだけ長さが&lt;code&gt;368&lt;/code&gt;のものが見つかります&lt;/p&gt;</description></item><item><title>PicoGym Crack the Gate 1</title><link>https://swkima-dev.github.io/ctf-writeups/posts/picogym-crack-the-gate-1/</link><pubDate>Thu, 20 Nov 2025 14:36:25 +0900</pubDate><guid>https://swkima-dev.github.io/ctf-writeups/posts/picogym-crack-the-gate-1/</guid><description>&lt;h2 id="問題リンク"&gt;問題リンク&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://play.picoctf.org/practice/challenge/520"&gt;https://play.picoctf.org/practice/challenge/520&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="概要"&gt;概要&lt;/h2&gt;
&lt;p&gt;ログインフォームが与えられ、「emailは特定したので
侵入してね」というもの&lt;/p&gt;
&lt;h2 id="予備知識"&gt;予備知識&lt;/h2&gt;
&lt;h3 id="httpリクエスト"&gt;HTTPリクエスト&lt;/h3&gt;
&lt;p&gt;webページでなにかを送受信したりするときは大抵HTTP(HTTPS)
メッセージでやり取りをする。&lt;/p&gt;
&lt;p&gt;HTTPメッセージの中でリクエストメッセージのフォーマットは
次の通りになっている&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;POST /login HTTP/1.1 ←リクエストライン
hoge: aaa ←メッセージヘッダーが空行まで続く
fuga: bbb
{&amp;#34;hogehoge&amp;#34;: &amp;#34;&amp;#34; ←ここからメッセージボディ
...
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;リクエストラインは宛先、メッセージヘッダーはメタ情報、
メッセージボディは送りたいもの本体みたいなイメージ&lt;/p&gt;
&lt;h3 id="burpsuite"&gt;burpsuite&lt;/h3&gt;
&lt;p&gt;ブラウザからHTTPリクエストを送る時に、「送る前に一旦
内部で止めて書き換えてから送る」を可能にするソフト&lt;/p&gt;
&lt;h2 id="解き方"&gt;解き方&lt;/h2&gt;
&lt;p&gt;「開発者が秘密裏に取り残した」とか書いてあるので、
ブラウザのDeveloperツールでコードを見てみると&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;!-- ABGR: Wnpx - grzcbenel olcnff: hfr urnqre &amp;#34;K-Qri-Npprff: lrf&amp;#34; --&amp;gt;
&amp;lt;!-- Remove before pushing to production! --&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;というコメント文があることに気づく&lt;/p&gt;
&lt;p&gt;base64ではなさそうなのでROT13を試すと&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;NOTE: Jack - temporary bypass: use header &amp;#34;X-Dev-Access: yes
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;という文字列に復号できた&lt;/p&gt;
&lt;p&gt;ここでheaderに&amp;quot;X-Dev-Access: yes&amp;quot;を追加すればいいとわかるので、&lt;/p&gt;
&lt;p&gt;burpsuiteを起動→burpsuiteのproxyタブからburpsuiteブラウザ起動→
競技サイトを開く&lt;/p&gt;
&lt;p&gt;をして、interceptをオンにする&lt;/p&gt;
&lt;p&gt;その後、テキトーにログインフォームを入れてsubmitすると
burpsuite上でリクエストメッセージが編集できる&lt;/p&gt;
&lt;p&gt;以下のように&lt;code&gt;X-Dev-Access: yes&lt;/code&gt;をメッセージヘッダーに追記して
forwardするとフラグが得られる&lt;/p&gt;</description></item><item><title>PicoGym Hidden in Plainsight</title><link>https://swkima-dev.github.io/ctf-writeups/posts/picogym-hidden-in-plainsight/</link><pubDate>Mon, 17 Nov 2025 16:23:57 +0900</pubDate><guid>https://swkima-dev.github.io/ctf-writeups/posts/picogym-hidden-in-plainsight/</guid><description>&lt;h2 id="問題リンク"&gt;問題リンク&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://play.picoctf.org/practice/challenge/524"&gt;https://play.picoctf.org/practice/challenge/524&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="概要"&gt;概要&lt;/h2&gt;
&lt;p&gt;画像ファイルからフラグを探してねというもの&lt;/p&gt;
&lt;h2 id="予備知識"&gt;予備知識&lt;/h2&gt;
&lt;h3 id="ステガノグラフィ"&gt;ステガノグラフィ&lt;/h3&gt;
&lt;p&gt;CTFにはステガノグラフィという分野があり、今回の問題はこれ&lt;/p&gt;
&lt;p&gt;以下のサイトが役に立つはず&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://speakerdeck.com/kuroiwasi/cpawctf-steganography?slide=63"&gt;https://speakerdeck.com/kuroiwasi/cpawctf-steganography?slide=63&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.hamayanhamayan.com/entry/2022/12/14/234257"&gt;https://blog.hamayanhamayan.com/entry/2022/12/14/234257&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="解き方"&gt;解き方&lt;/h2&gt;
&lt;p&gt;ダウンロードしたimgファイルを普通に画像ファイルとして見ても何もわからないので、
fileコマンドを試す&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;❯ file img.jpg
img.jpg: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, comment: &amp;#34;c3RlZ2hpZGU6Y0VGNmVuZHZjbVE9&amp;#34;, baseline, precision 8, 640x640, components 3
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;commentが明らかに怪しいので、base64でデコードすると&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;❯ echo &amp;#34;c3RlZ2hpZGU6Y0VGNmVuZHZjbVE9&amp;#34; | base64 -d
steghide:cEF6endvcmQ=
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;steghideという文字列と、その後ろにさらに謎の文字列が出てきた&lt;/p&gt;
&lt;p&gt;ちなみに、steghideで検索するとステガノグラフィで有名なツールの名前らしい&lt;/p&gt;
&lt;p&gt;→「steghideでフラグが埋め込まれたjpgファイルなのでは？」と推測&lt;/p&gt;
&lt;p&gt;&amp;ldquo;steghide:&amp;ldquo;の後ろの文字列をbase64でさらにデコードすると&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;❯ echo &amp;#34;cEF6endvcmQ=&amp;#34; | base64 -d
pAzzword
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;なんかパスワードっぽいことがわかったので、後はsteghideをインストールして
extractモードでフラグを探してみる&lt;/p&gt;
&lt;p&gt;(steghideのインストールは省略)&lt;/p&gt;
&lt;p&gt;使い方は簡単で、&amp;ldquo;Enter passphrase:&amp;ldquo;の後にさっきの&amp;quot;pAzzword&amp;quot;を入れるだけ&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;❯ steghide extract -sf img.jpg
Enter passphrase:
wrote extracted data to &amp;#34;flag.txt&amp;#34;.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;flag.txtの中身がpicoCTF{h1dd3n_1n_1m4g3_67479645}となっているので、多分これがフラグ&lt;/p&gt;</description></item><item><title>PicoGym Log Hunt</title><link>https://swkima-dev.github.io/ctf-writeups/posts/picogym-log-hunt/</link><pubDate>Mon, 17 Nov 2025 12:37:10 +0900</pubDate><guid>https://swkima-dev.github.io/ctf-writeups/posts/picogym-log-hunt/</guid><description>&lt;h2 id="問題ページ"&gt;問題ページ&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://play.picoctf.org/practice/challenge/527"&gt;https://play.picoctf.org/practice/challenge/527&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="概要"&gt;概要&lt;/h2&gt;
&lt;p&gt;サーバーのログファイルを見て、バラバラのフラグをまとめろというもの&lt;/p&gt;
&lt;h2 id="解き方"&gt;解き方&lt;/h2&gt;
&lt;p&gt;生ファイルを見ると、&amp;ldquo;INFO FLAGPART&amp;quot;という文字列が入ったログがフラグだと思われる&lt;/p&gt;
&lt;p&gt;一旦grepで該当行を見る&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;❯ grep &amp;#34;INFO FLAGPART&amp;#34; server.log
[1990-08-09 10:00:10] INFO FLAGPART: picoCTF{us3_
[1990-08-09 10:02:55] INFO FLAGPART: y0urlinux_
[1990-08-09 10:05:54] INFO FLAGPART: sk1lls_
[1990-08-09 10:05:55] INFO FLAGPART: sk1lls_
[1990-08-09 10:10:54] INFO FLAGPART: cedfa5fb}
[1990-08-09 10:10:58] INFO FLAGPART: cedfa5fb}
[1990-08-09 10:11:06] INFO FLAGPART: cedfa5fb}
[1990-08-09 11:04:27] INFO FLAGPART: picoCTF{us3_
[1990-08-09 11:04:29] INFO FLAGPART: picoCTF{us3_
[1990-08-09 11:04:37] INFO FLAGPART: picoCTF{us3_
[1990-08-09 11:09:16] INFO FLAGPART: y0urlinux_
[1990-08-09 11:09:19] INFO FLAGPART: y0urlinux_
[1990-08-09 11:12:40] INFO FLAGPART: sk1lls_
[1990-08-09 11:12:45] INFO FLAGPART: sk1lls_
[1990-08-09 11:16:58] INFO FLAGPART: cedfa5fb}
[1990-08-09 11:16:59] INFO FLAGPART: cedfa5fb}
[1990-08-09 11:17:00] INFO FLAGPART: cedfa5fb}
[1990-08-09 12:19:23] INFO FLAGPART: picoCTF{us3_
[1990-08-09 12:19:29] INFO FLAGPART: picoCTF{us3_
[1990-08-09 12:19:32] INFO FLAGPART: picoCTF{us3_
[1990-08-09 12:23:43] INFO FLAGPART: y0urlinux_
[1990-08-09 12:23:45] INFO FLAGPART: y0urlinux_
[1990-08-09 12:23:53] INFO FLAGPART: y0urlinux_
[1990-08-09 12:25:32] INFO FLAGPART: sk1lls_
[1990-08-09 12:28:45] INFO FLAGPART: cedfa5fb}
[1990-08-09 12:28:49] INFO FLAGPART: cedfa5fb}
[1990-08-09 12:28:52] INFO FLAGPART: cedfa5fb}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;重複があったりすることがわかったので、
フラグと関係ない前半37文字を削除し、sort とuniqで重複削除&lt;/p&gt;</description></item><item><title>PicoGym Riddle Registry</title><link>https://swkima-dev.github.io/ctf-writeups/posts/picogym-riddle-registry/</link><pubDate>Mon, 17 Nov 2025 10:42:40 +0900</pubDate><guid>https://swkima-dev.github.io/ctf-writeups/posts/picogym-riddle-registry/</guid><description>&lt;h2 id="問題ページ"&gt;問題ページ&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://play.picoctf.org/practice/challenge/530"&gt;https://play.picoctf.org/practice/challenge/530&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="概要"&gt;概要&lt;/h2&gt;
&lt;p&gt;捜査官としてPDFからフラグを見つけろというもの&lt;/p&gt;
&lt;h2 id="解き方"&gt;解き方&lt;/h2&gt;
&lt;p&gt;PDFを開いて見える黒塗の部分はダミーなので無視
pdfをエディタで開いて、authorの部分をBase64でデコードするだけ&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;❯ echo &amp;#34;cGljb0NURntwdXp6bDNkX20zdGFkYXRhX2YwdW5kIV80MjQ0MGM3ZH0\075&amp;#34; | base64 -d
picoCTF{puzzl3d_m3tadata_f0und!_42440c7d}
&lt;/code&gt;&lt;/pre&gt;</description></item></channel></rss>