SECCON Beginners CTF 2025 Write-Up
毎年、参加しているのに、書いてなかったみたい。
今年は、書けるだけ書いておきます。
何故なら今回、前に見たことがあると思っていた問題。
どうやって解いたか、見てみようと思ったのに、何も残っていなくて…。
思い出すのに時間がかかったり、結局、思い出せなかったり…。
それを防ぐため、残しておける部分は、残して置くことにしました。
seesaw
RSA初心者です! pとqはこれでいいよね...?
落ちてきたファイル
- Chall.py
- output.txt
import os
from Crypto.Util.number import getPrime
FLAG = os.getenv("FLAG", "ctf4b{dummy_flag}").encode()
m = int.from_bytes(FLAG, 'big')
p = getPrime(512)
q = getPrime(16)
n = p * q
e = 65537
c = pow(m, e, n)
print(f"{n = }")
print(f"{c = }")
n = 362433315617467211669633373003829486226172411166482563442958886158019905839570405964630640284863309204026062750823707471292828663974783556794504696138513859209
c = 104442881094680864129296583260490252400922571545171796349604339308085282733910615781378379107333719109188819881987696111496081779901973854697078360545565962079
from Crypto.Util.number import inverse
from Crypto.Util.number import long_to_bytes
import sympy
n = 362433315617467211669633373003829486226172411166482563442958886158019905839570405964630640284863309204026062750823707471292828663974783556794504696138513859209
c = 104442881094680864129296583260490252400922571545171796349604339308085282733910615781378379107333719109188819881987696111496081779901973854697078360545565962079
e = 65537
# n を素因数分解して p と q を求める
factors = sympy.factorint(n)
# 素因数分解の結果から素因数リストを取得
# 最初の素因数2つをpとqに代入
p, q = factors.keys()
# オイラーのトーシェント関数でφ(n) を求める
phi_n = (p - 1) * (q - 1)
# 秘密鍵 d の計算
d = inverse(e, phi_n)
# 復号
decrypted_message = pow(c, d, n)
# バイナリデータに変換
conversion = long_to_bytes(decrypted_message)
print(conversion)
実行すると
b'ctf4b{unb4l4nc3d_pr1m35_4r3_b4d}'
と出てきた。
SECCON Beginners CTF 2019 Write-Up
今年も「Beginners CTF 2019」に参加。
とは言え、最近全く何もしていなかったので、ぶっつく本番での参加となりました。
解けたのは、去年より少なく3問。
解けたというより、見ただけ。
去年より難しく感じたけど、ただ実力が足りないだけかもしれない。
- Reversing [warmup] Seccompare
- Misc [warmup] Welcome
- Misc containers
- Misc Dump
- Crypto [warmup]So Tired
- Web [warmup] Ramen
- Web katsudon
Reversing [warmup] Seccompare
問題で渡されたファイルをIDAで開いただけ。

答え:ctf4b{5tr1ngs_not_eno0ugh}
Misc [warmup] Welcome
IRCにアクセスしただけ。
チャンネルに答えが出てる。
答え:ctf4b {welcome_to_seccon_beginners_ctf}
Misc containers
問題で渡されたファイルをStirlingで開けると
「IHDR」の文字あるので、pngファイルと断定。
バイナリ「89 50 4E 47」で始まる部分を順番にpngファイルとし保存。全部の画像を並べただけ。取りこぼしている「4」を補完して終了。

