前言#
盼望着,盼望着,一年一度の网安原神 hackergame 搜索技術小考がついにやってきました。今年の入門問題は昨年より少し少なく、1k7 しか取得できませんでした。非コンピュータ専攻のユーザーとして、私はまだまだ未熟だと感じています。
次に、各問題に取り組んだ心の旅路についてお話しします。書く順番は私が解いた順番です。おそらく含まれる要素には:AI は私の大親、つぶやき、無駄なネタ、自己満足などの混沌とした要素が含まれます(
サインイン#
開門するには~~悠揚的小曲を聞きながら~~60 秒以内に各国の文字を入力する必要がありますが、貼り付けはできません(イライラ
ダメだ、私はあまりにも未熟で何もできない、やはり「待ちきれない、すぐにスタート!」にしましょう。アドレスバーに ?pass=false
が追加されているのはなぜ? true
に変更してみる?
こうして、サインイン問題のフラグを取得しました:flag{We1C0ME-To-haCkerg@me-@Nd-EnJoY-hACk!n9-ZoZ4}
《hackergame 伝説》の歌詞を添付します:(公式 Writeup より転送)この歌は非常に良いので、この記事を見ている皆さんと一緒にループして聴くべきです。
猫の質問(Hackergame 10 周年記念版)#
おなじみの猫の質問、おなじみの検索技術小考、おなじみの答えが見つからずに叫ぶ(
- Hackergame 2015 の大会前夜に行われたプレ講座はどの教室で開催されましたか?(30 点) ヒント:教室番号を記入してください。例:5207、3A101。
この問題は複数のサイトを検索し、最終的にHackergame の LUG@USTC の紹介ページを通じて、科大の第 2 回情報セキュリティコンテスト(その時はまだ hackergame とは呼ばれていませんでした)の内容アーカイブを見つけました。大会の時間安排には 10月17日土曜日19:30 3A204 ネットワーク攻防技術講座
とあります。したがって、答えは 3A204
です。こうして水問題を難問にしてしまいました。
- ご存知の通り、Hackergame には約 25 の問題があります。過去 5 年間(今年を除く)に開催された Hackergame の中で、この数字に最も近い問題数の大会には何人が登録参加しましたか?(30 点) ヒント:非負整数です。
第一問で言及された Hackergame の紹介ページを見て、毎年の大会のリポジトリ(数年前はustclug
の組織の下で)を一つ一つ数えていくと、最も近いのは 19 年(28 問)で、hackergame 2019
をググってみました。見つけたのはこれ。したがって、答えは 2682
です。
- Hackergame 2018 でどの人気検索ワードが科大図書館のその月のホット検索 1 位になりましたか?(20 点) ヒント:漢字のみで構成されています。
ご存知の通り、猫の質問だけが図書館に関連することを尋ねます(他に何かあったら言ってないことにします
これに基づいて、2018 年の猫の質問の Writeupを直接見つけ、図書館の問題のキーワード プログラマーの自己修養
を見つけました。これが本問題の答えです。この解法はある意味で偶然の産物で、予期された解ではないでしょう?
- 今年の USENIX Security 学術会議で中国科学技術大学が発表した電子メール偽造攻撃に関する論文では、著者が 6 つの攻撃方法を提案し、いくつの電子メールサービスプロバイダーおよびクライアントの組み合わせで実験を行いましたか?(10 点) ヒント:非負整数です。
USENIX Security USTC
、USENIX Security email
、USENIX 中科大
などのキーワードで検索しても見つからず、血圧が上がりました。後にUSENIX Security 2024 ustc
でニュースを見つけました。問題の論文のタイトルは FakeBehalf: Imperceptible Email Spoofing Attacks against the Delegation Mechanism in Email Systems です。ググって論文紹介ページと論文リンクを得ました。
しかし、この時点で 2 つ目の血圧ポイントが来ました。論文紹介には 16 と 20 が書かれていて、どちらも問題の答えではないので、論文を読み込む必要がありました。何度も読み返した後、6 Imperceptible Email Spoofing Attack
の下にこんな一文(ハイライト)を見つけました:
その中で resulting in 336 combinations
(336 の組み合わせ)と書かれているので、答えは 336
です。このプロセスをこんなに簡単に言っていますが、実際には非常に苦痛で、私が倒数第二の問題として解いたものでした。
- 10 月 18 日、Greg Kroah-Hartman が Linux メールリストに提出したパッチは、多くの開発者を MAINTAINERS ファイルから削除しました。このパッチが Linux メインラインにマージされたコミット ID は何ですか?(5 点) ヒント:ID の最初の 6 桁、アルファベットは小文字、例:c1e939。
ついにおなじみの最新のホットな問題に到達しました。この事件は私がフォローしている各 Telegram チャンネルでAOSC が書いたニュースが転送されていました。記事にはこのひどいパッチをマージした GitHub のリンクが直接記載されていました。したがって、答えは 6e90b6
です。
- 大規模言語モデルは入力をトークンに分解して計算を続けます。このウェブページの HTML ソースコードは Meta の Llama 3 70B モデルのトークナイザーによっていくつのトークンに分解されますか?(5 点) ヒント:このページを初めて開いたときの HTML ソースコード、答えは非負整数です。
この問題は一度は爆破しようと思いましたが、後に Tiktokenizer を見つけてからはやる気を失いました。
ブラウザをプライベートモードで開き(すべてのプラグインを無効にして、プラグインがウェブページのソースコードを変更する可能性を排除)、トークンを使って問題のウェブサイトにアクセスしました。F12 でウェブサイトのコードをコピーしました(右クリックはトークンが必要なため正しいソースコードでは使用できません)。その時、他の問題を解いている間にある大規模モデルのページを見つけて Tiktokenizer を見ました。さて、ウェブサイトのコードを Tiktokenizer にコピーして 1829 を得て、いくつかの数を試して1833
が正しい答えであることを確認しました。
これで、本問題の 2 つのフラグを取得しました:flag{4_GooD_©α7_iS_THE_c4t_ωHØ_c4n_P@ss_TH3_QuiZ}
、flag{7eN_¥eαRs_of_hα©KergΛm3_ØmEd3tOบ_WI7h_ИEkO_QU12}
。
旅行写真 4.0#
昨年の 3.0 は成功しなかった、私はこれについて深く反省しました。主な問題は注意力の散漫でした。今年は、集中力を必要とする PuzzleHunt を経て、今の私は無敵です!
そして、この屑は今年の GeekGame の画像検索問題で注意力散漫で解けなかった
LEO_CHAN? (問題 1-2)#
問題 1: 写真が撮影された場所は中科大のどの校門に近いですか?(形式:X 校区 Y 門、いずれも 1 文字)
直接画像を検索して同じ画像を見つけ、画像の説明が中国蜀山科里科気科創驿站 — 科大站であることを知りました。その後、上記の場所を検索してニュースを見つけました。そこには中国蜀山科里科気科創驿站——科大站は金寨路と槽郢路の交差点に位置し、中国科学技術大学東校区西門に正対しています......
と書かれています。したがって、問題 1 の答えは 東校区西門
です。
問題 2: ところで、Leo ちゃんが最後に桁架に登場したのは…… 科大の今年の ACG 音楽会ですか?活動日付は私が間違っていなければ?(形式:YYYYMMDD)
直接科大 ACG 音楽会を検索して Bilibili の関連動画を見つけ、直接または間接的に中科大 LEO アニメ協会のアカウントページにたどり着きました。動的に探してこの投稿を見つけ、確認したところ、日付は 20240519
です。
フラグ 1 を提出:flag{5UB5CR1B3_T0_L30_CH4N_0N_B1L1B1L1_PLZ_7647de202b}
(人間の言葉:bilibili で LEO ちゃんをフォローしてください、ありがとうニャ)
FULL_RECALL(問題 3-4)#
問題 3: この公園の名前は何ですか?(公園が所在する市区などの情報は不要)
明らかに集中して注意を向けると、ゴミ箱に「六安園林」と書かれているのを見つけました。次に、六安 公園
を直接検索して一つ一つ照合し、最終的に答えは 中央森林公園
です。
問題 4: この景観がある観光地の名前は?(3 文字)
直接画像を検索して三峡截流石であることを発見し、この言葉を検索すると宜昌の壇子岭
観光地が得られます。
フラグ 2 を提出:flag{D3T41LS_M4TT3R_1F_R3V3RS3_S34RCH_1S_1MP0SS1BL3_f156cdbd44}
(逆向き検索ができない場合、詳細が重要です)、ちょうど第二部のやり方に合致しました。
OMINOUS_BELL(問題 5-6)#
問題 5: 撮影地から最も近い病院は?(院区、地名情報は含めない、形式:XXX 病院)
問題 6: 左下隅の動車組のモデルは?
違う、隣の GeekGame で鉄道知識を試験したばかりだ(解けなかったけど)、どうして Hackergame でも試験するの?
本題に戻ります。2 つの問題は同じ画像にあり、正面から画像を見ても手がかりが全くなく、動車組に注目するしかありませんでした。画像の中の動車を直接検索すると、多くの結果が懐密号 CRH6F-A
に指し示し、塗装を比較しても問題なく、その情報を調べるとちょうど 4 編成で、ft で言及されている「非常に象徴的な……4 編成の動車があるようですか?」に合致します。したがって、問題 6 の答えが出ました。
懐密号を検索すると、その走行ルートは北京市郊鉄道懐柔 — 密雲線であることが分かります。このルートを検索すると、百度がそのルートを強調した地図を提供し、次に画像の撮影視点や周囲のものを分析して照合しました。後に道路と遠くの 3 つの赤い屋根を基におおよそ所在地域を確認しました(赤い円)。その地域の周囲には北京の積水潭病院
(緑の円)があり、これが問題 5 の答えです。
フラグ 3 を提出:flag{1_C4NT_C0NT1NU3_TH3_5T0RY_4NYM0R3_50M30N3_PLZ_H3LP_1120265b41}
第三グループの問題は本当に心血を注ぎました。後にインスピレーションが湧いて直接結果を見つけました。
サインインが好きな CTFer の皆さん、こんにちは#
~~ 私は雷軍です。次はこの問題の手順を教えます。~~ 一連の検索を経て Nebula チームの公式サイトにたどり着きました。Writeup を書くときにこのサイトが「主催者」に書かれていることに気づきました。無駄なことをしている気がする。
ターミナルスタイルのウェブページであることが分かります。何も分からず、適当にhelp
を入力してみました:
すべての実行可能なコマンドが表示され、次に一つ一つ試してみました(
env
を試したとき、最初のフラグを見つけました:flag{actually_theres_another_flag_here_trY_to_f1nD_1t_y0urself___join_us_ustc_nebula}
。
その後は試せなくなりました(
実行コマンドの記録を振り返ると、cat
の実行出力に hidden files があることに気づき、まずはls -a
で隠しファイルを見てみました(
すると隠しファイル.flag
が見え、再度cat .flag
で 2 つ目のフラグを取得しました:flag{0k_175_a_h1dd3n_s3c3rt_f14g___please_join_us_ustc_nebula_anD_two_maJor_requirements_aRe_shown_somewhere_else}
最後に、楽しく問題を解いているときに、sudo
で飛ばされました。あなたたち、ナイロンが好きな CTFer たち、私があなたたちのナイロンを見たら、最寄りの小米 SU7 を遠隔操作してあなたたちを創造しますからね!
(以上の内容はすべて人工生成です)
ゼロ知識数独#
数独の達人#
非コンピュータ専攻として、プログラミングではなくウェブサイトを通じて数独を解くことを考えています。ちょうど以前 Puzzle Hunt に参加した際に、数独を専門に解くウェブサイトをいくつか見つけました。例えば焖肉面、Sudokumaker、Noq Solver。適当に一つを選んで 4 つの難易度の数独を解けばフラグが得られます。(なぜフラグを表示しないのか?数独を書く気がしないからです)
zk の達人#
この問題が紙老虎レベルだとは思いませんでした。難易度は環境の設定とコマンドの検索にあります。以下はこの問題を解くための私の試行錯誤のプロセスです。
ゼロ知識に関する内容を検索して大まかに理解し(数独がゼロ知識証明の典型例であることを発見)、このチュートリアルに従って基本環境を設定しました(この問題に関しては、ソースコードディレクトリで npm circomlib
パッケージをインストールしないと、参照されている回路が見つかりません)。その後、Copilot を使って入力形式を理解し、問題に合わせてunsolved_grid
とsolved_grid
を修正してinput.json
として保存しました。そして、setup.sh
を実行して元のsudoku.zkey
とverification_key.json
を上書きし、自分でステップバイステップでウィットネスと署名を生成しましたが、操作中にウィットネスがスクリプトなしで生成できないことに気づき、再度手動でコマンドを実行しました。最終的にproof.json
を生成して検証に出すとエラーが出て、何かがおかしいと感じました。
その後、すべての中間ファイル(zkey と wasm を指します)を自分で生成する必要があるなら、コードの添付ファイルは一部の中間ファイルに何のためにあるのかという疑問が湧きました。この問題を持ってその記事を再度読み返し、ウィットネスファイルと証明ファイルを同時に生成できる一発で済むコマンドsnarkjs groth16 fullprove input.json circuit.wasm circuit_final.zkey proof.json public.json
を見つけました。ちょうど入力の JSON と問題が提供するsudoku.wasm
、sudoku.zkey
を使用しました。実行すると正常にproof.json
が生成され、検証に出してそのまま退社しました(
フラグ:flag{you_are_a_5udoku_expert_and_pr0ved_your_kn0wledge_957bd00098}
大会終了時点で、この問題はわずか 66 人が解決しました。プロセスを整理してみるとそれほど複雑ではなく、主に原理と操作を学ぶことが重要で、少し紙老虎のように感じました(
開かない箱#
SolidWorks で開こうとしましたが、ソフトがクラッシュしたので、適当に STL モデルをオンラインでプレビューできるウェブサイトを探し、オンラインボックスモードで角度を変えるとフラグが見えました。
フラグ:flag{Dr4W_Us!nG_fR3E_C4D!!w0W}
惜字如金 3.0 / 問題 A#
主にどの行でエラーが出たかを参照し、その行の変数や関数などの欠落している文字を補完するだけで解決しました。昨年よりも簡単でした。
フラグ:flag{C0mpl3ted-Th3-Pyth0n-C0de-N0w}
毎日の論文が多すぎる!#
論文をダウンロードした後の 1 日目は全く手がかりがなく、2 日目の午後に再度見直すと、解決した人数がかなり多いことに気づき、これは非常に難しい問題ではないと感じ、再び論文を読み始めました。
論文のウェブページでブラウザを使ってflag
を検索すると、ある画像の中に隠された文字が見つかり、引っ張ると完全な隠されたテキストflag here
が出てきました。私は隠された文字の中にフラグがあると思っていましたが、PDF エディタを使って画像を少しドラッグしたところ......
なんてこった!(この画像はどうしてこんなにぼやけているのか)
後で振り返ってみると、この画像にはあまり調和の取れない枠があり、もしかしたらこの画像に問題があることを示しているのかもしれません。やはり注意力が足りず、運も必要でした(違う
フラグ:flag{h4PpY_hAck1ng_3veRyd4y}
大小王を比べる#
一目で丁真スクリプト問題だ、AI 起動!しかし生成されたユーザースクリプトの効率は少し低く、相手は最大で 46 問程度しか解けませんでした。そこで後に AI にコンソールスクリプトを改写させました。非常に不思議なことに、コンソールスクリプトでも相手に勝てませんでしたが、フラグは出ました。運の要素が少しあるように感じました。
フラグ:flag{I-@M-7hE-h@CkEr-KINg-OF-Comp4RinG-NuMB3r$-ZOz4}
AI が生成したコンソールスクリプト:
// ゲームの初期データを取得
let gameData = state.values;
let inputs = [];
let lessThanButton = document.getElementById('less-than');
let greaterThanButton = document.getElementById('greater-than');
// setInterval関数を使用して50ミリ秒ごとに自動的に答えを提出
let intervalId = setInterval(() => {
// ゲームが終了した場合、タイマーをクリアして答えを提出
if (inputs.length >= gameData.length) {
clearInterval(intervalId);
submit(inputs);
} else {
// 現在の2つの数のどちらが大きいかを判断し、対応するボタンをクリックする
let pair = gameData[inputs.length];
if (pair[0] < pair[1]) {
lessThanButton.click();
inputs.push('<');
} else {
greaterThanButton.click();
inputs.push('>');
}
}
}, 50);
PaoluGPT / 千里挑一#
この問題を見たとき、これらのチャット記録の中に隠されたフラグを探すことだと予想しましたが、リンクを一つ一つクリックしたくなかったので、やはり AI に油猴スクリプトを書いてもらい、ウェブページ上のすべてのサブパスを自動的に探求しました。案の定、スクリプトはフラグがあるウェブページを見つけました。ウェブページを開くと、スクロールが下まで行っていなかったので、直接下にドラッグするとフラグが見えました。
第二の小問を試してみたところ、少し手がかりが得られましたが、確信が持てず、テンプレート攻撃ではないことに気づきました。
フラグ:flag{zU1_xiA0_de_11m_Pa0lule!!!_a1a2048d7d}
AI が生成した油猴スクリプト:
// ==UserScript==
// @name Find Flag Links
// @namespace http://tampermonkey.net/
// @version 1.0
// @description ページ内のキーワードを含むリンクを探す
// @match 問題環境のリンク/*
// @grant none
// ==/UserScript==
(function() {
'use strict';
// すべてのリンクを抽出
const links = Array.from(document.querySelectorAll('a[href]')).map(a => a.href);
const keyword = 'flag'; // キーワード
// キーワードを含むリンクを探す
const foundLinks = links.filter(link => {
const xhr = new XMLHttpRequest();
xhr.open('GET', link, false); // 同期リクエストを使用
xhr.send(null);
return xhr.status === 200 && xhr.responseText.includes(keyword);
});
// 結果を出力
if (foundLinks.length > 0) {
console.log('キーワードを含むリンクが見つかりました:');
foundLinks.forEach(link => console.log(link));
} else {
console.log('キーワードを含むリンクは見つかりませんでした');
}
})();
結尾#
今回の得点状況:
ランキングは昨年とほとんど変わりません。今年の Web はまだあまり慣れていないと感じ、得られた点数は少なかったです;Math は今年入門のハードルが低くなり、昨年よりも多く得られました;General は得点が少なく、相変わらずのレベルです。ただし、100 人未満が解決した問題を作成できたのは少し驚きでした。しかし全体として、私はまだ大佬を仰ぎ見ている新参者の道を歩んでいます。
以上です。読者の皆さん、ありがとうございました。来年私は引き続き初心者の立場でお会いしましょう!
この記事は Mix Space によって xLog に同期更新されました。元のリンクは https://zwh.moe/posts/moyu/hackergame-2024