オイオイオイ書くわアイツ

ほうクソブログですか……たいしたものですね

`git rebase -i` と `git commit —fixup`

  • 概要
  • はじめに
  • 前提知識: GitHub を用いた共同開発
  • git rebase
    • きたないコミットログ
    • きれいなコミットログとgit rebase -i
  • git commit --fixup
  • おわりに

概要

f:id:Tak_Yaz:20171101032932p:plain

続きを読む

TypeScript で少し快適に JavaScript を書こう

  • 概要
  • はじめに
  • TypeSript の基礎の基礎
  • D3js でみる型検査のありがたさ
  • おわりに

概要

TypeScript はね、よいよ。

続きを読む

25分でわかるポモドーロ・テクニック 大学生活を添えて

  • これはなに?
  • はじめに
    • 計画的に勉強ができて成績も良い人へ
    • 計画的に勉強ができなくて成績があまり良くない人へ
    • それら以外の人へ
    • 本記事中の図について
    • まじめに
  • ポモドーロ・テクニックとは
    • ポモドーロ・テクニックのはじめかた
    • 自分を知るということ
      • プランニング
      • ラッキング
      • レコーディング
      • お仕事をゲームみたいにしていこう!
  • 大学生活と自己管理
    • 徹夜病の根絶
    • 卒業研究とポモドーロ
  • さいごに
  • おまけ 実際に使っているツールとサービス
続きを読む

C 言語しか触ったことない人向け JavaScript 入門

概要

  • 詳しいドキュメントはここ -> JavaScript | MDN
  • console.log(hoge) を使え
  • オブジェクトは便利
  • ファーストクラス関数を使いこなせるようになれ
続きを読む

AtCoder Beginner Contest 045 D 問題

勉強を兼ねて AtCoder Beginner Contest 045 の D 問題を解いたので、解くまでの経過も兼ねてメモ代わりに記事にしておきます。

abc045.contest.atcoder.jp

問題概要

白黒で塗りつぶされたマス目を、 3 * 3 の9マス領域を一纏まりとして走査していき、9マス中何マスが黒になっているのかを数え上げる問題です。

続きを読む

AtCoder Beginner Contest 046 D 問題

CTF と並行して、 AtCoder の問題によるアルゴリズムの勉強も習慣にしておこうと思っているので、先日解いた AtCoder Beginner Contest 046 D 問題について簡単な解答をまとめておきます。

abc046.contest.atcoder.jp

問題概要

グーとパーだけで行われ、かつグーを出した回数だけパーを出せるようなじゃんけんについての問題です。このじゃんけんで、相手の出す手が全てわかっている状態で、勝敗によって点数が1点ずつ上下する n 回勝負を行った場合に取りうる得点の最大値を求めます。

解答

答えから言ってしまうと、グーとパーを交互に出すことで得点が最大化されます。このじゃんけんは要するに「相手より何回パーを多く出したか」というのがそのまま得点数になり、したがって相手の出す手が何であれとにかくパーを多く出せば良いからです。

したがって、解答は以下のようなコードになります。

T = input()
A = ["gp"[i%2] for i in range(len(T))]
A = "".join(A)

point = 0
for t,a in zip(T,A):
    if t == "g" and a == "p":
        point += 1
    elif t == "p" and a == "g":
        point -= 1

print(point)

実際に解答に至るまでの諸々

これだけで話を終わらせてしまうのも味気ない(上に記録として全く意味を為さない)ので、実際に解答に至るまでにどのようなことをしたのかについて述べて記事を終わらせようと思います。

流れとしては、

  1. テストセットを生成するスクリプトを書く
  2. テストセットについて、(自分の手元で)得点数・それまでに出したグーとパーの数などの遷移を書き出す
  3. 最終的にパーを使い切っているものが得点を最大化する(ように見える)ことに気がつく

という手順で問題を解きました。数学的センスや知識があるともう少しきれいな手順で解けるかとも思います。勉強を積んだときにこの記事を読み返して自分で振り返ることが出来ると幸いです。

以下はテストセットを生成するスクリプトです。

import random
import itertools
import functools

def valid(testset):
    results = []
    for i in range(len(testset)+1):
        num_g = len(list(filter(lambda c: c is "g", testset[:i])))
        num_p = len(list(filter(lambda c: c is "p", testset[:i])))
        results.append(num_p <= num_g)
    return functools.reduce((lambda a,b: a & b), results)

def solve(testset):
    answers = []
    for answer in itertools.product("pg", repeat=len(testset)):
        if not valid(answer):
            continue
        point = 0
        for (T, A) in zip(testset, answer):
            if T == "g" and A == "p":
                point += 1
            elif T == "p" and A == "g":
                point -= 1
        answers.append((point, "".join(answer)))
    return max(answers)



testsets = []
for length in range(3,10):
    for i in range(100):
        testset = [("g","p")[random.randint(0,1)] for _ in range(length)]
        testset = "".join(testset)
        if testset not in testsets:
            testsets.append(testset)
testsets = filter(valid,testsets)

for t in testsets:
    print(t, solve(t))

ksnctf Sherlock Holmes writeup

ksnctf.sweetduet.info

問題

指定された英文を出力する、 perl で書かれたページをクラックする問題です。上部のメニューをクリックすると、 index.pl/{ファイル名} という形式のアドレスにアクセスしてテキストを表示させていることがわかります。ここで index.pl/index.pl にアクセスをすることで、サーバ上で動いている perlスクリプトを確認することができました。

表示されるスクリプトの内問題になるのは以下の2つの部分です。

# Can you crack me? :P
open(F,'cracked.txt');
my $t = <F>;
chomp($t);
if ($t eq 'h@ck3d!') {
print 'FLAG_****************<br><br>';
}
unlink('cracked.txt');
####
open(F,substr($ENV{'PATH_INFO'},1));

my $cgi = new CGI;
$cgi->charset('utf-8');
while(<F>) {
chomp;
s/FLAG_\w+/FLAG_****************/g;
print $cgi->escapeHTML($_)."<br>\n";
}

知識

1つ目の部分から、 index.pl と同じディレクトリに h@ck3d! という内容の cracked.txt が存在する時、フラグを出力していることがわかります。この問題では、サーバをクラックして cracked.txt をサーバ上に作成することが目的になります。

そのために重要になってくるのが2つ目の部分です。perl の open 関数には | ls -la のように、 | を渡されるとその後の文字列を OS コマンドとして実行するという問題があります*1

解答

これを利用して、 index.pl/ 以下に url エンコードで OS コマンドを与えることで、 cracked.txt を作成することができそうです。 以下のアドレスにアクセスした後、もう一度どこかのページを表示すれば、フラグが出力されます。

index.pl/%7Cecho%20h%40ck3d%5C%21%20%3E%20cracked.txt