答え:ctf4b{e52df60c058746a66e4acaf34db6fc81}
Misc Dump
Wireshackにて、Pcapファイルだと解ったけど、どう展開したら良いのか解らなかった。
Crypto [warmup]So Tired
BASE64だとわかり、デコードしてみたけど、解読できなかった。
もう1つ何かしないといけないんだろうけど、解らなかった。
Web [warmup] Ramen
SQLインジェクションで、UNION SELECTを使って、テーブルの情報を引っ張り出すんだと思うんだけど、やり方が解らなかった。
Web katsudon
これもBASE64までは、解ったけど、時間切れ。
後は数個の問題を開いたけど、具体的に何をしたら良いのか。
全然、手も足も出ない状態だったけど、楽しかったので、
またチャンスがあればやってみようと思います。
SECCON Beginners CTF 2018に参加しました
やるやる詐欺で、全然勉強できないのですが、CTFに参加しました。 以前に一度参加したことがあるのですが、それより1つでも解ければ良いなぁと思い参加しました。
初心者向けということでしたが、手も足も出ない。
興味のあるところだけ、適当に勉強してる程度では、難しいです。 やはりちゃんと勉強してみたいものです。
以下が解くことができた問題です。
今度、参加するときのヒントにでもなれば良いと思います。
Crypto
1.[warmup]Veni,vidi,vici
ファイルが3つありました。 バイナリエディタで開いてみました。
- Gur svefg cneg bs gur synt vf: pgs4o{a0zber
- Lzw kwugfv hsjl gx lzw xdsy ak: _uDskk!usd_u
- {ʎ ɥ dɐ ɹ ɓ 0ʇ dʎ ᴚ :sı ɓ ɐ lɟ ǝ ɥ ʇ ɟ o ʇɹ ɐ d pɹ ı ɥ ʇ ǝ ɥ ⊥
1つ目の「Gur」に見覚えがあったので、「ROT13」ではないかと推測しました。 問題文に戻って、「Veni,vidi,vici」をググってみるとカエサルの文字が散見できたので、間違いないと踏み、「ROT13」で解読。
1つ目の解
The first part of the flag is: ctf4b{n0more
2つ目は1つ目の解をヒントに、恐らく「The Second part of」になるだろうと推測。同じようにシーザー暗号ならと仮定し、「Lzw」を「The」にすればいいんだから…。「ROT8」と判明。
2つ目の解
The second part of the flag is: _cLass!cal_c
3つ目はそのまま {ʎ ɥ dɐ ɹ ɓ 0ʇ dʎ ᴚ :sı ɓ ɐ lɟ ǝ ɥ ʇ ɟ o ʇɹ ɐ d pɹ ı ɥ ʇ ǝ ɥ ⊥ を 180度回転させればOK
the third part of the flag: Rypt0 graphy}
全部組み合わせて、答えは
ctf4b{n0more_cLass!cal_cRypt0 graphy}
2.RSA is Power
素因数分解すれば良いんだろうってことしか、わからんかった。 どうやってやるんやろ?
Misc
1.[warmup] plain mail
pcapファイルだったので、Wiresharkで開き、emlファイルで保存。zipファイルがあったので、 それを回答して出てきたテキストファイルを開く。パスワードを聞かれたので、メールファイル内にあったパスワード「_you_are_pro_」を入力。無事開いて、flagゲット。
ctf4b{email_with_encrypted_file}
2.[Warmup] Welcome
公式IRCチャンネルに行けば、ゲットできた。
ctf4b{welcome_to_seccon_beginners_ctf}
てけいさんえくすとりーむず
$ nc tekeisan-ekusutoriim.chall.beginners.seccon.jp 8690
とあったので、Linux上で、ncコマンドで接続。 計算問題を100問解けば、flagゲット。
ctf4b{ekusutori-mu>tekeisann>bigina-zu>2018}
まとめ
私が解けたのは、この4問だけでした。 途中、個人的なハプニングにあって、 大幅に中断しましたが、とても楽しかったです。前回より1問多く解けたのが、せめてもの救いかな。
SECCON2016 Writeup
初めてCTFに参加しました。
と言うのも、興味はあるもののどう勉強したら良いのか解らなかったので、先に競技を覗いてみようと思い参加しました。
初めてなので、勝手が解らず戸惑いました。
登録情報と手元の情報が一致せず、サイトに入れずアカウントを作り直したり…。
「コレは何を答えるの?」と思ったり…。
Vigenere Crypto 100
k: ????????????
p: SECCON{???????????????????????????????????}
c: LMIG}RPEDOEEWKJIQIWKJWMNDTSR}TFVUFWYOCBAJBQ
k=key, p=plain, c=cipher, md5(p)=f528a6ab914c1ecf856a1d93103948fe
|ABCDEFGHIJKLMNOPQRSTUVWXYZ{}
-+----------------------------
A|ABCDEFGHIJKLMNOPQRSTUVWXYZ{}
B|BCDEFGHIJKLMNOPQRSTUVWXYZ{}A
C|CDEFGHIJKLMNOPQRSTUVWXYZ{}AB
D|DEFGHIJKLMNOPQRSTUVWXYZ{}ABC
E|EFGHIJKLMNOPQRSTUVWXYZ{}ABCD
F|FGHIJKLMNOPQRSTUVWXYZ{}ABCDE
G|GHIJKLMNOPQRSTUVWXYZ{}ABCDEF
H|HIJKLMNOPQRSTUVWXYZ{}ABCDEFG
I|IJKLMNOPQRSTUVWXYZ{}ABCDEFGH
J|JKLMNOPQRSTUVWXYZ{}ABCDEFGHI
K|KLMNOPQRSTUVWXYZ{}ABCDEFGHIJ
L|LMNOPQRSTUVWXYZ{}ABCDEFGHIJK
M|MNOPQRSTUVWXYZ{}ABCDEFGHIJKL
N|NOPQRSTUVWXYZ{}ABCDEFGHIJKLM
O|OPQRSTUVWXYZ{}ABCDEFGHIJKLMN
P|PQRSTUVWXYZ{}ABCDEFGHIJKLMNO
Q|QRSTUVWXYZ{}ABCDEFGHIJKLMNOP
R|RSTUVWXYZ{}ABCDEFGHIJKLMNOPQ
S|STUVWXYZ{}ABCDEFGHIJKLMNOPQR
T|TUVWXYZ{}ABCDEFGHIJKLMNOPQRS
U|UVWXYZ{}ABCDEFGHIJKLMNOPQRST
V|VWXYZ{}ABCDEFGHIJKLMNOPQRSTU
W|WXYZ{}ABCDEFGHIJKLMNOPQRSTUV
X|XYZ{}ABCDEFGHIJKLMNOPQRSTUVW
Y|YZ{}ABCDEFGHIJKLMNOPQRSTUVWX
Z|Z{}ABCDEFGHIJKLMNOPQRSTUVWXY
{|{}ABCDEFGHIJKLMNOPQRSTUVWXYZ
}|}ABCDEFGHIJKLMNOPQRSTUVWXYZ{
Vigenere cipher
https://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher
問題をクリックすると上記が表示されるだけだったので、一瞬「で?」と思いました。
「md5(p)=f528a6ab914c1ecf856a1d93103948fe」とあります。
平文の部分がmd5でエンコードされているので、コレをデコードしました。
デコードはWEBサイトでしました。
デコードした答えから、キーを読み解き、
キーが「VIGENERECODE」だと判明。
見直し検証し、デコードした答えをキーでエンコードすると
ちゃんと暗号文になりました。
答え方が解らず、判明したキーの「VIGENERECODE」を入力するも弾かれ
サイトを見るとSECCON{…}で答えてねと書いてあったので、
SECCON{VIGENERECODE}と入力し、弾かれ…。
暫く途方に暮れた後…。
もしかして、デコードで判明した平文を答えれば良いのか?
SECCON{…}ってなってるし…。
と入力。
正解。
やっと一問回答できた!
のは、デコードしてから十数時間後でした。
答えは、
SECCON{ABABABCDEDEFGHIJJKLMNOPQRSTTUVWXYYZ}
basiq Web 100
basiq What is admin's password?☺ http://basiq.pwn.seccon.jp
すっごい時間かけたけど、BASIC認証をどうしたら良いのか分からなかった。
VoIP Forensics 100
VoIP Extract a voice. The flag format is SECCON{[A-Z0-9]}. voip.pcap
これは、pcapファイルなので、Wiresharkに放り込めば良いんだ。
と、USB起動のKali Linuxでは、サウンドドライバーが上手く動いて無い様で…。
音声ファイルを見つけることができたのに、むなしく無音で素通り…。
ごちゃごちゃLinuxの設定をしてるよりは…。と
急遽、WindowsにWiresharkをインストールして、無事再生出来ました。
事前準備の大切さを知りました。
ただ、音声が早くて…。聞き取るのに数回掛かったのと、フォーマットが大文字だと気づかずに数回弾かれました。
答えは、
SECCON{9001IVR}
Anti-Debugging Binary 100
Anti-Debugging Reverse it. bin may some AV will alert,but no problem.
binファイルだから、バイナリーだと思って、「Stirling」で開いてみたんだけど…。
違うみたい…。
答えを見つけられなかった。
その他、"Memory Analysis Forensics 100" や "biscuiti Web, Crypto 300"に挑戦したけど、答えを導き出せなかった。
初めてで、右往左往しながら、ソフトの使い方すらままならない状態での参戦でしたが、非常に楽しかったです。
Exploitについては、開く事すら至りませんでしたが、大体の感じは分かったので、コレを機に勉強していきたいと思います。
ファイルの改ざんチェック Subresource Integrity
Subresource Integrity(SRI)とは
- CDNから呼び込んだファイルが改ざんがされてないか、ブラウザ側で検証するためのセキュリティ機能のこと。
- そのCDNファイルのハッシュ値が一致するかを見てる。
※CDNとは、有名なのはGoogleさんが提供してるjQueryとかかな。
実装方法
- <script>,<link>要素のinitegrity属性値に指定する。
- ハッシュアルゴリズムは、(sha256,sha384,sha512)に対応。
- base64でエンコードされたモノを上記のどれかでハッシュ化。
base64でエンコードされた文字列をsha512でハッシュ化してみた
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js" integrity="sha512-U6K1YLIFUWcvuw5ucmMtT9HH4t0uz3M366qrF5y4vnyH6dgDzndlcGvH/Lz5k8NFh80SN95aJ5rqGZEdaQZ7ZQ==" crossorigin="anonymous"></script>
<crossorigin=”anonymous”って属性がセットされてる。
この設定があると、cookie,クライアントサイドのSSL証明書、HTTP認証などのユーザー認証情報が、使えない。
因みに、crossorigin="use-credentials"と指定すると、認証情報が使える。
ハッシュ値の生成は、Opensslコマンドを使って作れるけど、
ハードルが高い人には、オンラインサービスもある。
ただ、Subresource Integrity(SRI)が実装されているブラウザは、2016/10/03現在では、Firefox、Chrome、Opera、Android Browser52、Chrome for Android51となっており、EdgeやSafariでは使えない。
WindowsでSassを使う
前回インストールして、放置していたモノがSSLの証明書期限切れでエラーが出て、アップデート出来なったので、入れなおすことにしました。
その際、すっかり忘れていて、色々調べるハメになったので、今回は書き留めておこうと思います。
1.とりあえずRubyインストール
Sassを使うには、Ruby環境が必要なので、何はともあれ、Rubyのインストール。
リンク:Downloads
2016年7月現在、以下のとおりなので、最新版2.3.0を選択してダウンロード。

では、インストールしていきます。

言語を「日本語」にして、「OK」をクリック。

「同意する(A)」のラジオボタンを選択し、「次へ(N)」

「.rbと.rbwファイルをRubyに関連づける」の2つにチェックを入れ、
「インストール(I)」
※「Rubyの実行ファイルへ環境変数PATHを設定する」にチェックし忘れると、手動でPATHを通さなければ、いけなくなりますので、ご注意を。
※.rbと.rbwファイルをRubyに関連づける」にチェックを忘れても対して問題はなさそうだけど、.rb(コンソールで動くRubyスクリプト)と.rbw(Winで動く、GUI、Rubyスクリプト)をRubyと関連付けてくれるので、ファイルをダブルクリックするだけで、Rubyスクリプトが実行できるようになり便利。

お疲れ様でした。
コマンドプロンプトで、確認してみましょう。
ショートカットキー:Win+「R」+「cmd」と入力し、「ENTER」クリック
まずは、Rubyのバージョンチェック。
「 ruby -v」と入力。
と表示されれば、OKです。
2.Sassをやっとインストール
Rubyをインストールしたので、gemが使えるようになりました。
ここからの作業は、コマンドプロンプトでgemコマンドを使って行ないます。
ちゃんとgemが動くか確認するために、バージョン確認をしておきます。
「gem -v」と入力
C:\Users\hogehoge\gem -v
2.5.1
と表示されれば、OKです。
ちなみにバージョンが古い場合は、
「gem update --system」でアップデートできます。
次に、文字化けを防ぐために、文字コードの設定をします。
「set LANG=ja_JP.UTF-8」と入力。
特に何にも起こらないです。
それでは、Sassをインストールしましょう。
「gem install sass」と入力
Fetching:Sass-3.4.22.gem(100%)
Successfully insatalled sass-3.4.22
.........
1 gem installed
と表示されれば、OKです。
バージョンの確認をします。
「sass -v」と入力
Sass 3.4.22 (Selective Steve)
と表示されれば、OKです。
こちらも因みに、バージョンが古い場合は
「gem update sass」でアップデートできます。
コレで、やっとSassを使える環境が整いました。
それでは、sassコマンドを使って、cssファイルのコンパイルに挑戦してみてください。
それについては、また次回に書くとします。
canonical属性タグ
たまたま見つけたタグが知らないものだったので、調べてみました。
1.canonical属性タグとは
link要素の属性の一つ。
- URLの正規化に関係するもの
- URLの正規化をしてないとSEO的に不利
- 設定を間違えると検索結果から削除されるので要注意
- リンクの評価に関係するもの
そもそも重複するものがないなら、設定する必要はない。
2.canonical属性を設定したら
優先的にするURLは被リンク数をみて決めた方がSEO的にいいかも。
3.記述法
<head>
<link rel="canonical" href="検索結果に優先的に表示させたいURL">
</head>
4.設定しといた方がいい場合
- wwwの有無、index.htmlの有無、httpとhttpsでどの場合でも同じページが表示される(重複してる)場合。
Googleは、それぞれを別のURLと見做すので、それぞれについてるリンクが拡散しちゃう。 -
ユーザー セッションや検索の仕方で、同商品ページに複数の動的 URL が生成される場合
- ECサイトなどで、色違いやサイズ違いだけのページ。
色やサイズが違うだけで、他の内容が同じ場合、重複コンテンツと見做される。どれか1つを優先し、その他を「canonical」で重複宣言させよう。 - モバイルサイトが別URLの場合。
PCサイト:www.hogehoge.com
モバイルサイト:m.hogehoge.com
pcサイトに
<link rel="alternate" media="only screen and (max-width: 640px)" href="http://www.hogehoge.com">
モバイルサイトに
<link rel="canonical" href="http://hogehoge.com">
参照:別々の URL - ABテストを行っている場合
2つのほぼ重複したページになるので、どっちかにcanonical 指定 - AMP実装
AMP実装するとAMP用のHTMLが必要になる。AMPページと非AMPページの内容が重複するので、どっちかにcanonical 指定
非AMP
<link rel="amphtml" href="https://hogehoge/url/to/amp-version.html">
AMP
<link rel="canonical" href="https://hogehoge/url/to/regular-html-version.html">
参照:AMP ページの Google 検索ガイドライン
5.推奨事項
Googleの見解
- 重複ページの本文がcanonicalページにもある。
- canonicalのリンク先が確かに存在すること(404等でないこと)
- canonicalのリンク先「noindex」のメタタグが付いてないこと
- canonical指定はhead要素の中で。
- canonical指定は1ページ1つだけ。
6.canonical設定の間違い
- ページネーションの1ページ目をcanonicalのリンク先にする。(←そもそも2ページ目移行が重複ページじゃないから)
- 絶対アドレスのつもりで書いた相対アドレスの記述。
link要素内では、どちらの書き方も使えるが「http://」や「https://」といったスキームなしに書かれた場合、相対アドレスと判断される。ドメインから指定するときは気を付けて。 - canonicalの意図しない指定
テンプレートで作成した時、元々指定されていたcanonicalが設定される - カテゴリページ、ランディングページで、特集記事へのcanonical
カテゴリにcanonicalを設定するとカテゴリがインデックスされなくなる。 - body要素に記述
- canonicalは絶対ではない
どう処理するかは、検索エンジン次第 - 違うドメインでも有効なのか
→異なるドメインでもcanonicalは有効