読者です 読者をやめる 読者になる 読者になる

学生を終えました

高校生活が終わりました

これまで3年間高校生として生きてきましたが、もう卒業式をして、高校生じゃなくなりました。

一年前、高校二年次までは進学校に入っていたため、「高校が終わったら大学に進学するもの」かと思っていました。

今となっては、いろいろなことがあったため、進学校ではない学校に進学し、来年からは社会人として、社会の人とバチバチのバトルを繰り広げないといけないらしいです。

高校三年生としての一年間は、おそらく二年次時点では全く想像のできないほど濃度の高い、充実した一年間だったと思います。そもそも生き方がだいぶ変わったわけだし当たり前なんですが・・・

高校三年生

僕はこの一年間、ずっと東京に通うような一年間をしていました。
この一年でいろんなことを学び、来年度からはインターネットサムシングな会社で働こうと思っています。

学んだことはインターネットとかプログラミグユとかのことだけじゃなくて、遊び的なこともちょっとだけ含んでるんですが、それはまたいつか自分のためにもまとめたいと思います。

他にも学んだことはあって、例えば一年間は寮で暮らしていたのですが、やはり誰か(例えば家族)と一緒に生活するというのがとんでもなく貴重で、重要だということもなんとなく理解できました。
誰かが生活している音というのは、自分の生活リズムを整える上でとても重要なものでした。

というか、一年間こういう生活させてもらったっていうことが本当に贅沢だったのに、それでもたまに連絡してくれたり、仕送りをくれたりしたり、一言で済ませないくらい感謝の気持ちです。

なんでこんなに自分に尽くしてくれるのか、本当に不思議ですが、それが親なのでしょうか。

ご飯を作ってくれる親は偉大でした。

新しい生活の不安

これから自分は寮生じゃなくて、ほんとに一人暮らしになってしまいます。

ご飯

寮のときは朝と夜のご飯を作ってくれるので、起きることと寝ることを制御すれば他はどうにかなるような生活だったのですが、これからは自分でご飯も作らないといけなくなってしまいます。

自炊とかしたことないので、すごい楽しみなんですけど、絶対めんどくさいだろうなので嫌です。

というかたぶん一日一食が増える。どうにか一日三食やっていきたい。

働き

自炊がめんどくさいのもそうなんですけど、会社で仕事してから家に帰れる自信もそんなにないです。
めっちゃつかれそうだし、すごくつらそうだしめんどくさそう。

でも働くことに関してはお金がたくさんもらえるので、どうせ大変ならそれ以上に頑張って金を大量に生み出したいです。

金がたくさんあったら金の力が使えそうだし、そのうち金で黙らせることを覚えたいなと思っています。

まあどのみち頑張っていろんな力をつけたいです。

自分は恵まれている

きっかけを作ってくれた前の学校の方々、全方面の支援をしてくれた家族、教えてくれた先生方、一緒に高まった生徒の方々、SNSとかで自意識を満たしてくれた方々、いくらでも連ねていくことができるのですが、この一年だけでも大量の人の支援があると実感でき、認識できた一年でした。

これからも僕は頑張っていきます。すべての方に何かの形で恩返しをしていきたい。

a

このくらい意識が高く、気色の悪いポエムが書けるくらいには感謝しています。みなさんありがとうございました。これからもよろしくお願いします。

朝起きる方法ついて少しだけ

 

おそらく自分は夜型で、ちょっと気を抜くとすぐに寝る時間が後ろ倒しになっていってしまう。

 

長期の休みの時は大体04:00〜05:00くらいに寝始めることが多く、起きる時間は14:00〜15:00くらいで、平均で10時間近く寝てしまう。

長期の休みでないにしても、休日は平日の疲れからなのか、12時間〜13時間くらい寝てしまうことも珍しくない。

しかし、半日寝たとしても、行動する時間はいつもと変わりないのである。

そのため、23時に寝始めて11時に起きたが次に寝る時間は4時になるとか、4時に寝始めて15時に起きたが次に寝る時間は5時になるとか、そんなことで結局月曜日に起きるのは16時でした〜なんてことが繰り返されてしまう。

 

