この記事はCTF Advent Calendar 2019の23日目の記事です。
はじめに
この記事は「2019年のpwn問を全部解くチャレンジ【前半戦】」の続きで、解く対象の問題も前の記事と基本同じです。 が、ちょっと条件を追加します。
- javascriptや独自vm、コンパイラ、インタプリタ等のpwnは対象外
- C / C++ / asm製に限定し、Rustなどは対象外
pwn初めて1年目なので分際をわきまえて単純なユーザーランドpwnに集中します。
【追記(2019/12/04)】残ってる問題を紙に書き出してみたのですが、1日1問やっても終わらないです。体力的・精神的な限界が来ているので以下の問題は解かずに供養します。
- scanner [0CTF/TCTF]
- cppp, SPlaid Birch, Suffaring, Spectre [PlaidCTF]
- Capacity Oriented Vector [TSG CTF]
- Ramen [Harekaze CTF]
- ascii_shop, raddest_db [Facebook CTF]
- rms-fixed, Trusted Loading, Trusted Loading 2 [Dragon CTF]
- BabyFactory [PwnThyBytes CTF]
- SecPwn, Machbook, securenote [BalsnCTF]
- Lazy House, Netatalk [HITCON]
- Silk Road II, Double Cream, Silk Road III [ASIS CTF]
- MicroServiceDaemonOS, JIT, Regex [Google CTF]
- Mimic_note [De1CTF]
- regfuck [Chaos Communication Camp]
- caidanti, faX senDeR, Mop, anti-anti-virus, Dezhou Instrumentz, Across the Great Wall, accessible, Appetizer [Real World CTF]
- はじめに
- 問題の傾向
- おすすめ問題
- 解いた問題とwriteup
- ■ WCTF 2019 ONLINE
- ■ InnoCTF International 2019
- ■ peaCTF 2019
- ■ CyBRICS CTF Quals 2019
- ■ ByteCTF
- ■ De1CTF 2019
- ■ Crypto CTF 2019
- ■ RedpwnCTF 2019
- ■ Saudi CTF
- ■ HackCon 2019
- ■ Chaos Communication Camp 2019
- ■ PASECA CTF 2019
- ■ Codefest CTF 2019
- ■ TokyoWesterns CTF 5th 2019
- ■ Affinity CTF 2019 - Quals
- ■ Trend Micro CTF 2019 - Raimund Genes Cup - Online Qualifier
- ■ DefCamp CTF Qualification 2019
- ■ Timisoara CTF 2019 Quals
- ■ CSAW CTF Qualification Round 2019
- ■ Zia CTF 2019
- ■ Real World CTF 2019 Quals
- ■ Newark Academy CTF 2019
- ■ SEC-T CTF 2019
- ■ InCTF 2019
- ■ Dragon CTF Teaser 2019
- ■ PwnThyBytes CTF 2019
- ■ BSides Delhi CTF 2019
- ■ Balsn CTF 2019
- ■ Layer7 CTF 2019
- ■ Rooters CTF 2019
- ■ Square CTF 2019
- ■ Reply Cyber Security Challenge
- ■ HITCON CTF 2019 Quals
- ■ RoarCTF 2019
- ■ M*CTF 2019 Quals
- ■ CryptixCTF'19
- ■ SECCON 2019 Online CTF
- ■ Hack.lu CTF 2019
- ■ TastelessCTF 2019
- ■ BackdoorCTF 2019
- ■ Newbie CTF 2019
- ■ TCS Hackquest 4.0
- ■ Deloitte UK CTF Qualifier
- ■ Pwn2Win CTF 2019
- ■ RITSEC CTF 2019
- ■ TU CTF 2019
- ■ CTFZone 2019 Quals
- ■ watevrCTF 2019
- 感想
問題の傾向
本当は脆弱性とかセキュリティ機構とか集計していたのですが、知識が増えるにつれ脆弱性の名前が増えていったのでまとめにくくなってしまいました。 たくさん解いた感覚として、多い順に次のような脆弱性があったと思います。
- Stack Overflow
- Use After Free
- Double Free
- Off-by-one / Off-by-null
- Out of Bounds
- Format String Bug
- Heap Overflow
- Arbitrary Address Write (AAWが直接提供されている)
- Race Condition
セキュリティ機構は、次のような感じでした。
- ASLR: 観測した限り全問ASLR付き
- DEP: シェルコード系や初心者向け以外はDEP付き
- SSP: まちまち。Stack系は付いていないのも多いが、canary leakもちょくちょくあった。
- PIE: ヒープ系問題はかなり付いている。スタック系はまちまち。
- RELRO: まちまち。PIEが有効ならRELROも有効なことが多い。
- Fortify: checksec的にはPIE有効バイナリによく付いているが、fortifyを主点とした問題はなかった。
おすすめ問題
前半戦同様、半年分の問題を解いてみて面白かったものや難しかったものなどをGolden Flag Awards的にいくつか紹介したいと思います。
- Most Fun: notes [DefCamp CTF Qualification 2019]
- Most Innovative: Trick or Treat [HITCON CTF Quals 2019]
- Most Difficult: unprintable [De1CTF 2019]
- Most unexpected solution: SecureKarte [TokyoWesternsCTF 2019]
解いた問題とwriteup
■ WCTF 2019 ONLINE
BabyPwn
問題バイナリが見つかりませんでした。
■ InnoCTF International 2019
pwn問はありませんでした。
■ peaCTF 2019
pwn問はありませんでした。
■ CyBRICS CTF Quals 2019
oldmanStack
MSDOSなので対象外です。
■ ByteCTF
pwn問はありませんでした。
■ De1CTF 2019
中国謎フレームワークのCTFは難しい。 公式writeupもあるので素晴らしいですね。
A+B Judge
難易度:★☆☆☆☆ 概要:sandbox上でC言語が動かせる。が、実際にはsandboxがまともに働いておらず、system関数などが1/2くらいの確率で動く。
世の中に出回ってるライブラリを信用してはいけない。
Weapon
難易度:★★★☆☆ 概要:showが無いfastbinなヒープ問。chunk overlapでfreeした偽チャンクをunsorted binにつなげてstdoutをいじってlibc leakする。あとは普通にfastbin attackする。
これで2番目に簡単なpwnか......つらたん。
Mimic_note
諦め。
Unprintable
難易度:★★★★★ 概要:無理ゲーFSB問題。
端的に言って頭おかしい。
cloudmusic_rev
pwnじゃなさそう(?)なので対象外です。
BabyRust
Rustなので対象外です。
Race
Kernel問なので対象外です。
■ Crypto CTF 2019
pwn問はありませんでした。
■ RedpwnCTF 2019
zer0ptsで参加しました。pwnは普通に良かったですが、HARDMODEがクソだったので全体的な評価は下がりました。 でも無駄にstripしていないところや、大きいバイナリはソースコードを付けてくれているところは良かったです。
BabbyPwn
難易度:★☆☆☆☆ 概要:ncするだけ。
やるだけなのでwriteupは書きません。
HARDMODE
難易度:★☆☆☆☆ 概要:いままで見たpwn問のなかで1位を争うクソ問
ncするとシェルが貰えるのでcat flag.txtすればフラグが表示されます。
cat: flag.txt: No such file or directory
と表示されるのでそれがフラグです。(は?????)
Rot26
難易度:★☆☆☆☆ 概要:FSBがあるので用意された関数に飛ばせば良い。
Bronze Ropchain
難易度:★★☆☆☆ 概要:static linkなバイナリにgetsのStack Overflowがあるので、ROPでシェルを起動する。mprotectからのシェルコード実行の方が楽。
なんかゴリ押したけどもっと楽な方法ありそう。
Zipline
難易度:★★☆☆☆ 概要:Stack Overflowでグローバル変数を書き換える問題。
Stop, ROP, n', Roll
難易度:★★☆☆☆ 概要:ret2csuでsyscallを呼び出す問題。
Dennis Says
難易度:★★☆☆☆ 概要:任意アドレス書き込みがあるので、GOT overwriteしてlibcリーク&シェル取得。
Black Echo
難易度:★★★☆☆ 概要:blind pwn問。FSBがありそうなのでバイナリをリークし、適当にlibcのバージョンをguessしてシェルを取る。
Knuth
難易度:★★★☆☆ 概要:x86のascii shellcode問。送ったシェルコードがところどころnullで上書きされるので、適当に調節すれば良い。
penpal world
難易度:★★★☆☆ 概要:double freeとかuafがあるヒープ問。mallocされるサイズが固定なのでchunk overlapでチャンクのサイズを書き換えてfreeする。あとは__free_hookとかをsystemに変更すればOK。
Ascent to Kernel Land
Kernel問なので対象外です。
notepad--
packetからのBlind系ですが、サーバーが落ちているので解けません。
■ Saudi CTF
pwn問はありませんでした。
■ HackCon 2019
pwn問はありませんでした。
■ Chaos Communication Camp 2019
regfuck
面倒そうなので後回し。
core-pwn
Windows問なので対象外です。
pwning your kernelz
カーネル問なので対象外です。
hsmprototype
カーネル問なので対象外です。
■ PASECA CTF 2019
Genie
問題バイナリが見つかりませんでした。
■ Codefest CTF 2019
pwn問はありませんでした。
■ TokyoWesterns CTF 5th 2019
nothing more to say
難易度:★☆☆☆☆ 概要:やるだけなので特に言うことは無い。
printf
難易度:★★★☆☆ 概要:自作printf。%nが無いので処理の脆弱性を利用して_IO_jump_tなどを書き換える。
Asterisk-Alloc
難易度:★★★☆☆ 概要:reallocの性質を利用してdouble freeやtcache poisoningをする。Show系の機能が無いので_IO_2_1_stdout_でlibc leakする。
SecureKarte
難易度:★★★★☆ 概要:tcacheを追い出してfastbinを利用する。unsorted bin attackで偽のチャンクを作ってlockやlistを書き換えてFSBなどに持ち込む。
個人的に好きな問題です。
Multi Heap
難易度:★★☆☆☆ 概要:race conditionのUAF。
mi
難易度:★★★★☆ 概要:mimallocのpwn。mimallocの中身を読んで理解すれば解ける。
gnote
kernel exploitなので対象外です。
■ Affinity CTF 2019 - Quals
pwn問はありませんでした。
■ Trend Micro CTF 2019 - Raimund Genes Cup - Online Qualifier
Exploit 400 ChakraCore
問題バイナリが見つかりませんでした。
■ DefCamp CTF Qualification 2019
get-access
Blind問でサーバーが死んでるので解けません。
secret
難易度:★★☆☆☆ 概要:FSBでlibcリークしてStack Overflowでシェルを起動する。
crack-me username
Mac OSバイナリのため対象外です。
offensive honeypot
難易度:★★☆☆☆ 概要:randが予測できるので戦闘で勝ち続る。
pwnというよりはrev + miscみたいな感じですね。
notes
難易度:★★★☆☆ 概要:ヒープオーバーフローで関数ポインタを上書きする。ローカルバッファにROP chainを書き込みROPに持ち込む。
個人的に好きな問題です。脆弱性自体は簡単でしたがROPに持ち込むまでが大変でした。
■ Timisoara CTF 2019 Quals
Swag
問題バイナリが見つかりませんでした。
■ CSAW CTF Qualification Round 2019
全体的にちょうど良い難易度の良問ばかりで楽しかったです。
baby_boi
難易度:★☆☆☆☆ 概要:BOFでシェルを取る。
Got Milk?
難易度:★☆☆☆☆ 概要:GOTの下位1バイトを書き換える問題。
small_boi
難易度:★★☆☆☆ 概要:SROPで引数を設定してsyscallを呼ぶ。
Popping Caps
難易度:★★☆☆☆ 概要:tcacheの管理領域を破壊して__malloc_hookを書き換える。
traveller
難易度:★★★☆☆ 概要:OOBで頑張ってGOTを書き換える。
Popping Caps 2
難易度:★★☆☆☆ 概要:本当はヒープオーバーフローを使う。_dl_finiを利用して楽して解いた。
tvm
難易度:★★★★☆ 概要:VM問。rev以外の何者でもない。
チームメンバーがVMを完全解析してマクロまで作ってくれたので簡単でした。
Pop Goes the Printer
問題バイナリが見つかりませんでした。
■ Zia CTF 2019
pwn問がありませんでした。
■ Real World CTF 2019 Quals
むずそう。
caidanti (Flag 1)
諦め。
faX senDeR
諦め。
MoP
諦め。
anti-anti-virus
諦め。
caidanti (Flag 2)
諦め。
Dezhou Instrumentz
諦め。
Across the Great Wall
諦め。
accessible
諦め。
Appetizer
諦め。
■ Newark Academy CTF 2019
BufferOverflow #0
難易度:★☆☆☆☆ 概要:BOFでリターンアドレスを書き換えるだけ。
BufferOverflow #1
難易度:★☆☆☆☆ 概要:BOFでリターンアドレスを書き換えるだけ。
BufferOverflow #2
難易度:★☆☆☆☆ 概要:BOFでリターンアドレスを書き換えるだけ。
Format #0
難易度:★☆☆☆☆ 概要:FSBでフラグを読むだけ。
Format #1
難易度:★☆☆☆☆ 概要:FSBでGOTを書き換えるだけ。
Loopy #0
難易度:★★☆☆☆ 概要:BOFでlibc leakしてシェルを取る。
Loopy #1
難易度:★★☆☆☆ 概要:FSBで__stack_chk_failを潰してBOFでシェルを取る。
■ SEC-T CTF 2019
Baby0x01
難易度:★★☆☆☆ 概要:BOFでシェルを取る。
Baby0x02
難易度:★☆☆☆☆ 概要:任意ファイルが読めるのでflagを読み込む。想定解はたぶん/proc/self/cmdlineなどでパスを取得して絶対パスで読み込ませるまでやる。
lamehttpd
ARMなので対象外ですが競技中に解いたのでexploitコードはあります。 solver
rrop
難易度:★★★★☆ 概要:シードを決められるランダムで生成されたROP gadgetでROPする。
rrop_morr
難易度:★★★★☆ 概要:シードが時間で決まるランダムで生成されたROP gadgetでROPする。
blak flag
難易度:★★★☆☆ 概要:readやopen, execve系が禁止されたBOFでフラグを読む。readvやsendfileで解ける。
mirc2077
あとで解く。
■ InCTF 2019
warmup
Windows問なので対象外です。(解いたけど書くの面倒)
schmaltz
概要:libc-2.29のoff-by-null 難易度:★★★☆☆
■ Dragon CTF Teaser 2019
rms-fixed
問題バイナリが見つかりませんでした。
Trusted Loading
問題バイナリが見つかりませんでした。
Trusted Loading 2
問題バイナリが見つかりませんでした。
■ PwnThyBytes CTF 2019
Baby Factory
■ BSides Delhi CTF 2019
message_saver
難易度:★★☆☆☆ 概要:シンプルなUAF問。
notetaker
難易度:★★☆☆☆ 概要:シンプルなOOB問。
■ Balsn CTF 2019
やりたくないです。
KrazyNote
カーネル問なので対象外です。
SecPwn
諦め。
Machbook
OSXバイナリなので対象外です。
securenote
諦め。
■ Layer7 CTF 2019
韓国謎CTF。24時間の個人戦にしては量が多かったですがpwnは面白かったです。
How old are you?
難易度:★★☆☆☆ 概要:seccompがかかっているがopenatで開ける。
Angel-in-us
難易度:★★★☆☆ 概要:House of Orangeとscanfの性質で無理やりfreeした後heap overflowで_IO_2_1_stdoutを破壊してlibc leakする。
sha1 breaker
難易度:★★★☆☆ 概要:sprintfのoff-by-nullでROP chainを実行する。
math board
難易度:★★★☆☆ 概要:巨大な負の数を指定するとoobできるのでfdを使ってheap leakした後に偽の構造を作ってlibc leakをする。
■ Rooters CTF 2019
babypwn
難易度:★★☆☆☆ 概要:単純なStack Overflowでlibc leakしてシェルを取る。
Secure ROP
難易度:★★☆☆☆ 概要:SROPでシェルを取る。
xsh
難易度:★★☆☆☆ 概要:FSBでシェルを取る。
USER ADMINISTRAION
難易度:★★☆☆☆ 概要:buffer overreadでproc baseをleakした後GOT overwriteでFSBしてlibc leakし、シェルを取る。
GOT overwriteでFSBに持ち込む問題なぜか知らないけど好き。
ForkMeBaby
難易度:★★★☆☆ 概要:forkの子プロセスにスタックオーバーフローがあるのでcanaryをリークする。partial overwriteでwriteに飛んでproc baseを取った後普通にROPする。
fork自体のアイデアは簡単ですが、PIEをbypassするのが面白かったです。
■ Square CTF 2019
tcash
難易度:★★★☆☆ 概要:サイズ固定のヒープオーバーフロー。
Worldwide Highest Velocity
難易度:★★★★☆ 概要:サイズ固定のヒープオーバーフロー。`global_max_fast` を書き換えてfastbin attackする。
■ Reply Cyber Security Challenge
pwn問はありませんでした。
■ HITCON CTF 2019 Quals
良CTFですがちゃんと参加できなかったのでやっていき。
EmojiiiVM
独自VM問なので対象外です。
Trick or Treat
難易度:★★★☆☆ 概要:任意サイズをmallocしてそのアドレスをもらったあと任意バイトに2回qwordを書き込める。
知っていれば簡単ですが、知らなかったので面白かったです。
Crypto in the Shell
難易度:★★★☆☆ 概要:oobでいろんな領域を暗号化できる。
One Punch Man
難易度:★★★★★ 概要:unlinkやらhouse of loreやらで頑張る。
LazyHouse
諦め。
Netatalk
諦め。
dadadb
Windowsバイナリなので対象外です。
PoE I - Luna
カーネル問なので対象外です。
PoE II - Cord
カーネル問なので対象外です。
PoE III - TPU
カーネル問なので対象外です。
Breath of Shadow
カーネル問なので対象外です。
■ RoarCTF 2019
問題が登録されていませんでした。
■ M*CTF 2019 Quals
問題が登録されていませんでした。
■ CryptixCTF'19
pwn問はありませんでした。
■ SECCON 2019 Online CTF
one
難易度:★★☆☆☆ 概要:double freeがあるtcache問。サイズ固定+ポインタ1つまでなので頑張る。
Sum
難易度:★★☆☆☆ 概要:任意書き込みができる。
Lazy
難易度:★★☆☆☆ 概要:独自libcのBOF問。
remain
難易度:★★★☆☆ 概要:Show系が無いtcache問。UAFがあるがlibc-2.30でmalloc回数が制限されているので頑張る。
Monoid Operator
難易度:★★★☆☆ 概要:%nが使えないFSB。sprintfなのでバッファオーバーフローするが、canaryをTLSから取ってくる。
Mal
Rustが関与してるので対象外ということで。
■ Hack.lu CTF 2019
平日なので全然参加できませんでしたが、面白かったです。 公式がちゃんとwriteup出してるのも良いしwriteupにフィードバックくれたのも良かったです。
TCalc
難易度:★★★☆☆ 概要:oobのヒープ問。
Schnurtelefon
難易度:★★★★☆ 概要:UAF。サーバーとクライアントが分離しており面倒。
Chat
難易度:★★★☆☆ 概要:allocaで別スレッドのスタックを破壊する。
Baby Kernel2
カーネル問なので対象外です。
No Risc, No Future
MIPSバイナリなので対象外です。
■ TastelessCTF 2019
問題バイナリが見つかりませんでした。
■ BackdoorCTF 2019
baby tcache
難易度:★★☆☆☆ 概要:やるだけtcache問。
baby heap
難易度:★★★☆☆ 概要:global_max_fast系のfastbin問。showも無いのでついでにFILE streamでlibc leakする。
miscpwn
難易度:★★★☆☆ 概要:libc-2.28ではmalloc_hookからsvc_runを呼び出せばone gadgetが確実に動くという知識があれば簡単なmisc問。
reallocator
writeupが無い上方針が立たないので対象外です。
■ Newbie CTF 2019
python jail
難易度:★☆☆☆☆ 概要:importやevalなどがブラックリストで使えないpython。
babypwn
難易度:★☆☆☆☆ 概要:リターンアドレスを書き換えるだけのStack BOF。
Oneshot_Onekill
難易度:★☆☆☆☆ 概要:ROPでsystemを呼ぶだけのStack BOF。
dRop the beat
難易度:★★☆☆☆ 概要:ROPするだけのStack BOF。
revenge
難易度:★★★★☆ 概要:任意書き込みが1度だけできるstatic linkバイナリ。.fini_arrayを書き換えてROPに持ち込む。
他は鬼簡単でしたが、この問題は面白かったです。
■ TCS Hackquest 4.0
pwn問はありませんでした。
■ Deloitte UK CTF Qualifier
問題が登録されていませんでした。
■ Pwn2Win CTF 2019
Full tRoll
難易度:★★☆☆☆ 概要:Buffer OverreadでcanaryをリークしてStack Overflowでファイル名を書き換えてproc baseをリークする。
Random Vault
難易度:★★☆☆☆ 概要:FSBで関数ポインタを書き換えてシェルコードの断片に飛ばす。シェルコードの位置はrandで決まるので計算する。
■ RITSEC CTF 2019
jit-calc
難易度:★★★☆☆ 概要:即値やレジスタのみが指定できるx64の機械語実行プログラム。ret忘れを利用してシェルコードを実行する。
Bank
問題環境が再現できませんでした。
wumb0list
難易度:★★★★☆ 概要:バイナリの解析がひたすら面倒なだけで脆弱性は単にOOB。
■ TU CTF 2019
runme
難易度:☆☆☆☆☆ 概要:動かしたらフラグが出力される。
thefirst
難易度:★☆☆☆☆ 概要:シンプルなBOF問。
shellme32
難易度:★☆☆☆☆ 概要:BOFでシェルコードに飛ばす。
shellme64
難易度:★☆☆☆☆ 概要:BOFでシェルコードに飛ばす。
3step
難易度:★☆☆☆☆ 概要:若干小さいシェルコードを実行する。
leakalicious
難易度:★☆☆☆☆ 概要:BOFでシェルを取る。
pancakes
難易度:★☆☆☆☆ 概要:BOFでパスワードを取って再入力する。
printfun
難易度:★☆☆☆☆ 概要:FSBで入力とパスワードを空にしてstrcmpを通過する。
vulnmath
難易度:★☆☆☆☆ 概要:FSBでlibc leakしてシェルを取る。
ctftp
難易度:★☆☆☆☆ 概要:BOFでシェルを呼ぶ。
■ CTFZone 2019 Quals
Tic-tac-toe
難易度:★★★☆☆ 概要:まるばつゲームで、プログラムがpython製サーバーと通信している。単純なBOFがあるので100回勝つ状況をROPやシェルコードで再現して本体サーバーからフラグを貰う。
■ watevrCTF 2019
Voting Machine 1
難易度:★☆☆☆☆ 概要:Stack Overflow
Voting Machine 2
難易度:★☆☆☆☆ 概要:Stack Overflow
Club Mate
難易度:★☆☆☆☆ 概要:Integer Overflow
Wat-sql
難易度:★☆☆☆☆ 概要:エラーにより変数が設定されたままになるのでフラグが読める。
Betstar 5000
難易度:★★☆☆☆ 概要:FSBでヒープ上のポインタを書き換えてAAWを作る。
sabataD
難易度:★☆☆☆☆ 概要:globを使っているのでアスタリスクを使ってフラグを読む。
M-x 5x5
難易度:★★☆☆☆ 概要:Lights OutでStack Overflowがあるのでリターンアドレスをflipで書き換える。
Spott-i-fy
難易度:★☆☆☆☆ 概要:ログイン名にHeap Overflowがある。Reversingが大変なのでそれを乗り越えれば簡単。
Danish Blockchain
Rustなので対象外です。
感想
滑り出しは良かったんですが解けない問題が溜まるにつれて心的負担が大きくなりました。解くのよりもwriteupを書くのが正直大変でした。(特に参加したCTFで既に解いたものを書き直すのはつらすぎる。) 去年の今頃は簡単なROPこそできたもののヒープ系に関しては「???」という感じだったので、結果としてはやってよかったと思います。
体に悪いチャレンジだったので良い子のみんなは真似しないように。