わふぅ。

わふです。

SECCON2015 オンライン予選

まとめ

SECCON2015 オンライン予選にチーム 0x0 として出ていました。 200+200+100+100 で計 600 点ほどしかチームに貢献できなかったので人権を得られず終了です。ありがとうございました。

解いたもの

Fragment2

ポートをみると HTTP っぽいけどペイロードがバイナリっぽいので「HTTP2 だろうか……?」などと考えました。 調べてみるとどうやらそうらしいので HTTP2 ヘッダの仕様 を眺めながら手動でデコードしました。

Find the prime numbers

本当は Paillier 暗号とかいう名前の暗号だったらしいのですが勉強不足なので知らず……。 ソースコードを眺めて式変形したり適当に殴ったりして解きました。

まず c*o - h が n^2 の倍数になるので何回か (c,o,h) の組を取得して factor にかけて n の候補を絞ると a,b の値がわかります。オイラーの定理を用いて o の mod n^2 での逆元を求めると c * o^(-1) = (n+1)^(ans-1) (mod n^2) となり ans 以外の値がわかっているので y = x^k (mod z) なる k を求める問題になります。

変形後の問題は x,z が互いに素なら baby-step giant-step というアルゴリズムで O(sqrt(z) * log(z)) ぐらいで解けるのですがそのままだと z が n^2 なので大きすぎてつらいです。そこで c * o^(-1) = (n+1)^s (mod a^2) なる s と c * o^(-1) = (n+1)^t (mod b^2) なる t を求めることを考えます。この s,t は前述のアルゴリズムで求められて、あとはオイラーの定理と拡張ユークリッドの互除法と中国剰余定理あたりを持ってくれば s,t から k が求まります。

これで求めた k を使って ans = k+1 として送ったら弾かれたのでよくわからないまま ans=(k%n)+1 としたら通りました。おしまい。明らかに解き方を間違えてます。

Steganography 1

拡張子の gpjb から gif,png,jpg,bmp あたりが連結されているだけだろうと思い適当に画像を抽出したあと並び替えておしまい。

Steganography 3

スクリーンショットの左側に写し出されているバイナリエディタの表示を適当な OCR にかけるとバイナリが得られるので実行します。すると "flood fill" というメッセージが表示されるので、言われたとおりにスクリーンショット中のバイナリエディタの余白領域にバケツツールで黒を流し込むとキーワードが浮かび上がってきます。

右下で意味深な感じでペイントのウィンドウが開かれていて「やられた……」という気持ちになりました。

Skylake で組んでいました

組んでいました

いつまでも「ノート PC にモニタつなげてキーボードつないでうんぬん」とやっているのは厳しいなぁということで skylake 発売にあわせてデスクトップ PC を組んでいました。 8 月のまだパーツも出揃ってない時期にぜんぶ揃えて組んだのでいまから見返すと若干あれな構成なんですがまぁ気にしてはいけない。 「なんでいまさら記事にするんだ」とかも気にしてはいけない。

構成

  • CPU: Intel - Core i7 6700K
  • M/B: ASRock - Z170M-ITX/ac
  • Memory: UMAX - DCDDR4-2133-16GB HS
  • Case: SILVERSTONE - SST-ML05B
  • PSU: SILVERSTONE - SST-ST45SF-G
  • CPU Cooler: GELID Solutions - SlimHero CC-Shero-01-A

改善点とか

  • もうちょっと待って 6700 で組んだほうが安上がりだし性能差あんまりないし幸せだった
  • SlimHero は厚みがあまりなくて良いんだけど Case の上部に 12cm のファンをつけようとすると干渉する程度には大きかった
  • SlimHero をとりつけるとマザーボード上の無線 LAN な miniPCIe カードと干渉してしまう
  • 電源はまぁまぁ静かだけど低負荷時はほかに目立った騒音がないので相対的にうるさい

感想

