からだの症状
似たような症状が出ていて、回復した人がいたらどうやったのか教えてほしい。
4月ごろから調子がおかしくなって、波はあれどしんどい状態が続いているので、その様子を記録しておこうと思う。 病院で診断を受けたわけでもないし(「頭痛ですねーお薬出しておきます」くらい)生活に支障が出てきたのも数ヶ月前からなので、まだなんともいえない。
時々心配してくれる人がいるのに症状をうまく説明できないのがもどかしいので、今度からはこのURLを貼って説明に代えたい。でも読むのめんどくさそう。
睡眠障害
- 4月半ばから {漠然とした不安感, 頭痛} で寝付けなくなった
- 明日もこのしんどさと過ごさないといけない、寂しい、誰かと話をしていないと気が狂いそうだ
食欲の減退
- 時々、食欲はあるのに喉が絞まって口に入らないことがある
- 調子のいいときは以前のようにフードファイトできるが、基本的に少食になった
疲労感・倦怠感
以下のことが同時に、突然起こる。頻度は多いときで数時間ごと、少ないときで数日ごと。
- 肩が重くなる。腕に力が入らず手を上げにくい
- 体が震える
- みぞおちを押されて吐きそうになる感覚
- 喉が絞まって息苦しい、吐きそうになる感覚。ヒステリー球ぽい?
- 頭痛(症状は色々)
- 締め付けられるような痛み
- 脳みその中心だけ 5Gくらいかかっているような重さ
- 脳みそが半分になったみたいに、あるいは寒天になったみたいに、ぼーっとして思考が長続きしない
- ときどき熱っぽい
- 気圧が下がると↑の5倍増しくらいにひどい
こんなんと毎朝戦ってたんだから布団から出られるわけない、4〜5月に学校を休むことが多かったのはそのせい。
5月末ごろからからだの症状は比較的マシになって(それでも頭痛やヒステリー球は苦しい)、原因はこころのほうにあるのかなぁ……といった感じがしている。ググったら自律神経失調症が引っかかったけど、どうもすぐに治るわけでもなさそうで厳しい。
SECCON BeginnersCTF 2018 Writeup (Crypto - Streaming)
プログラムを書くのが苦手な 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 にしている- の形で新しい乱数を生成している
最初の seed はでかすぎて、残念ながら知りようもありません。
次に漸化式を見るとこれは線形なので周期性を持ち(擬似乱数列)、 しているので周期は高々 (34607)と分かります。Excel で =MOD((37423*A1+61781), 34607)
のようにしてみると実際に確認できます。このことから、一番最初の seed が分からなくても、任意の に対する が分かれば帰納的に を知ることができます。
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"
について例を示します。
encrypted
→ chr1
chr2
16進数を10進数に直してやればいいので chr1 = HEX2DEC("ce") = 206
chr2 = HEX2DEC("1e") = 30
です。
chr1
chr2
→ a
a = chr1 + chr2 * 256
の関係があるので a
が復元できます。206 + 30 * 256 = 7886
です。
a
→ random
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
さて、現在分かっている値は以下の通りです(灰色は固定値)。ここからint
→ hex
→ flag
の順に求めていきます。
random
と a
が既知なので、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文字を読みます。
できました。線形合同法は値を予測されやすいから乱数としてはあまり良くないよ、ということみたいです。
感想
過去何回か CTF に参加して {1, 2} 問解けたり解けなかったりしていて、今回初めて Writeup というかメモを公開しました。途中参加だったのでこの問題しか解けてないんですが、前に興味持って調べてた乱数の知識がちょっとだけ活用できて楽しかったです。誘ってくれてありがとうね。
これは変なこだわりなんですが、いつか Crypto 問を Excel の表だけで解きたいという気持ちがあって、今回それができたので嬉しいです。Excel 関数の勉強になりました。
20歳になった
あと10日くらいで成人して人に成ります
— やましー (@yamasy1549) April 15, 2018
成人して人に成ったあとは成仏して仏になるそうですね。
直近の進路
今いる高専の専攻科に進みそうです。なので少なくとも、もう2年くらいは学生をしています。専攻科に行きたいのは("専攻科に" 行きたいわけじゃないんだけど……)研究たのしかったら院に行きたいからで、本当は大学編入したかったんですが、経済的理由からです。実際専攻科に行く人はそういう理由が多いとか。指導してくれる先生からも手厚いサポートがいただけるようで大変助かります。
けんきうは、大きい枠組みでいうと自然言語処理、小さい枠組みでいうと文章から感情に関する情報を得る、というものです。文系の人たちもやっているテーマを、計算機をフル活用した観点で(プログラミングの力でガッと)やろうとしています。
けんきうでやりたいことはもう 1 つあって、既存の実験では C++ とか Python とかで実装されているものが多いのですが、自分はこれをRuby でどこまでやれるかやってみたい。RubyKaigi で PyCall の話を聞いてわくわくした気持ちが忘れられないのと、大変お世話になっている言語だからです。Python と比べるとまだ重いしライブラリも少なくて実用的とは言い難い面もあるけど、いずれ commit したり何かしらお礼がしたい。言語処理100本ノックを Ruby でやったのもそういう意図があるからでした。
就職までまだ数年ありますが、もうちょっと力つけて今度は研究やる系のインターンにも行きたいな〜と考えてます。
19歳のときやったこと
- プログラミング言語かるた
- 企画・デザイン・宣伝とか全部セルフでやる同人な感じのは初めてなので、たのしい
- 大量生産ってすごいなって思いました
- ご支援ありがとうございます。いま絶賛入稿データと格闘中です
- プログラミングを少し休憩しようと思った
- いやそもそも俺のやってるこれはプログラミングなのか? 設定ファイルを書いているのでは??
- すぐ新しい技術に目が流れてしまって、本質を見失うことが多くなった
- アウトプットや勉強会への参加が目に見えて減ったけど仕方ない
- ビタミン C タブレットを食べ過ぎると体調を崩すことを知った
- 美味しいのでつい食べ過ぎる
- フードファイト的な
- 二郎系は噛むことを諦めて飲み込むと良い
- CoCo壱番屋の 10 辛は先にルーを飲んでから白米を食べると、口が痛くならない
- 野菜は水の代わりになる、予めサラダを頼んでおき、水を飲むとお腹が膨れるので喉が渇いたらそれを食べる
- ひたすら歩く
- 手書きのちょっと古い看板とか見ながら歩くやつ楽しい
- 北へ向かうと人間が少なくなるので良い
20歳がんばりたいこと
- 4月に入って学校始まってから体調崩しっぱなしなので、なんとか治ってほしい
- これのせいでなかなかお仕事に手をつけれていないので(本当にごめんなさい……)
- だいたい帰って飯と風呂して即寝てるんですが、それでも厳しい
- 子供っぽい言動をやめる
- 座ってる時に足をぶらぶらさせるのとかね
- 企業Tシャツ+タイツ+ショートパンツの小学生スタイル、やめどきがわからんね
- 映像をやる
- せっかく Adobe CC 契約してんだから AE 使おうな!!
- 無理をしない
- 無理をしたら皮膚が緑色になるとか、外見からして分かるような変化がほしいね
- kosen14s の人たちと何かやりたい
- 高専へ2014年に入学したオタクたちと同人誌作ったり開発合宿したり、いろいろしたい
- もっと家系ラーメンを広める
いつもの
睡眠ログをとりたいので、ウェアラブル歩数計が一番欲しいです。
オススメのお酒があればこのハッシュタグで教えてもらえると嬉しいです。できるだけ試してみたいです。