セキュリティミニキャンプ in 北海道 参加記
起きたら庭が白くなってました。
事前課題
キャンプ2週間前くらいに事前課題が2つ出されました。
1つ目は指定されたものを調べてレポートするという内容で、調べてもよくわからなかったりして非常に薄い内容になってしまいました。。。
2つ目はメモリイメージが配布され、それを解析しわかったことについてレポートするという初めて触る分野。とりあえずvolatility走らせて怪しそうなのがあればそれを書けばいいかなと思ってました。が、甘かったです。なにが怪しいのかわからなかった。。。
1日目
1日目はセキュリティ人材の不足の現状や、イギリスのbinというゴミ箱を例に個人情報の取り扱いなどの内容で、セキュリティ人材は現段階で8万人も足りないという話は衝撃的でした。今回はセキュリティの現場のことでしたが、IT業界はどの現場も人材が足りないんだろうなぁと。
夜の部では3つのグループに分かれ事前課題の2つ目のメモリイメージを解析をして、その解答?と2日目の講義の準備です。
メモリ解析では全く役に立てなかった。グループメンバーつよい。ほんとにつよい。そして役に立てなくてスマンかった。要復習。
2日目の準備はかなり手間取った。8GBのzipを渡されて展開されたら20GBになるよーって言われて詰んでました。ディスクイメージまるまるだったので納得。ホテルで一緒の部屋になったちゅっちゅーさんに相談したら、余ってるパーティション小さくして新しくexFATでパーティション作ればいいよというアドバイスを頂き、自分の環境で2日目の課題をできるように。本当にありがとうございました。
2日目
2日目は1日目の夜に用意したディスクフォレンジックでした。
午前は、ブートレコーダやNTFSの仕様を見ながらバイナリエディタで解析し、指定されたファイルを探す内容。ここは仕様をちゃんと理解していないとすぐに間違えてしまうところで、先生やチューターさんに何度も助けられました。完全に勉強不足でした。。。
午前の自習課題はマルウェアのMFT Entryが指定され、NTFSの仕様通りに読み解き、本当の感染時刻を特定するという。ここで仙豆さんにめっちゃ教えてもらって、理解できなかった部分を理解。そしてなんとか本当の感染時刻を特定できました。要復習。
午後は、午前にやった内容をツールでやろう!という内容。ここからが本番で、ツールの使い方を学び、自習課題で隠されたファイルの検出。そして自動化。ちゃんと理解すれば条件を書くだけだったくさいので、理解していた人はちゃんとできてたっぽい。要復習。
最後に宿題を出され、感染経路などまだ明らかにしていない部分を明らかにする内容。がんばります。
感想
今回は本当に参加してよかった。バイナリレベルのことはあまりやったことがなく新鮮で、普段は気にせず使ってたファイルの構造やディスクの構造に触れ、解析することができたので非常にいい経験になりました。何度かついてけなくなりそうでしたが、先生やチューターのお陰で最後までついていくことができました。
今回はセキュリティの分野に飛び込むには良いきっかけだと考えています。今まではセキュリティ分野はすごく難しそうだなぁと思っていて、精神的に手がでませんでした。まぁ、実際難しかったわけですが。しかしどの分野もそうですが、最初から簡単だと思えることはないと思います。なので、きっかけさえあればどんな難しい分野も飛び込んでいけると思います。
また、1日目のチューターさんのお話にもありました、「情報を出したところに情報はあつまる」という言葉は印象が強かったです。あまり情報を発信したことがなかったので、これからは情報を発信して行き、マサカリを受けていきたいと思います。
理解した部分もありますが、理解できなかった部分も多いです。理解したというより、知るという感じの部分もありました。こういうのは割りとすぐに忘れてしまうので、復習をしていかなければならないと思います。「理解した」だけでは終わらず、「完全に自分のもの」というレベルに持っていかなければ今回の講義は無駄になってしまいます。なので、復習をし、手を動かしていきたいと思います。
最後になりましたが、キャンプ実施委員会、講師、チューター、参加者、その他関係者の方々、みなさん、本当にありがとうございました。またどこかでお会いしましょう。
それでは。
Macbookのターミナルに表示されるホスト名の変更で手こずったお話
Macbookのターミナルに表示されるホスト名の変更で手こずったのでメモ程度に。。。
ターミナル画面をぼーっと見てる時にふと気づいたのが "本名"nombp:~ ってダサいんじゃね?いやいやこれはないわ、と。
すぐにシステム環境設定の共有で変更しようと思って変えたけど反映されず、はてな状態に。
調べてもそれ以上のことは書いてないし「うーん」と悩みつつ /etc/hostconfig とか書き換えたりしてみたけど反映されず。。。
更に調べていくと「hostname」で確認できる!という記事を見たのでコマンドを実行してみると「"本名"nombp.fletsphone」と。「.fletsphone」とか、記事と違うんですが。「.local」はどこいったんだよ。
とりあえず、「.fletsphone」をグーグル先生に聞いてみることに。すると、
Linux で無線ルータ - ルギア君の戯言 というブログが見つかって記事内に「.fletsphone」の文字列が!!!
そこで「無線ルーターの記事に載ってるからPCのWi-Fiを切るにしてみたらいけるんじゃね?」という普段では考えつかないようなことを考えてみたら、見事!変更に成功しました!! すばらしい!!!
まとめると、ホスト名を変更するときはWi-Fiを切ってからやるといいですね!(多分)
ルーターとかネットワークとか怖いな、と思いました。うん、こわい。。。
札幌中央区Ruby会議01参加記
というのも感想ですけど。。。
事の発端はとみお氏の紹介でした。
「札幌」+「Ruby」とくればこれはもう参加するしかないなと。
紆余曲折あってなんとか参加できました。
発表の内容は技術系から環境の構築、人間関係など様々な発表があり、「なるほどなぁ」、「こういう考え方もあるのかぁ」などみんなうまく工夫しているなぁと思いました。(僕が工夫しなさすぎなだけですけど)さすがに技術ネタは知識不足で理解ができなかったですけど。。。(残念)
終わったあと、自分の考える幅が広がったような感じがしていい刺激になりました。
普段Rubyを使わない勢(スクリプト言語自体使ってない)としては、Rubyにまつわるお話をたくさん聞けて非常にいい経験になったと思います。この会議をきっかけにRubyとRailsを勉強しよう(宣言)
最後に、いろいろと相談に乗ってくれたとみおさん、島田さん、本当にありがとうございました。
発表資料のまとめ(全員分は確認できませんでした...)
発表
Rails あるある - 佐藤竜之介 さん
# ひでお(仮) - niku - Rabbit Slide Show - にく さん
趣味プロダクトで楽しいコードライフワークを送る - 小玉直樹 さん
高架下のRuby - myokoym - Rabbit Slide Show - 横山昌史 さん
Ruby in Project-Based Learning // Speaker Deck - 梅本祥平 さん
それ NArray でできるよ // Speaker Deck - 前田智樹 さん
LT
How to enjoy Padrino - 矢部剛嗣 さん
近況の報告と自宅警備員が失職した話 - うさみけんた さん
一般社団法人日本Rubyの会のほうから来ました // Speaker Deck - 島田浩二 さん
JMC 16:15からの時間帯に参加した
とりあえず、JMCで初めてファイルのリダイレクトを使った。C言語でfscanfとかfprintfを使ってたのが懐かしい。
1問目
最初に5じゃなくて4をかけてたりして焦ってた
2問目
最初は構造体を使おうとしていたけど、構造体のソートを実装するより単純に配列をそれぞれ用意したほうがいいのではと思いつつ書きなおして、遠回り。このへんから少し自信がなくなってる
3問目
forとかで回せば良さそうなのをわざわざメモ化再帰っぽいことをして謎になってる。
4問目、5問目は問題文が理解できなかったのでとばし
6問目
単純に組み合わせを全部作ってひとつずつ試せば部分点くらいは取れそうな気がしてたけど、組み合わせを生成できなかったのであきらめ
感想
うまくいってれば3完なのでいいかなー、JOI予選的には落ちてるけど。
もっと問題文をよもう!
模擬予選楽しかったです。ありがとうございました
JOI予選過去問 Part1
一年弱ぶりくらいに更新
そろそろ情報オリンピックの季節が近づいてきたので過去問題を解き始める(遅
問題の参考はJOI非公式難易度表をもとに解いていく。
今回はLevel1から解いていったのでGistにあげておく。
つまづくところは特になかった。
ただ、割り算の少数以下切り上げの式は勉強になった。
これから解いた問題をあげていくかもしれない(多分
去年よりは結果を出せればいいなぁ。
というか、とっととC++使えるようになりたい。
タイマ0の割り込み
今回はタイマ0を使って1msecのインターバルタイマを作ろうと思いました。
ちなみにコンパイラはC18です。
CPUのクロック周波数は40MHzです。
タイマ0なので当然割り込み処理を書くことに...。
今回は優先順位なしでかきました。
int timer = 0;
void main(){
..........//各種設定(省略)
while(1){
//cntの値をダイナミック点灯で表示
if(timer == 999)++cnt;
}
}
#pragma interrupt isr0
#pragma code isrcode = 0x08
void isr_direct(void){
_asm goto isr0 _endasm
}
#pragma code
void isr0(void){
INTCONbits.TMR0IF = 0;
WriteTimer0(0xffd9); //1ms
++timecnt.timer;
//Here I write the reset condition of "timer 0"
if(timer == 1000){
timer = 0;
}
}
が、まったくうごかない
原因がまったくわからないのでとりあえず放置。
5分後くらいにやっと動いた。
しかしcntの値は12までしか増えず、それ以降はまたとまったまま。
試行錯誤をしてみる。
すると
if(timer == 999)++cnt;
の部分が怪しいことに気づいた。
なんかうまく比較されていなぁ。
比較している途中に割り込みが発生してるのかも。。。
と思いとりあえず、timerの値が999になったら割り込みの中でフラグを立ててそのフラグを元にcntの値を増やすとうまく動いたーー。
とまぁ、今回はこんな感じでした。
ちなみにWriteTimer0の値は
カウンタ数=インターバル時間/(CPUクロック・4)
65536-(カウンタ数/プリスケーラの値)
で求めることができます(端数は誤差なので四捨五入して大丈夫なはず)
うーん、ハードウェアはどこで何やってるかわからんときがあるから油断できないなぁ。