前までは家族がいたため、家の中に響く生活音等のおかげで遅くに寝始めたとしても07:00くらいには起きることができていたのだが、一人暮らしを始めてからは、どうにも自分の眠気に甘えてしまい、そのまま寝過ごしてしまう。

 

そんな感じでいつも朝起きれないのだが、これは基本的によくないことであり、昼型人間の多い社会においては「生活のリズムが崩れている状態」である。

 

例えば、コアタイムのない裁量労働制を取り入れている会社だったら、「昼過ぎ出社して夜遅くに帰る」ような自分のタイプに合わせた生活をおくることができるだろう。

しかし、そんな会社そうそうあるわけもなく、結局は自分が頑張って治すしかない。

 

考えることはたくさんあるが、今回は「遅刻する」ということに絞って考える。これを解決したい。

 

実は、朝、どうにか起きてしまってから行動を開始さえすれば、体は無理にでも活動を開始してくれて、「遅刻する」ことはなくなるのだ。

 

朝起きてればいいのだから、起きる時間が極端に遅くなった日には作業をし続けながら次の朝を待つ、いわゆる「オール」をすることでも解決できる。

大抵何かの作業をしていれば、体は起きようとしてくれるので、行動の質が落ちようともなんとか頑張りをみせることが出来る。しかも、帰ったら眠いのでいい時間に寝始めることが出来る。

自分の場合、オールをしようとすることで何が起こるかというと、出発する前くらいの時間帯で寝始めてしまうのだ。

どうやら自分の体は眠気にとても弱いらしく、眠気があるとすぐに寝てしまう。

 

 

次にどうするかを考えた時、とにかく寝てしまえばいいのだということに気づいた。

夜起き続けてる時というのは、基本的に作業をし続けている時だというのが自分で、本当に何もしなければ、やることがなく寝てしまうのではないか?と考えた。

一日中寝ることができる自分にとっては、この方法も考えられる選択肢の一つなのだろうが、作業は大体楽しいもので、途中で区切るには何らかの強い理由がないといけないだろう。

 

他の選択肢を模索していると、薬に頼るというものが出てきた。

薬は万能で、服用するだけで大体はその効果が現れてくれるが、一方で、薬に頼ってしまうことが悪いことのように思えてしまう筋もある。

自分の場合は、一回リズムを整えれば、その後数日気をつけるだけで昼型のような生活リズムに端正できるらしく、そのきっかけづくりとして薬を服用してしまうくらいだったら、体にもそんなに負担をかけないだろうし、問題が少ないのではないか?と認識している。

実際に今さっき服用した状態なのだが、だいぶ久々の服用であり、もう薬の効果が見え始めているようだ。今日は17時に起きたので、とても都合がいい。

 

僕の中では「薬に頼る」という選択肢は悪いものではなく、それなりに考えれば充分ありえる選択肢だと思っている。

今回はこんな終わり方になってしまうが、この話題については継続して考えていきたい。

フォーンプラグとかいうやつについて

はじめに

使ってたヘッドフォンの左が急に死んだ

急過ぎるし、綺麗に聞こえなくなったので、ヘッドフォンの故障かと不安になったが、ケーブルを変えたらすぐ治った
リケーブル万歳!!!!!

そのときに気づきがあったのでまとめておく

フォーンプラグとかいうやつ

ヘッドフォンは線を変えたら普通に使えるようになったので、気になって調べたときにわかったことをまとめる

フォーンプラグとは

3.5mmとか2.5mmのいつも使ってるような音のケーブルの端子をフォーンプラグと言うらしい

3.5mmのものを「ミニ」、2.5mmのものを「マイクロ」、たまに見るような6.5mmのでかいやつは「標準」と呼ばれるらしい

極について

プラグ部分に入っている黒い横線+1をした数が極の数で、モノラルのものだと黒い横線は1本だけ入っており二極、ステレオだと三極、マイクがついてるやつとかは四極だったりする

それ以上に横線が入ってるものもあるらしい

今回の故障原因は、単純に使っていたケーブルの左担当が断線していただけっぽい

f:id:naari_3:20170107054926j:plain

上が三極で下が四極

四極について

四極のマイクがついてるやつについては、CTIAというものとOMTPというものの二つの規格があり、CTIAが最近の主流らしい

