JOI2018/2019予選 参加記

開始前

・SSSS.GRIDMANを見る
・眠かったので音ゲーをして目を覚ます

1問目

・見る
・数学ゲーっぽくて嫌だなあとなる
・ログイン日数を固定するといい感じになるので、書く
・WA(は?)
・コードを睨むとオーバーフローしているので、直す
・AC(05:09)

2問目

・雰囲気からしてシミュレーションするだけでは
・書く
・AC(09:44)
・1問目の方が難しかった

3問目

・見る
・前から決められるなあとなる
・適当なDPを書く
・WA(は??)
・遷移をミスっていた
・AC(16:25)
・もっといい解法がありそう

4問目

・見る
・Employmentじゃーん
・下から見ていって、隣との関係を調べるだけでいい
・書く
・サンプルが合わない
・合う
・出す
・WA(は???)
・同じ高さのが隣り合ってるところがやばそう
・圧縮する
・AC(46:00)
・ボーダー400越えそうだなあとか思っていた

5問目

区間がいっぱいあるらしいのでとりあえず終点ソートを書く
・dp[i]:i番目にイルミをつけるときのiまでの美しさの和のMAX
・遷移させちゃいけない範囲を求めたいなあとなる
・終点ソートしたおかげですぐに求まる
・セグ木を貼る
・AC(80:37)
・実家のような安心感

6問目

・とりあえず6点を取る
・20分くらい座っているだけをする
・「挿入DP」というワードが降ってくる
ググる
O: 文字列 - Typical DP Contest | AtCoder
・勝ちを確信する
・解説記事を見る
・何もわからない
・何もわからない
・残り10分くらいで諦める
・記事を書き始める
・終了

感想

6問目難しすぎる
ボーダーが高そうで怖いです

picoCTF 2018に出た

10110点で終了時730位くらい。
Warmup以外について雑に書きます。

Forensics

Desrouleaux(150)

画像を見れば答えが分かるので答えていくだけ。もう少し問題が難しくなるとスクリプトを書いたほうがよさそう。

Reading Between the Eyes(150)

Hintsにあるように、PNGデコーダを使う。

admin panel(150)

Wiresharkで眺めているとadminのパスワードがFlagになっている。

hex editor(150)

vimで-bオプションをつけて開き、:%!xxd と入力するとhexdumpが表示される。
/picoCTF でファイル内を検索するとFlagが出てくる。

now you don't(200)

ペイントで塗りつぶしてみると、Flagが浮かび上がってくる。

Lying Out(250)

画像を見ると答えがわかるので答えるだけ。

What's My Name?(250)

大量のデータがあるので眺めてみると、ローカルIPアドレス同士で通信しているところが見つかる。そこにFlagがある。

LoadSomeBits(550)

バイナリを眺めると、最初の方にやけに1と0が並んでいる。ヒントと合わせて、Flagの形式になるように取っていくとできる。
スクリプト書いたら楽なんだろうけど手作業で求めてしまった。

General Skills

grep 1(75)

grepコマンドは使えますか?

net cat(75)

ncコマンドは使えますか?

strings(100)

stringsコマンドは使えますか?

pipe(110)

パイプって知ってますか?

grep 2(125)

grepコマンドは使えますか?(二回目)

Aca-Shell-A (150)

ls,whoami,cd,rm,cpコマンドは使えますか?

environ(150)

printenvコマンドは使えますか?

ssh-keyz(150)

Hintsにあるページを見たりググったりすると方法がすぐ見つかるのでその通りにやる。

what base is this?(200)

Pythonでどんな関数を使うと2進数や16進数を文字列に変換できるか調べ、その通りにやる。

you can't see me(200)

ls -a で隠しファイルを表示でき、-b で印字できない文字をエスケープしてくれるので、
あとはcat (エスケープされたファイル名)で中身を表示すればいい。

in out error(275)

言われたとおりに入力すると、怪しい文字列が大量に出力される。
よく見ると1文字おきにFlagっぽい文字が配置されているので、それを順に取っていくとFlagになる。

learn gdb(300)

GDBを使えと言われたのでGDBで開き、プログラムが終了する前にブレークポイントを置いてflag_bufの中身を確認する。

store(400)

コードを読むと買うflagの数をint型で受け取っているので、INT_MAXあたりの値を入れるとtotal_costが負数になり、balanceを増やせる。これでFlagを買うことができる。

Reversing

assembly-0(150)

結局戻り値(eax)=2つ目の引数(DWORD PTR [ebp+0xc])になるので。

assembly-1(200)

適宜命令を調べつつ処理を順に追っていくと分かる。

be-quick-or-be-dead-1(200)

どうやら処理を高速化すればいいらしい。calculate_keyという関数の逆アセンブルを読むと、0x6ff54b3dからインクリメントしていき、0xdfea967aと等しくなるまでループを続けている。これでは間に合わないので、加算する値を0x1bなどに変更して実行するとFlagが表示される。
radare2が無限に便利だった。