ちょっと排熱が心配だったけどまぁ定格運用ならファンを回せば大丈夫っぽい。GTX750Ti とか載っけたくなったのでケースは買い替えかな……。ただ PC を置くスペースが限られているので SST-ML06B-E とかそこらへんのケースがほしいけど排熱大丈夫かな……。

高い買い物だった。初心者感あふれるチョイス。次からはもうちょっとちゃんと考えて組みます……。

Ubuntu 14.04.3 で動かしているので適当な英語の記事を参考にして sudoedit /etc/default/grub して GRUB_CMDLINE_LINUX_DEFAULTi915.preliminary_hw_support=1 を追加しとかないとグラフィック周りが壊れた。

消費電力はアイドル時で 20W 程度です。省電力でよい。

(追記: ケースを買い替えて dGPU を載っけました)

大学生が考えるべき所得税とかの話? (主に競プロのプロ向け?)

にゃーん

雑所得を得るといろいろ申告する必要があるらしく面倒なのでここにメモっておく。間違っているかもしれないので最終的には自分で確認してほしい。

所得税の全体像

所得税は大きく分けて 総合課税制度 / 源泉分離課税制度 / 申告分離課税制度 の3つの課税制度から成り立っていて、これらはそれぞれ独立に税額の計算などが行われる。

源泉分離課税制度 (≠源泉徴収) の対象となるのは銀行から得られる利息などで、これは確定申告しなくても自動的に徴収され、還付されることもないので、とくに考えなくて良い。

申告分離課税制度 の対象となるのは株式売買や先物取引、不動産取引などで、面倒くさいし大学生にはあまり関係なさそうなのでここでは考慮しないことにする。

総合課税制度 の対象になるのは次の所得である。 (他の課税制度によってすでに課税されているものは除く)

  • 利子所得
  • 配当所得
  • 不動産所得
  • 事業所得
  • 給与所得
  • 譲渡所得
  • 一時所得
  • 雑所得

総所得金額

総合課税制度において、上で挙げた 利子所得〜雑所得 の所得を合計した金額を 総所得金額 という。総合課税制度における所得税額は、総所得金額から各種の所得控除を差し引いたあとに税率をかけることで算出される。

合計所得金額

総所得金額 とは異なる用語として "合計所得金額" というものがあり、これは "総所得金額" と "申告分離課税の対象となる所得" などをあわせたもののことである。だいたいの大学生は 合計所得金額 = 総所得金額 という認識で問題なさそう。

38万円の壁

合計所得金額 が38万円を超えると親が扶養控除を受けられなくなり、親の所得税額が上がる。また、総所得金額基礎控除額である38万円を越えてしまい他に控除を受けられない場合には自身の所得にも課税される。とりあえずこの38万円を越えないようにするか、38万円の壁など気にせずたくさん稼ぐのが良い気がする。

"103万円の壁" とは給与収入が103万円のときに合計所得金額が38万円になることから生じた言葉っぽい。

それぞれの所得について

上であげた所得のうち考慮したほうがよさそうなものは 給与所得 / 一時所得 / 雑所得 の3つ。

それぞれの所得は、収入から経費や各種控除を差し引いたものとして計算される。所得税を考える上で 所得と収入は別の意味を持つ ことに注意が必要。

給与所得

その名のとおり給与による所得のことを指す。収入金額から給与所得控除額を引いたものが給与所得になる。収入金額が162.5万円を超えていない場合は給与所得控除として65万円が引かれる。収入が162.5万円を超える場合はもうすこし給与所得控除も増えるはず。ほかに控除があるらしいが条件が厳しい?

一時所得

おもにコンテストでの賞金など、労働によらない所得のことを指す。総収入から必要経費と特別控除を差し引いたものが一時所得になるが、総所得金額には一時所得を 0.5倍 したものが算入される。特別控除は50万円である。必要経費を考えるのはめんどそう。よほどのプロじゃない限り年50万円もコンテストで稼げないと思うのでだいたい一時所得は0円になると思う。

雑所得

