CyberRebeatCTFに参加した(WriteUp)

はじめに

CyberRebeatCTFに参加しました.元々は一人で参加する予定でしたが,始まってから友人を誘いましたが彼は早々に諦めたので実質一人でした.

 

結果ですが,22位でした.一人だった割に頑張ったと思います.(多分)  

ということで,WriteUpを書きました.

 

Binary

SimpleBinary

fileコマンドで見た所LinuxのバイナリっぽかったのでUbuntu(WSL)で実行した.けれど特に何も出てこなかった.

なので,radare2でバイナリ解析したりしながら,gdbで実行し,main関数終了手前でブレークしたらFLAGがレジスタに入ってた.

 

crackme

fileコマンドで確認したらARMのバイナリだったので,qemu-user-staticとかで実行したら,Usageが出てきたので実行時引数に適当な文字を入れたらWrong!だった(当たり前).radare2でバイナリを見てるとflag.encryptedとかいう文字列をいじいじしているのが見えたのでflag.encryptedを見たらCRCTFに変換できそうな先頭をしていたので書き出して変換するスクリプトを書いた.

enc = [
0xb0,
0xa1,
0xb0,
0xa7,
0xb5,
0x88,
0x9b,
0x96,
0x9f,
0x9f,
0x9c,
0xac,
0xc7,
0x81,
0x9e,
0xac,
0x84,
0x9c,
0x81,
0x9f,
0x97,
0xd2,
0x8e,
]

key = 0x0c
ff = 0xff

for e in enc:
    print chr(e^key^ff)

 

Crypto

Rotation

問題文に文字が書いてあるけどぱっと見でROT13とかのシーザー的なやつだと思ったので適当に回したらFLAGが出てくる.問題文もそうだしね.

 

FLAG.encrypted

public-key.pemとFLAG.encryptedの2つのファイルが渡される.まあ,どうせRSAだと思ったのでRsaCtfToolを使って復号した.

github.com

 

Misc

Readne

画像が渡されるが,ぱっと見で日本人には読めないフォントで書かれているのはわかったので,ググって見ながらFLAGを出した.

nlab.itmedia.co.jp

 

Programming

Calculation

与えられた所にncすると計算式が出てくる.これに何回か答えたらFLAGが出てくるというやつだった.

前にも解いたことのある感じだったので適当にスクリプトを書いた.

from pwn import *

rm = remote("59.106.212.75", 8080)

res = rm.recv(2046)

while True:
    res = rm.recv(2046)
    print res

    rm.sendline(str(eval(res)))

FLAGが出てきたら無理やる止まるけど解けたらいいでしょ()

 

Prime Factor

これもncすると数字が出てくる.これの最大の素因数を答えていくものだった.

これも上と同じように書いた.

from pwn import *
import sympy

rm = remote("59.106.212.75", 8081)

res = rm.recv(2046)

while True:
    res = rm.recv(2046)
    print res
    f = sympy.factorint(int(res))
    print sorted(f.keys())[-1]
    rm.sendline(str(sorted(f.keys())[-1]))

 

Visual Novels

ncすると色々値が帰ってくるがナップサック問題を解く感じだった.ナップサック問題とかの実装があるライブラリを使って解いた.送られてきたデータをパースするのがめんどくさかった.(多分使い慣れていないから)

from pwn import *
from ortoolpy import knapsack

rm = remote("59.106.212.75", 8082)

res = rm.recv(2046)

flag = True
while True:
    res = rm.recv(2046).decode("utf-8")
    print(res)
    out = res.split("\n")
    # print(out)
    if flag:
        p = int(out[1].split()[-1])
    else:
        p = int(out[0].split()[-1])
    # print(out[3:-3])
    if flag:
        size = [int(e.split()[0][1:-1]) for e in out[3:-3]]
        print(size)
        weight = [int(e.split()[1][:-2]) for e in out[3:-3]]
        print(weight)
        flag = False
    else:
        size = [int(e.split()[0][1:-1]) for e in out[2:-3]]
        print(size)
        weight = [int(e.split()[1][:-2]) for e in out[2:-3]]
        print(weight)
    result = int(knapsack(size, weight, p)[0])
    print(result)
    rm.sendline(str(result))
    res = rm.recv(2046)
    print(res)

Recon

Tweet

Let's check our official twitter account!と書いてあったのでCyberRebeat (@CyberRebeat) | Twitterに行ったらFLAGがツイートされていた.

CyberRebeatScripts

Do you know Github?と言われたので探すとGitHub - ennach/CyberRebeatScripts: CyberRebeat's script filesこんなのがあった. 色々見たら最新のcommitのコメントがdelete FLAGだったのでhistoryを見たらFLAGがあった.

ChangeHistory

I changed my history on Github!と書いてあった.これもgithubかと思いながら探すとGitHub - ennach/ChangeHistory: CyberRebeat's scripts 2がある. これはなかなか分からなかったけど,issueのコミットハッシュをURLで指定すれば消されたcommitが見られるので終わり.

Stegano

Secret.pdf

FLAGが黒塗りにされたpdfが渡される,これは黒塗り部分をコピペすればできる.簡単

Alpha

画像が渡される.タイトルからpng画像のalpha値に隠されていると思ったけどうまいことできなかった. けど,色々した後alphaの再開ビット抽出の2値画像でFLAGがわかった.

Trivia

Monero

「仮想通貨Moneroの採掘スクリプトで,逮捕された人もいる」みたいなことが書かれているのでcoinhiveだと思って,これがFLAGだった.

Crossword

最初どうやって解くんだこれ?ってなったけど問題ミスでクロスワードの問題txtが最初なかった.けど,出てきてからは普通にググりながら解くだけだった.答えに直接関わらない埋めにゲーム内容が強かった(解いてないけど).

Web

White page

与えられたページに行くとボタンだけがあった.なので,ブラウザの開発者ツールを開いたらidとpasswordのフォームが不可視になっていたのでstyleを消して問題文のid,passwordを入力すればFLAGが出てくる.この問題も最初ミスってたぽい.

Let's Tweet!

与えられたページに行くとTweetしてね感があるページにだった,ツイートしてそのURLを入力してねって感じだった.与えられたコードを見ると#CyberRebeatCTFのハッシュタグを確認してるぽかった.まあ,普通にツイートしてURLを入力したらFLAGが出てきた. この問題も最初ミスってた.

Uploader

与えられたページに行くと.検索用の入力フォームとログイン用のフォーム,そしてuploadされたファイルのリストがあった. まずsqlインジェクションかなと思って' OR 1=1 --を検索用の所に入力したらsecret.zipが出てきた.これを落としてunzipしようとしたらpasswordが要求された.さらに問題文にあったid,password(guest)でログインすると,sample.zipのパスワードがあった.このことからsecret.zipをアップロードしたharadaのパスワードがわかればいい.なのでsqlmapを使って.sqlインジェクションしてDBのtable求めてtableをdumpした.

github.com

終わり

一人だったけどそれなりに頑張れて楽しかった.結構ゲームの宣伝感が強かったけど面白そうだったので金があればやってみようかなと思う.