assembly-2(250)

これも処理を追っていくだけ。

Radix's Terminal(400)

radare2で解析すると、Base64エンコードされたように見える文字列が見つかるのでデコードするとFlagになる。

assembly-3(400)

引数のスタックへの積み方への理解が甘く、手で計算できなかったため、main関数を書いて実行できるようにした。

Cryptography

caesar cipher 1(150)

シーザー暗号なのでC++で全探索するコードを書いた。

caesar cipher 2(250)

1との違いはアルファベット以外もあるくらいで、これを考慮して全探索すれば解ける。

rsa-madlibs(250)

RSA暗号の勉強になる問題。
調べつつ、言われた通りに解いていくとFlagとRSA暗号の知識が得られる。うれしい。

Safe RSA(250)

eの値が3と小さいので、Low Public Exponent Attackができる。
暗号文の3乗根を求めるだけで復号できる。
誤差がつらかったのでPythonのDecimal型を使って計算した。

Super Safe RSA 2(425)

今度はeの値が大きいので、Wiener's Attackができる。
数学ができないのでまだよく理解できてない...

Web Exploitation

Inspect Me(125)

とりあえずF12を押してみるとFlagのような文字列がHTMLのコメントに見つかる。
3つに分かれてるので全部見つけてくっつける。

Client Side is Still Bad(150)

コードを眺めるとパスワードの認証がそのまま書いてある。

Logon(150)

覚えてない1(ごめんなさい

Irish Name Repo(200)

SQLインジェクションができないか試そうと「' OR 1=1 --」を入力したらいけてしまった。

No Login(200)

Cookieをいじれる拡張を入れてadmin=Trueにしたらいけた。

Secret Agent(200)

ChromeのNetwork conditionsからUseragentをGooglebotにしたらいけた。

Buttons(250)

HTMLをいじってButton2をButton1と同じ形式にする。

The Vault(250)

覚えてない2(ごめんなさい

Binary Exploitation

buffer overflow 0(150)

覚えてない3(ごめんなさい

buffer overflow 1(200)

win()のアドレスを調べ、vuln()の戻りアドレスがそれになるようにバッファオーバーフローさせる。

leak-me(200)

nameをオーバーフローさせるとpasswordが手に入るので、それを利用してログインする。

感想

こうして見ると自明以外全然解けてない...

CyberRebeat CTFに出た

結果

f:id:TA1SA:20180909162803p:plain
2506pts/37位
解ける問題は全部解けたのでよかった(?)

解けた問題について

Simple Binary(Binary)

実行しても何も出力されないので、main関数の最後の方にブレークポイントを置いてみる。
rdiの辺りのメモリを覗いたら出てきた。

Rotation(Crypto)

シーザー暗号っぽいのでCRCTF{}の形式になるよう適当に変換するとFlagが出てくる。

Readme(Misc)

画像をダウンロードして開くと読みにくい文字が出てくる。アルファベットとして読むとFlagになる。

Calculation(Programming)

接続すると計算式が出てくる。
最初は自動でやろうと頑張っていたけど諦めてコピペでやることに。
Pythonの対話型シェル(?)に投げると一瞬で答えが帰ってくるのでそれを繰り返す。

Prime Factor(Programming)

どうやら「整数Nの素因数の中で最大のもの」を求めればいいらしい。
C++で√Nまで探索するコードを書いてそれに投げる。

Visual Novels(Programming)

明らかにナップザック問題だが入力形式が謎。scanfで読み取ろうとして詰まった。
2次元DP。

Tweet(Recon)

公式ツイッターにFlagが載っている。

CyberRebeatScripts(Recon)

githubでコミット履歴を見るとFlagがある。

Change History(Recon)

消されたコミットの中身を見る問題っぽい。
APIから調べたが、issueを見れば良かったらしい。

Secret.pdf(Stegano)

開くと「FLAG is」と黒塗りの文字が出てくる。
黒塗り部分を選択して適当な場所にコピペするとFlagが出てくる。

Monero(Trivia)

Twitterで少し前にcoinhiveが話題になってましたね。

Crossword(Trivia)

クロスワードパズル。
Flagに関わる部分は公式サイトを漁っていたら解けた。

White Page(Web)

見えなくなっているフォームを入力できるようにしたい。
Chromeで開いてF12を押し、デベロッパーツールを開いて「style="visibility:hidden"」の部分を消すとフォームが出てくる。
そこに問題文にあったIDとパスワードを入れればFlagが出てくる。

Let's Tweet!(Web)

ページを開くとツイートボタンがある。問題名のようにそこからツイートし、そのURLを貼り付けるとFlagが出てくる。

感想

まともにCTFに出たのはこれが初めてだったけど、多分初心者向けだったからか楽しめた。
Revを解けるようになりたい。
あと題材のゲーム面白そう。