雑所得とは、講演料や報酬のことをいう。収入金額から必要経費を差し引いたものが雑所得となる。

家内労働者等には必要経費として65万円まで認められる場合がある。「特定の人に対して継続的に人的役務の提供を行うことを業務とする人」は、「給与の収入金額が65万円未満のとき」に、「65万円からその給与の収入金額を差し引いた残額と、事業所得や雑所得の実際にかかった経費とを比べて高い方」が必要経費として認められるらしい。詳しくは 国税局のサイト を見るのが良いと思う。

控除の違い

親が受けられる扶養控除などは 合計所得金額 をもとに決定される。勤労学生控除や基礎控除などはこの合計所得金額の算定には 関係ない ことに注意が必要。同じ "控除" なのに給与所得控除は合計所得金額の算定に関わってくるのがややこしい。

給与所得の算定に関わるのが給与所得控除 (65万円) で、これはそのまま総所得金額や合計所得金額の算定に関わる。

総合課税制度における所得税額の算定に関わるのが基礎控除 (38万円) や勤労学生控除 (27万円) で、これは自身の所得税額を計算するときにしか関係がなく、これらの控除を差し引く前の段階ですでに合計所得金額などは算出されている。

住民税

都民である場合には所得税とは別に住民税がかかることもある。"未成年かつ合計所得金額が125万円以下" または "合計所得金額が35万円以下" のうちどちらかを満たすなら非課税となる。他にも非課税となる条件はあるけど関係なさそうなので省略。

給与所得だけなら勤務先がいろいろやってくれる気がするし、そうでなくても確定申告をすれば通知が届くはずなので別途申告などはしなくてよいはず。

参考

tkbctf4 参加記

概要

tkbctf4 にチーム 0x0 として参加していました。チームとしては 2541 ポイントを稼いで 1 位だったらしいです。わふれるかは600点をとって残りは superbacker 氏が 1 人で荒稼ぎしてました。

2 日目は用事があって出られなかったので 1 日目で出た問題のうち解けた 2 題だけいろいろ感想を……。

解けた問題

rcrypto

書いたコード

計算結果から flag を逆算せよという問題。式変形をしたあとに CPU で殴ると解けます。なぜか 200 だけどまぁ 100 相当なんじゃないですかね……。

high-low (1)

書いたコード

与えられた js コードの断片でぐぐるMental Mahjong の概要 とそれのもとになった Mental Poker の実装っぽいもの が引っかかる。原理自体はほとんど同じっぽい。たぶん next を呼んで送られてきたカードをこっちで自力で復号すればいいんだなぁと思う。

