ようじょのおえかきちょう

ふぇぇ お医者さんにペン持ったらダメっていわれた〜〜

からだの症状

似たような症状が出ていて、回復した人がいたらどうやったのか教えてほしい。

4月ごろから調子がおかしくなって、波はあれどしんどい状態が続いているので、その様子を記録しておこうと思う。 病院で診断を受けたわけでもないし(「頭痛ですねーお薬出しておきます」くらい)生活に支障が出てきたのも数ヶ月前からなので、まだなんともいえない。

時々心配してくれる人がいるのに症状をうまく説明できないのがもどかしいので、今度からはこのURLを貼って説明に代えたい。でも読むのめんどくさそう。

睡眠障害

  • 4月半ばから {漠然とした不安感, 頭痛} で寝付けなくなった
  • 明日もこのしんどさと過ごさないといけない、寂しい、誰かと話をしていないと気が狂いそうだ

食欲の減退

  • 時々、食欲はあるのに喉が絞まって口に入らないことがある
  • 調子のいいときは以前のようにフードファイトできるが、基本的に少食になった

疲労感・倦怠感

以下のことが同時に、突然起こる。頻度は多いときで数時間ごと、少ないときで数日ごと。

  • 肩が重くなる。腕に力が入らず手を上げにくい
  • 体が震える
  • みぞおちを押されて吐きそうになる感覚
  • 喉が絞まって息苦しい、吐きそうになる感覚。ヒステリー球ぽい?
  • 頭痛(症状は色々)
    • 締め付けられるような痛み
    • 脳みその中心だけ 5Gくらいかかっているような重
    • 脳みそが半分になったみたいに、あるいは寒天になったみたいに、ぼーっとして思考が長続きしない
    • ときどき熱っぽい
    • 気圧が下がると↑の5倍増しくらいにひどい

こんなんと毎朝戦ってたんだから布団から出られるわけない、4〜5月に学校を休むことが多かったのはそのせい。


5月末ごろからからだの症状は比較的マシになって(それでも頭痛やヒステリー球は苦しい)、原因はこころのほうにあるのかなぁ……といった感じがしている。ググったら自律神経失調症が引っかかったけど、どうもすぐに治るわけでもなさそうで厳しい。

SECCON BeginnersCTF 2018 Writeup (Crypto - Streaming)

BeginnersCTF

プログラムを書くのが苦手な Beginner なので Excel で解きました。

問題

# encrypt.py

import os
from flag import flag


class Stream:
    A = 37423
    B = 61781
    C = 34607
    def __init__(self, seed):
        self.seed = seed % self.C

    def __iter__(self):
        return self

    def next(self):
        self.seed = (self.A * self.seed + self.B) % self.C
        return self.seed

g = Stream(int(os.urandom(8).encode('hex'), 16))

encrypted = ''
for i in range(0, len(flag), 2):
    a = int(flag[i:i+2].encode('hex'), 16) ^ g.next()
    encrypted += chr(a % 256)
    encrypted += chr(a / 256)

open('encrypted', 'wb').write(encrypted)
# hexdump encrypted

0000000 ce 1e 65 0c 06 5f 94 3a 57 49 1d 17 f5 17 59 3f
0000010 9c 40 9d 4a 19 31 8d 26 3e 51 fd 03 ce 52 56 16
0000020

乱数パート

  • urandom(8)... でめっちゃでかい数字を一番最初の seed にしている
  • X_{n+1} = (AX_n + B) \, \% \, C の形で新しい乱数を生成している

最初の seed はでかすぎて、残念ながら知りようもありません。

次に漸化式を見るとこれは線形なので周期性を持ち(擬似乱数列)、\% C しているので周期は高々 C(34607)と分かります。Excel=MOD((37423*A1+61781), 34607) のようにしてみると実際に確認できます。このことから、一番最初の seed が分からなくても、任意の n に対する X_n が分かれば帰納的に X_{n+1}, \, X_{n + 2}, \, \cdots を知ることができます。

n: X_n
1: 1
2: 29990
3: 3327
4: 17509
...
34604: 6402
34605: 24959
34606: 24901
34607: 1