これについて面白いことを見つけたんだけど、例えばリケーブルできるヘッドフォンを使っている場合、CTIAを採用していてそれ自体にマイクがついているようなケーブルがあったら、そのケーブルを使うことで、マイク付きのヘッドフォンみたいな感じになるってことに気づいた

お手軽ヘッドセットの完成だ
リケーブル万歳!!!!!

iPhone買ったときについてくるイヤフォンのマイクみたいなイメージ

AKG-Y55についてきたケーブルがそんなケーブルだった

あと、ちゃんと調べてないんだけど、曲の再生/停止を切り替えたりするボタンがついてるケーブルとかも四極っぽいし、CTIAの規格に準じたものなのかもしれない

以上

TornadoとWebSocketとふれあう

前回の↓の記事の続きです。

naari.hatenablog.com

今回はTornadoを使い、WebSocketともふれあいます。

TornadoとWebSocket

WebSocket

WebSocketはHTTPとは違うプロトコルで、HTML5から使えるようになったらしいです。

双方向通信が可能で、Ajaxとは違い、一度コネクションを貼るだけで全てのデータの送受信が可能になります。

Tornado

前回の記事でも書きましたが、TornadoはノンブロッキングなWebフレームワークです。

非同期処理をさせるならTornadoが向いてるので、今回はTornadoでやっていこうと考えました。

今回作るアプリ

今回作ろうと思うものはWebSocketを使ったチャットですが、なんかつまらないので、受信した日本語の文字を形態素解析し、文節ごとに空白を挟んでからみんなに送信するようなものにしたい思います。

コードを書く

こんな感じで書きました。

# -*- coding: utf-8 -*-
import os
import random

from pypugjs.ext.tornado import patch_tornado

import tornado.httpserver
import tornado.ioloop
from tornado import template
import tornado.web
import tornado.websocket
from tornado.web import url

patch_tornado()

from janome.tokenizer import Tokenizer
import json


class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("index.pug")


class TokenizeHandler(tornado.websocket.WebSocketHandler):

    users = set()

    def open(self):
        self.users.add(self)
        print('Session opened by {}'.format(self.request.remote_ip))

    def on_message(self, message):
        message = json.loads(message)
        t = Tokenizer()
        tokens = t.tokenize(message["text"])
        message["text"] = ""
        for token in tokens:
            message["text"] += "{} ".format(token.surface)
        for user in self.users:
            user.write_message(message)

    def on_close(self):
        self.users.remove(self)
        print('Session closed by {}'.format(self.request.remote_ip))

class Application(tornado.web.Application):
    def __init__(self):
        BASE_DIR = os.path.dirname(os.path.abspath(__file__))
        handlers = [
            url(r'/', IndexHandler, name='index'),
            url(r'/tokenize', TokenizeHandler, name='tokenize'),
        ]
        settings = dict(
            template_path=os.path.join(BASE_DIR, 'templates'),
            static_path=os.path.join(BASE_DIR, 'static'),
            debug=True,
        )
        tornado.web.Application.__init__(self, handlers, **settings)


if __name__ == '__main__':
    app = Application()
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(8000)
    tornado.ioloop.IOLoop.instance().start()

tornado.websocket.WebSocketHandlerを継承している、TokenizeHandlerが今回の主役です。

openメソッドはコネクションが確立したときに発火されるもので、on_messageメソッドはクライアントからのメッセージ受信時、on_closeメソッドはコネクションが閉じられたときに発火されるものです。

ユーザーからのテキストの形態素解析には簡単に使用できて手軽だったJanomeを使用しました。

ailaby.com

ハンドラーの中にusersという集合を設け、コネクションが来たらそのコネクションを追加しています。

誰かの発言を受け取ったところで処理をし、集合の中身をfor文で回して全員にテキストを送っています。

そんなTokenizeHandler/tokenizeで待ち受けておくというコードになっています。

また、write_messagesメソッドなんですが、文字列でないものが渡るとjsonの形になおしてから送ってくれるようです。便利ですね。

これだけです。とても簡単に書くことが出来ました。

あとはこれをクライアント側で受け取るコードを書くのですが、今回は割愛します。あとでgithubリポジトリを貼るので気になる方はそっちで見て下さい。

f:id:naari_3:20161205004034p:plain

