セキュリティミニキャンプ in 三重 2023 参加記

はじめに

7/8(月)に「セキュリティ・ミニキャンプ in 三重 2023」に参加していたので、参加記を雑に綴ります。

www.security-camp.or.jp

きっかけ

セキュリティ・キャンプに参加したいという気持ちは前々からありました。しかし、全国大会は年齢制限で参加できず、ネクストキャンプは今年の講義はハードウェアに寄っておりついていけないかもと思って応募を尻込みしていました。

そんな矢先、友人がセキュリティ・ミニキャンプなるものに参加しており、年齢制限も25才以下であることを知りました。今回の講義内容が自分の興味に近く、場所も三重と比較的近かったため応募しました。

応募課題

今回「セキュリティ・ミニキャンプ in 三重 2023」に参加するにあたって、以下のような応募課題が設けられていました。

  • 応募動機と何に役立てたいか
  • webにおける脆弱性を一つ説明する
    • その脆弱性がwebアプリに存在することを証明する場合、何をすればよいか。その際どのようなリクエストを送り、どのようなレスポンスが予想されるかを説明する
  • リバースエンジニアリングについて学んだこと
  • マルウェア解析に対する情熱と経験

ざっくり当日の感想

アンケートに書いた感想とほぼ同じだけど、書かないよりはいいよね。

『知識・技術と規範意識』幸治 洋之様

技術者本人には悪意がなくても、その技術が悪用されてしまう事例があることを学びました。そのため、今開発しているシステムは社会にどのような影響を及ぼすのか、を考えながら開発する必要があることを再認識させられました。

脆弱性スキャナ開発を通して脆弱性の理解を深めよう!』美馬 隆志様

美馬様のSQLインジェクションの説明が大変理解しやすく、説明の仕方を参考にしようと思いました。

また、脆弱性スキャナについて(今回使ったsqlmapがそうだっただけなのかもしれませんが、)思ったよりも簡単な実装で驚いたと共に、他の脆弱性スキャナについても実装を確認してみようという意欲が湧きました。

あとは、sqlmapのコードを参考にしながら簡単な脆弱性スキャナをpythonで実装しましたが、sqlmapのコードリーディングとpythonでの実装に手こずってしまったので、コードを読み書きする機会をもっと増やしたいなと思いました。

『Introduction to Malware Analysis』中島 将太様

現場でマルウェア解析を行っている方から、最近のマルウェアで使われているテクニックのトレンドを教えて頂けたのはとてもいい経験でした。

またGhidraやYaraの使い方を一から丁寧に教えていただけたので、もう一度スライドを見ながら復習したいと思います。

最後に、中島様が書かれた「マルウェア解析者になるための勉強方法」という記事を共有していただけました。

github.com

マルウェア解析勉強したいけどどこから手を付けていいかわからないと思っていたので、本当にありがたかったです。初学者の身としては、こういった記事があると本当に助かるので頭が上がりませんね。「Ghidra実践ガイド」を買ってお布施としつつ、Ghidraの理解を深めたいと思います。

おわりに

学生のうちにセキュリティ・キャンプに参加することができたので良かったです。改めて全国大会に参加しておきたかったなという風に思いました。セキュリティに強く興味を持った時点で年齢制限を超過していたのでつらい。

最後になりますが、どの講義においても新しい知見を得ることができ、とても有意義な一日を過ごすことができました。運営の皆様、講師の皆様にはとても感謝しております。ありがとうございました。

ABC185 D - Stamp

atcoder.jp

ハンコの幅kはAi-A+i(1≤i≤M+1)の最小値で決まる.

[A_1,A_2,,,A_M,N+1]の間でハンコの幅kを求めつつ,辞書Spacesに幅をkey,その幅が出現した回数をValueとして記録しておく.

最後に,ans += ceil(幅 / k )* 幅が出現した回数 で答えが求まる.

(ceil()は天井関数)

所要時間

34分(median solve Time:34分)

余談

他にもやることがあるから仕方ないけど,説明が手抜きになり過ぎて嫌.

これ,自分で後で見返した時に理解できるだろうか..

