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を使って復号した.
Misc
Readne
画像が渡されるが,ぱっと見で日本人には読めないフォントで書かれているのはわかったので,ググって見ながらFLAGを出した.
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した.
終わり
一人だったけどそれなりに頑張れて楽しかった.結構ゲームの宣伝感が強かったけど面白そうだったので金があればやってみようかなと思う.