暗号化パート

  • ストリーム暗号というらしい。速くてやさしそう
  • flag を2文字ずつみて、2桁/文字 の16進数にする。2文字ずつなので4桁の16進数が得られる(以下 hex
  • int(hex, 16) する(以下 int
  • hex と生成した乱数(以下 random)の XOR をとる(以下 a
  • a を元に2文字を生成する(以下 chr1 chr2
  • 16進数で書き込む(以下 encrypted
  • flag の prefix は ctf4b{ だと分かっている

encrypted から逆算して flag に辿り着くことを考えます。以下、flag の最初の2文字 "ct" について例を示します。

encryptedchr1 chr2

16進数を10進数に直してやればいいので chr1 = HEX2DEC("ce") = 206 chr2 = HEX2DEC("1e") = 30 です。

chr1 chr2a

a = chr1 + chr2 * 256 の関係があるので a が復元できます。206 + 30 * 256 = 7886 です。

arandom

a = int ^ random の形になっており、XOR の性質より random = a ^ int です。hex =DEC2HEX(CODE("c")) & DEC2HEX(CODE("t")) = 6374 より int = int(hex, 16) = 25460 なので random = BITXOR(a, int) = 32186 と求められます。

乱数パートで確認した疑似乱数列から 32186 を探して、以降 flag の長さぶんだけ取り出せば g.next() で使用した値が分かります。念の為 flag "ct" の続きである "f4" についても同様に確認してみると、ちゃんと random = 27217 が求まります。

32186
27217
15741
22263
11898
32366
14992
24106
10736
13232
16747
17385
14429
30620
12450
29483
...

既知→ flag

さて、現在分かっている値は以下の通りです(灰色は固定値)。ここからinthexflag の順に求めていきます。

f:id:yamasy1549:20180527121916p:plain

randoma が既知なので、XOR の性質より int = random ^ a=BITXOR(random, a))で求まります。続いて hex = DEX2HEX(int) で16進数に戻します。hex は16進数4桁ですが、flag にするときは2桁ずつ読みます。=CHAR(HEX2DEC(LEFT(hex, 2))) =CHAR(HEX2DEC(RIGHT(hex, 2))) で2桁ずつ2文字を読みます。

f:id:yamasy1549:20180527124912p:plain

できました。線形合同法は値を予測されやすいから乱数としてはあまり良くないよ、ということみたいです。

感想

過去何回か CTF に参加して {1, 2} 問解けたり解けなかったりしていて、今回初めて Writeup というかメモを公開しました。途中参加だったのでこの問題しか解けてないんですが、前に興味持って調べてた乱数の知識がちょっとだけ活用できて楽しかったです。誘ってくれてありがとうね。

これは変なこだわりなんですが、いつか Crypto 問を Excel の表だけで解きたいという気持ちがあって、今回それができたので嬉しいです。Excel 関数の勉強になりました。

20歳になった

成人して人に成ったあとは成仏して仏になるそうですね。

直近の進路

今いる高専の専攻科に進みそうです。なので少なくとも、もう2年くらいは学生をしています。専攻科に行きたいのは("専攻科に" 行きたいわけじゃないんだけど……)研究たのしかったら院に行きたいからで、本当は大学編入したかったんですが、経済的理由からです。実際専攻科に行く人はそういう理由が多いとか。指導してくれる先生からも手厚いサポートがいただけるようで大変助かります。

けんきうは、大きい枠組みでいうと自然言語処理、小さい枠組みでいうと文章から感情に関する情報を得る、というものです。文系の人たちもやっているテーマを、計算機をフル活用した観点で(プログラミングの力でガッと)やろうとしています。

けんきうでやりたいことはもう 1 つあって、既存の実験では C++ とか Python とかで実装されているものが多いのですが、自分はこれをRuby でどこまでやれるかやってみたい。RubyKaigi で PyCall の話を聞いてわくわくした気持ちが忘れられないのと、大変お世話になっている言語だからです。Python と比べるとまだ重いしライブラリも少なくて実用的とは言い難い面もあるけど、いずれ commit したり何かしらお礼がしたい。言語処理100本ノックを Ruby でやったのもそういう意図があるからでした。

yamasy1549.hateblo.jp

就職までまだ数年ありますが、もうちょっと力つけて今度は研究やる系のインターンにも行きたいな〜と考えてます。

19歳のときやったこと

  • プログラミング言語かるた
    • 企画・デザイン・宣伝とか全部セルフでやる同人な感じのは初めてなので、たのしい
    • 大量生産ってすごいなって思いました
    • ご支援ありがとうございます。いま絶賛入稿データと格闘中です
  • プログラミングを少し休憩しようと思った
    • いやそもそも俺のやってるこれはプログラミングなのか? 設定ファイルを書いているのでは??
    • すぐ新しい技術に目が流れてしまって、本質を見失うことが多くなった
    • アウトプットや勉強会への参加が目に見えて減ったけど仕方ない
  • ビタミン C タブレットを食べ過ぎると体調を崩すことを知った
    • 美味しいのでつい食べ過ぎる
  • フードファイト的な
    • 二郎系は噛むことを諦めて飲み込むと良い
    • CoCo壱番屋の 10 辛は先にルーを飲んでから白米を食べると、口が痛くならない
    • 野菜は水の代わりになる、予めサラダを頼んでおき、水を飲むとお腹が膨れるので喉が渇いたらそれを食べる
  • ひたすら歩く
    • 手書きのちょっと古い看板とか見ながら歩くやつ楽しい
    • 北へ向かうと人間が少なくなるので良い

20歳がんばりたいこと

  • 4月に入って学校始まってから体調崩しっぱなしなので、なんとか治ってほしい
    • これのせいでなかなかお仕事に手をつけれていないので(本当にごめんなさい……)
    • だいたい帰って飯と風呂して即寝てるんですが、それでも厳しい
  • 子供っぽい言動をやめる
    • 座ってる時に足をぶらぶらさせるのとかね
    • 企業Tシャツ+タイツ+ショートパンツの小学生スタイル、やめどきがわからんね
  • 映像をやる
    • せっかく Adobe CC 契約してんだから AE 使おうな!!
  • 無理をしない
    • 無理をしたら皮膚が緑色になるとか、外見からして分かるような変化がほしいね
  • kosen14s の人たちと何かやりたい
    • 高専へ2014年に入学したオタクたちと同人誌作ったり開発合宿したり、いろいろしたい
  • もっと家系ラーメンを広める

いつもの

http://amzn.asia/59a4x7C

睡眠ログをとりたいので、ウェアラブル歩数計が一番欲しいです。

オススメのお酒があればこのハッシュタグで教えてもらえると嬉しいです。できるだけ試してみたいです。

twitter.com