おわりに

今回のGithubリポジトリです。Helloworldは前回の分です。

github.com

とても簡単にWebSoketのサーバーを書くことが出来ました。

便利な上にきれいなコードになるTornadoですが、けっこういい印象を持つことが出来ました。

小規模なアプリ開発でもTornado使ってしまっていいんじゃないか?と思えるくらいいい感じです。

他にもTornadoにはログイン処理に関する機能だったり、ログだったり、多機能かつ高機能らしいです。

またいろいろ使ってみてもいいかなーと思えました。

Tornadoとはじめてふれあう

そいえばブラウザを介したWebSocketでの通信ってあまりやってなかったなーと思って、いろいろ調べてるうちにTornadoがよさそうだなと思って、まずはHello Worldからやりました。

Tornadoとは

ここによると、

Apache Licence 2.0に基づくオープンソースのノンブロッキングなWebサーバ&Webフレームワーク

  • ノンブロッキングI/O
  • リアルタイム性
  • シンプルなテンプレート
  • シングルスレッド、シングルプロセス

だそうです。

先程も書きましたが、ノンブロッキングI/Oな感じならばWebSocketにも向いてるんじゃないか?と考え、Tornadoを選んでいます。

インストール

$ pip install tornado

Hello World

# -*- coding: utf-8 -*-
import tornado.ioloop
import tornado.web


class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")


application = tornado.web.Application([
    (r"/", MainHandler),
])

if __name__ == "__main__":
    application.listen(8000)
    tornado.ioloop.IOLoop.instance().start()

そしてhttp://localhost:8000/にアクセスします。

f:id:naari_3:20161204230226p:plain

ハンドラーを継承して書いていくからか、きれいなコードにまとまりました。多分大規模な開発に向いてるんだろうなと思います。flaskやbottleとの違いですね

テンプレートにレンダリング

この前触り始めたばかりですが、僕はPugが好きです。閉じ忘れが無くなったり、見やすくなったりでいいことが多かったです。

なので、テンプレートにはPugを使おうと思います。

pypugjsを使う

$ pip install pypugjs

github.com

PythonでPugをレンダリングするライブラリです。

PyPugJS is a high performance port of PugJS for python, that converts any .pug source to the each Template-language (Django, Jinja2, Mako or Tornado).

さまざまなPythonのWebフレームワークに対応しているようです。

Append this after importing tornado.template

from tornado import template
from pypugjs.ext.tornado import patch_tornado
patch_tornado()

とても手軽にPugを使う準備が出来ました。

実際に使う

書いてみると、こんな感じになりました。

# -*- coding: utf-8 -*-
import os
import time

from pypugjs.ext.tornado import patch_tornado

import tornado.ioloop
import tornado.web

from tornado import template

patch_tornado()


class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("index.pug", nowtime=time.time())


application = tornado.web.Application([
    (r"/", MainHandler),
    ],
    template_path=os.path.join(os.getcwd(), "templates"),
    static_path=os.path.join(os.getcwd(), "static"),
)

if __name__ == "__main__":
    application.listen(8000)
    tornado.ioloop.IOLoop.instance().start()
// templates/index.pug
doctype html
html(lang="ja")
  head
    meta(charset="utf-8")
    style(src="{{ static_url('css/style.css') }}")
    title render test
  body
    h1.sitettl Hello World 2
    main.main
      h2.content_ttl あ
      span {{ nowtime }}

{{}} で囲んだ変数名の部分に埋め込まれます。

{{ static_url('file/to/path') }} で静的なファイルの場所を示すことが出来ます。

f:id:naari_3:20161205003928p:plain

まとまった感じがして好印象が持てました。

おわりに

flaskやbottleと違い、ハンドラーを継承して書いていくので、大きなものを作るとしたらとても作りやすそうです。

今回のソースコードはこちらに置いてあります。↓

github.com

次の記事ではTornadoを使い、WebSocketで通信する予定です。

naari.hatenablog.com

pipの9.0.0でた eggが非推奨になりました 他いろいろ

追記

2016/11/08 訳されていなかった文章を訳しました。(pip downloadの追加オプションについての項)

pip 9.0.0

pyenvで新しい仮想環境作ってpip使った時に教えてくれました。
興味あったしどういう変更があったか調べました。