与えられた js コードを読んでると、明らかに怪しい部分 ( // have to be deleted とかいうコメントとか me['c_card'] = c_card なる不必要な代入とか) がある。不審に思いつつもソースを適当に読む。次にめくられるカードは暗号化された状態で c_card に代入されているけど me.key と room.key で復号したあと get_card に投げて完全に解読できるなぁと分かる。ブックマークレット書いて実行しておしまいだった。

400 にしては簡単すぎると思ったけどじつは room.key とかが存在するのは運営側の不備だったらしい……。不参加だった 2 日目に問題点が修正された high-low2 が出題されたらしく悲しみ。

Mental Poker については Qiitaにあるこの記事 も参考になるかな。問題関係なくこのアルゴリズム自体がけっこう興味を引く。

JOI2014夏季セミナーの反省とか

Day1

初日。みんな若い。つらい。

生徒の自己紹介がすこし寂しい感じだった。好きな言語/アニメなどについて長々と語る人がいなかった。予めこういうことをしゃべると良いんじゃないかなぁという例をいくつか挙げておくべきかも。あと本の紹介をその場で考えたので適当な紹介になってしまった。申し訳ないです。

今年は生徒全員がD棟宿泊なのでJOIerで専有できる談話室が存在せず少し盛り上がりに欠けた感じがした。A棟は偉大であった。それでもD棟のラウンジでは麻雀などが繰り広げられていたし、ある程度の交流はなされていたみたい。

チューターとして何をすればいいのかよくわからない。大まかな流れ(本をどう読むべきか/セミナー全体の時間配分など)を生徒に伝えて、あとは生徒がわからなさそうなところを解説したりすれば良いのかな。

Day2

生徒がもくもくと本を読んだり実装していたり。

今年は準備不足で十分なインターネット権が得られず、開発環境のインストールでつまったり、言語の仕様やライブラリの使い方をググることができずつまったり、多くの時間が無駄になってしまった気がする。来年はもうちょっとネット環境をどうにかしたい。

自分の班の生徒たちは、とくにわふれるかがなにも指示しなくてもみんなそれぞれやりたいことをやっている感じだった。すごい。

Day3

深夜のコンテストに出てしまったせいでとにかく眠かった……。

この日はほとんどチューターっぽいことをしなかった。ごめんなさい。ただセミナー後にみんなで行った万豚記はとても美味しかった。大餃子と白ゴマ担々麺はとても良いものです。

Day4

Day3と同様クズしてた。ごめんなさい。

この日はDay3までとは違い国際交流棟の国際会議室という部屋を使っていたが、ここはネット環境が特に劣悪で、ドコモ回線が死亡していてスマホすら満足に利用できなかった。悲しい。

Day5

発表の日。すこし寝坊してしまったけどセミナーの開始には間に合ったので許してください。

発表はとくにチューターとしての反省点が多い。Day4でも同じ部屋を使用していたのだから、前もってプロジェクタへの接続方法や発表の時間配分などのリハーサルを行うことができたはずなのに、それをしなかったことによるトラブルが頻発した。最初の方はチューターが生徒に発表の残り時間をきちんと伝えられていなかったし、生徒もぶっつけ本番なのでうまく時間配分できていなかったりした。プロジェクタへの接続に時間がかかった生徒もけっこういたし、とにかくグダグダだった。後半は多少まともになったが、前半の生徒にはいろいろ迷惑をかけてしまって申し訳ないです。

あと、ほとんどチューターとしてなにか指導をした覚えがないのにみんなきちんとした発表をしていて、すごく感動した。というかごめんなさい。

特に大事なことまとめ

  • インターネット権については事前に十分調べておかないと後悔する
  • リハーサルは 必ず 行うべき
  • 大餃子と白ゴマ担々麺

業務連絡

みんな自分の発表スライドを何らかの形でネットに上げてね。slideshareとかspeakerdeckとか使うといいかも? できればpdf形式でダウンロードできるようになってるととても嬉しい。catupper氏がスライドなどのアップロード先を記入できるGoogleスプレッドシートを用意してくれているのでそこへの記入を忘れずに。

SECCON2014オンライン予選

結論

チームとしては全体で2位。本選に出場できるらしいです。人数制限があるので多分わふれるかは行かないと思います。

チームメイトが強すぎてつらい。2問しか解けなくてさらにつらい。

解いた問題

x86アセンブラを読もう

x86アセンブラ読んだことありますか」と聞かれているような問題で、x86アセンブラすこし読める人なら脳内で実行しておしまい。 1 から 255 までの総和をとったあと2を引けばフラッグ。

あみだくじ

ひたすら面倒なだけ。ファイルをダウンロードして手元で実行するとあみだくじを1000問ぐらい出題してくるのでソルバを書いて解く。あみだくじの解法は下から辿ればいいだけなので何の問題もないのだが、あみだくじプログラムからの出力をパースするのがひたすら面倒。しかも10問ごとに微妙に形式が変わる。80問あたり(もっと少ないかも)でネタ切れになって新しい形式が出てこなくなるのでそこまで頑張る。

1度間違えると1問目からやり直しな上に1000問もあるのでパイプなどを利用して直接ソルバとプログラムを通信させないといけない。最終的には ruby の IO.popen を使ってコミュニケーションした。