ABC174 D - Alter Alter

atcoder.jp

Rの左隣にWがあるとダメ.したがって,最終的には左側にRが寄っている配置になる.

問題文には,以下の二つの操作が与えられていた.

  • 石を2個選び,それらを入れ替える
  • 石を1個選び,その石の色を変える

しかし,なんとなく,入れ替えの操作だけで最小回数が達成できそうな気がした.

方針としては,「文字列に含まれるRの総数」と「Rの個数のみの累積和」を求め,「Rの総数」- 「左端から「Rの総数」番目までの累積和」を計算することで,必要な入れ替えの回数を求める.

与えられた文字列が「WRWWRWRR」なら,「Rの個数のみの累積和」は以下のようになる.

N = int(input())
C = input()

S = []
S.append(0)
for i in range(N):
    if C[i] == 'R':
        S.append(S[i]+1)
    else:
        S.append(S[i])

print(S[-1] - S[S[-1]])

所要時間

31分(Median Solve Time:確か35分)

ABC213 C - Reorder Cards

atcoder.jp

行と列を取り除く2種類の操作を行うと,数字の書いていない行と列はすべて消える.
与えられたAとBをそれぞれ昇順にソートし,出現した順番で新たに添え字を割り振り,変換表を作る.つまりA=[1, 10, 100, 1000] であれば,newA=[1,2,3,4]という風に変換を行う.下のコードでは辞書r_H,r_Wで変換表を作っている.(これは座標圧縮と呼ばれるらしい.後で調べよ.) 最後にその変換表を使って,Ai,Biの変換を行い,答えを出力する.

H, W, N = list(map(int, input().split()))
AB = [list(map(int, input().split())) for i in range(N)]

A=[]
B=[]
for ab in AB:
    A.append(ab[0])
    B.append(ab[1])

A.sort()
B.sort()

r_H = dict()
r_W = dict()

ind_H = ind_W = 1
prev_a = prev_b = -1
for a,b in zip(A,B):
    if prev_a != a:
        r_H[a] = ind_H
        ind_H += 1
        prev_a = a
    
    if prev_b != b:
        r_W[b] = ind_W
        ind_W += 1
        prev_b = b
    

for ab in AB:
    print(r_H[ab[0]], r_W[ab[1]])

所要時間

45分(Median Solve Time:36mins)

picoGym Scanvenger Hunt

Insp3ct0rのWebサイトを使いまわししていたので,また,HTMLとJavaScriptCSSを見てみた. HTMLとCSSに,Flagの断片が書いてあった. 同じようにJavaScriptファイルを見てみると,
/ How can I keep Google from indexing my website? /
とあるので,インデックス登録に関係するファイルをあたってみることにした.

robots.txt

まずsitemap.xmlにアクセスしてみたが,notfound. robots.txtにアクセスするとフラグと共に,以下のようなコメントが
I think this is an apache server... can you Access the next flag?

.htaccess

apacheなら.htaccessだろうと思ってアクセスすると,ヒット. また,フラグと共に以下のようなコメントが
I love making websites on my Mac, I can Store a lot of information there.

.DS_Store

MacならDSStoreだろ~と思ってアクセスすると,ヒット. Congrats! You completed the scavenger hunt. Part 5: _35844447}

picoCTF{th4ts_4_l0t_0f_pl4c3s_2_lO0k_35844447}

picoGym Insp3ct0r

『Kishor Balan tipped us off that the following code may need inspection:』という文と共に,URLが与えられる. とりあえず,ブラウザのDevToolを使って,HTMLやJSを読んでみる.
myjs.jsとかいう明らかに怪しいファイルがあったので,コードーリーディングをすると,コードの下のほうに
/ Javascript sure is neat. Anyways part 3/3 of the flag: _lucky?f10be399}/
という文字列を発見.またHowのタブに,HTMLとCSSJavaScriptを使ってWebページを作ったよ~と書いてあったので,HTMLとCSSも見ると同じような文字列を発見.
真面目にコードリーディングしようとした自分がバカでした.
picoCTF{tru3_d3t3ct1ve_0r_ju5t_lucky?f10be399}