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が手に入るので、それを利用してログインする。

感想

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