2系とのお別れの日が近づいている

[Distutils] Released: pip v9.0.0

どうやら9.x系がPython2.6に対応する最後のバージョンになるらしいです。

  • The 9.x series will be the last pip versions to support Python 2.6.

更新点一覧

Release Notes — pip 9.0.1 documentation

  • このバージョンより前には後方互換性がなくなります。
    自動検出をしないので、egg使いたい時は#egg=ってちゃんと書かないといけなくなりました。

  • pip install --eggが非推奨なものになった上に、そのうちegg自体の機能が削除されるようになるらしいです。
    eggはpipの他の機能のメリットをぶち壊すようなデメリットをたくさん持ってるから、だそうです。

  • pip checkという、インストールされているパッケージの依存関係をチェックしてくれるコマンドが標準でインストールされるようになりました(PR #3750)。

  • pipコマンドの操作中で既にファイル/ディレクトリが存在する際、ユーザーの操作を中止させることができるオプションが追加されました。

  • Appveyor CIが追加されました。(?)

  • インストールするパッケージが既に存在しているパッケージの場合、既存のパッケージをアンインストールするようになりました(#1548)。

  • pip showのデフォルトの表示がすっきりしました。–verboseオプションをつけるといつもどおりになります。(PR #3858)

$ pip show flask
Name: Flask
Version: 0.11.1
Summary: A microframework based on Werkzeug, Jinja2 and good intentions
Home-page: http://github.com/pallets/flask/
Author: Armin Ronacher
Author-email: armin.ronacher@active-4.com
License: BSD
Location: ふぁいるtoぱす
Requires: click, Werkzeug, Jinja2, itsdangerous
  • pip listのフォーマットに新しいフォーマットcolumnsが追加されました(#3651)。
$ pip list --format columns
Package       Version
------------- -------
click         6.6    
Flask         0.11.1 
itsdangerous  0.24   
Jinja2        2.8    
MarkupSafe    0.23   
mecab-python3 0.7    
pip           9.0.0  
requests      2.11.1 
setuptools    18.2   
Werkzeug      0.11.11
  • また、pip listのデフォルトのフォーマットであるlegacyが非推奨になり、そのうちデフォルトのフォーマットがcolumnsに切り替わるそうです。
$ pip list
DEPRECATION: The default format will switch to columns in the future. You can use --format=legacy (or define a list_format in your pip.conf) to disable this warning.
  • pip list--not-requiredという、依存関係にないもののみを表示するようなオプションが追加されました。
$ pip list --format columns
Package       Version
------------- -------
click         6.6    
Flask         0.11.1 
itsdangerous  0.24   
Jinja2        2.8    
MarkupSafe    0.23   
mecab-python3 0.7    
pip           9.0.0  
requests      2.11.1 
setuptools    18.2   
Werkzeug      0.11.11

$ pip list --format columns --not-required
Package       Version
------------- -------
Flask         0.11.1 
mecab-python3 0.7    
pip           9.0.0  
requests      2.11.1 
setuptools    18.2   
  • ビルド時にシンボリックリンクとかの相対的なファイルパスではなく、os.path.realpathを使った絶対的なファイルパスを使用するようになりました(PR #3701)。(これ訳自信ない)

  • pip freezeの回帰修正: 1つより多い数のgitのremoteがある場合、リモートの名前がoriginのものを優先するようになりました(PR #3708, #3616)。

  • pip freezeした時、おかしい(invalidな)requirementのものがあるときにクラッシュする問題が修正されました(PR #3704, #3681)。

  • 複数のファイルにpip freezeした結果を分割して書き出せるようになりました(PR #3703)。(ここ訳自信ない)

  • pep-503 data-requires-pythonを実装しました。

  • pip wheelがeditable packagesとしても動くようになりました。このおかげでeditable requirementsの場合にpip freezeにwheelの実行結果が使えるようになりました(PR #3695, #3291)。

  • .netrcファイルから証明書(credential)を読み込むようになりました(PR #3715, #3569)。

  • pip download--platform--python-version--implementation--abiが追加されました。
    これらのオプションで、utilitiesとadvanced usersは今pipが動いている環境用ではないディストリビューションを収集することができるようになります(PR #3760)。(訳自信ない)

  • venv/bin/pythonシンボリックリンクを持っていてもvirtual envの環境のスキャンをしなくなりました。

  • fish-shellの補間に対応しました。

  • Windows上のPython2にて、ユーザー名もしくはホスト名がnon-ASCIIな文字を含んでいた時の問題を修正しました(#3463, PR #3970, PR #4000)。

  • git fetch --tagsでtagをfetchするようになりました。ブランチにないコミットまたはタグがrequirementのurlとして指定されたとき用(PR #3791)。(これまじで自信ない)

  • pip showでパッケージ名を正規化するようになりました(#3976)。

  • Requires-Pythonが実行しているPythonのバージョンと食い違っている場合または--ignore-requires-pythonオプションが付けられていない場合Raiseするようになりました(PR #3846)。

  • へんなケース(corner case)でアップグレードを実行した時、正確なインストールされたバージョンを報告するようになりました(#2382)。

  • pip searchにおいて、--index-iという簡略記法を追加しました。

  • 必要に応じてCの依存関係を読み込まないようになりました(#1840, #2930, #3024)。

  • SVNのurlにおいて、認証部分(ユーザーネーム、パスワードの部分)をカットするようになりました(PR #3697, #3209)。

  • --targetオプションをつけることでplatlib内にもインストールするようになりました(PR #3694, #3682)。

  • pip freezeで作成されたrequirements.txtにコメントをつける機能を復元しました(#3680)。(ここ訳自信ない)
    (requirements.txtにコメントできないようにしたものを出来るようになおしたのかもしれないです。)

  • --default-vcsオプションが非推奨になりました(#4052)。

基本的に心配な和訳能力なので、違うような部分がありましたらぜひとも教えていただきたいです。

所感

pipっていつも使ってるものだから、むしろ更新にあまり気を取られなかったけど、今回みたいに更新点とかしっかり把握したほうがより親身になるんだろうなって思いました。

pip listにフォーマットがあること知らなかったし、pip downloadpip showにおいては存在すら知らなかったし、結構勉強になりました。
pip showの便利感がすごい。

あと多分pip list --format=freeze --not-requiredするとrequirements.txtの記述もスッキリするんじゃないかって思いました。それが良いかどうかは置いときます。

CTF for ビギナーズ 2016 東京 自分がやった分 write-up

CTF for ビギナーズ

CTF for ビギナーズは、コンピュータセキュリティ技術を競う競技であるCTF (Capture The Flag) の初心者を対象とした勉強会です。本勉強会では、CTFに必要な知識を学ぶ専門講義と実際に問題に挑戦してCTFを体験してもらう演習を行います。

自分は東京の勉強会に参加してきました。

write-up

フラグは全て ctf4b{EXAMPLE} のような文字列でした。

Warmup

Welcome (10 pts)

問題文にあるフラグが答えでした。

Misc

CountUp Game (200 pts)

[Never say 21 game]
Rule:   1.Count up numbers alternately.
        2.Don't say 21(lose)
        3.When you win to me 10 times continuously, you can get a flag.

ncコマンドで繋げたサーバーと対話し、1,2,3のどれかを入力することができ、10回連続で勝つことができればフラグを取得することができます。

3つまで数字をカウントできるよくやったあのゲームです。

まず必勝法なのですが、今回は後攻でした。このルールの場合、後攻は全てのターンで4の倍数で数え終え続けることができれば必ず勝つことができます。
もっと単純に言うと、4 - 相手の出した数字の数 だけ数えあげれば勝つことができます。

[相手 : 1, 2, 3] [自分 : 4] [相手 : 5, 6] [自分 : 7, 8] [相手 : 9] [自分 : 10, 11, 12] [相手 : 13, 14, 15] [自分 : 16] [相手 : 17, 18] [自分 : 19, 20] [相手 : 21]

今回は10連続勝利ということで、必要な連続勝利回数もそんなに多くなく、自分は自分の手で10回勝ってしまいました。

自分の環境だけかもしれないけど外とネットで繋げなかったからncと繋ぐいい方法を調べられなかった。しっかり準備しておきたい。

You Win!

Congratz! flag is "ctf4b{7h3_51mpl3_numb3r_pl4y}"

てけいさん for ビギナーズ (200 pts)

1桁と1桁の四則演算を100回繰り返す問題でした。

最初はn + m、その後何問目かからn - m、さらに何問目かからはn * mというようになっていました。除算についてはしっかり確認してませんでした。ないかもしれないしあるかもしれない。

これはタイプミスのことを考えると、毎回手計算しているとどこかでミスりそうな気がしたので、Python3でスクリプトを組みました。

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup

url = 'http://172.20.1.30/php_math/index.php'

s = requests.session()

req = s.get(url)
for i in range(103):
    soup = BeautifulSoup(req.text, "lxml")
    atags = soup.findAll("a")
    a0 = int(atags[0].text)
    a1 = int(atags[1].text)
    div = soup.find("div").text
    if "+" in div:
        ans = a0 + a1
    elif "-" in div:
        ans = a0 - a1
    elif "*" in div:
        ans = a0 * a1
    elif "/" in div:
        ans = a0 / a1
    else:
        print(soup)
    print(ans)
    req = s.post(url, data={"answer": ans})

何故100回以上回しているのかについては、100回回した後の挙動がわからなかった(意地悪なことをしてくるかもしれない)ため、-iをつけ実行後にインタラクティブモードに入り、その後の操作で柔軟に対応しようと考えたからです。

あまりよくないかもしれないし、もっといい方法があれば知りたい。

実行すると、100回回した後にエラーが吐き出され、インタラクティブモードに入りました。

>>> soup
<html><body><p>正解flag is ctf4b{85806158171ced5f3ccb7aca56a7a574f6dd8af8}</p></body></html>

Web

Fix it (100 pts)

問題文のURLにブラウザでアクセスすると、「どこかミスっててうまく動かない」みたいなことを言っていました。

chromeのdevtoolsを開き、リクエストに対するレスポンスを見てみると、Locatin:という値があり、そこにアクセスした後のページだったか、その値がフラグでした。

ctf4b{Locatin_is_typo_of_Location}

Can you login as admin? (200 pts)

adminとしてログインすることが目標の問題でした。

よく見かけるような簡単なSQLインジェクションのようでした。

クエリ文を直接.で繋げている?のかはわかりませんが、ID: adminPASS: ' or 1 = 1 'で通りました。

FLAG is ctf4b{SQLiNjec7ion_foR_beGInNer}

1M4G3 V13W3R (200 pts)

画像のアップローダーがあり、

  • 画像をアップロードすること
  • 画像を閲覧すること

ができるWebサービスが題材の、典型的なディレクトリトラバーサルの問題でした。

画像をクリックすると、http://172.20.1.60:31337/web200-2/view.php?file=b452a2840a43b8f3.jpgのような形のアドレスに飛び、画像が表示されます。

本日の勉強会で習ったように、とりあえずindex.phpを表示させようとしました。

http://172.20.1.60:31337/web200-2/view.php?file=../index.php

すると、思惑通りindex.phpの内容が表示された気がして、たしかフラグが表示されたと思います。

ctf4b{path_trav3rsal_1s_the_r3al_fun}

Binary

Plain (100 pts)

Plainという名前からして、stringsだろうなと思い、かけてみるとフラグが出てきました。

$ strings ./bin100

反省

f:id:naari_3:20161022225446p:plain

合計で1010点でした。

f:id:naari_3:20161022225345p:plain

順位表では21位で、18位の方まで1010点だったので、そんなかんじです。

Forensicsの分野を1問も解けませんでした。 Find key1に関しては、一番上と一番下のフラグが偽物っぽかったので、似ているhttpリクエスト全てを偽物だと判断してしまいました。 Find key2は、zipファイルの取り出しまではできたのですが、その後2.pcapの中での立ち振舞いがクソでした。

運営の方がくれたwrite-upが素敵でした。

また、binaryのPlainの解説をしたので本をもらいました。

デバッガによるx86プログラム解析入門【x64対応版】

デバッガによるx86プログラム解析入門【x64対応版】

最近CTFを初めた自分にとって、基礎固め的な意味でとてもいい勉強会でした。

次はSECCONのオンライン予選です。記念として参加しようと思っています。チームメンバーがいないので誰か一緒に出ましょう。