CTFするぞ

CTF以外のことも書くよ

2019年のpwn問を全部解くチャレンジ【後半戦】

この記事はCTF Advent Calendar 2019の23日目の記事です。


はじめに

この記事は「2019年のpwn問を全部解くチャレンジ【前半戦】」の続きで、解く対象の問題も前の記事と基本同じです。 が、ちょっと条件を追加します。

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]

問題の傾向

本当は脆弱性とかセキュリティ機構とか集計していたのですが、知識が増えるにつれ脆弱性の名前が増えていったのでまとめにくくなってしまいました。 たくさん解いた感覚として、多い順に次のような脆弱性があったと思います。

  • 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くらいの確率で動く。

世の中に出回ってるライブラリを信用してはいけない。

writeup

Weapon

難易度:★★★☆☆
概要:showが無いfastbinなヒープ問。chunk overlapでfreeした偽チャンクをunsorted binにつなげてstdoutをいじってlibc leakする。あとは普通にfastbin attackする。

これで2番目に簡単なpwnか......つらたん。

writeup

Mimic_note

諦め。

Unprintable

難易度:★★★★★
概要:無理ゲーFSB問題。

端的に言って頭おかしい。

writeup

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があるので用意された関数に飛ばせば良い。

writeup

Bronze Ropchain

難易度:★★☆☆☆
概要:static linkなバイナリにgetsのStack Overflowがあるので、ROPでシェルを起動する。mprotectからのシェルコード実行の方が楽。

なんかゴリ押したけどもっと楽な方法ありそう。

writeup

Zipline

難易度:★★☆☆☆
概要:Stack Overflowでグローバル変数を書き換える問題。

writeup

Stop, ROP, n', Roll

難易度:★★☆☆☆
概要:ret2csuでsyscallを呼び出す問題。

writeup

Dennis Says

難易度:★★☆☆☆
概要:任意アドレス書き込みがあるので、GOT overwriteしてlibcリーク&シェル取得。

writeup

Black Echo

難易度:★★★☆☆
概要:blind pwn問。FSBがありそうなのでバイナリをリークし、適当にlibcのバージョンをguessしてシェルを取る。

writeup

Knuth

難易度:★★★☆☆
概要:x86のascii shellcode問。送ったシェルコードがところどころnullで上書きされるので、適当に調節すれば良い。

writeup

penpal world

難易度:★★★☆☆
概要:double freeとかuafがあるヒープ問。mallocされるサイズが固定なのでchunk overlapでチャンクのサイズを書き換えてfreeする。あとは__free_hookとかをsystemに変更すればOK。

writeup

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

難易度:★☆☆☆☆
概要:やるだけなので特に言うことは無い。

writeup

printf

難易度:★★★☆☆
概要:自作printf。%nが無いので処理の脆弱性を利用して_IO_jump_tなどを書き換える。

writeup

Asterisk-Alloc

難易度:★★★☆☆
概要:reallocの性質を利用してdouble freeやtcache poisoningをする。Show系の機能が無いので_IO_2_1_stdout_でlibc leakする。

writeup

SecureKarte

難易度:★★★★☆
概要:tcacheを追い出してfastbinを利用する。unsorted bin attackで偽のチャンクを作ってlockやlistを書き換えてFSBなどに持ち込む。

個人的に好きな問題です。

writeup

Multi Heap

難易度:★★☆☆☆
概要:race conditionのUAF。

writeup

mi

難易度:★★★★☆
概要:mimallocのpwn。mimallocの中身を読んで理解すれば解ける。

writeup

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でシェルを起動する。

writeup

crack-me username

Mac OSバイナリのため対象外です。

offensive honeypot

難易度:★★☆☆☆
概要:randが予測できるので戦闘で勝ち続る。

pwnというよりはrev + miscみたいな感じですね。

writeup

notes

難易度:★★★☆☆
概要:ヒープオーバーフローで関数ポインタを上書きする。ローカルバッファにROP chainを書き込みROPに持ち込む。

個人的に好きな問題です。脆弱性自体は簡単でしたがROPに持ち込むまでが大変でした。

writeup

■ Timisoara CTF 2019 Quals

Swag

問題バイナリが見つかりませんでした。

■ CSAW CTF Qualification Round 2019

全体的にちょうど良い難易度の良問ばかりで楽しかったです。

baby_boi

難易度:★☆☆☆☆
概要:BOFでシェルを取る。

writeup

Got Milk?

難易度:★☆☆☆☆
概要:GOTの下位1バイトを書き換える問題。

writeup

small_boi

難易度:★★☆☆☆
概要:SROPで引数を設定してsyscallを呼ぶ。

writeup

Popping Caps

難易度:★★☆☆☆
概要:tcacheの管理領域を破壊して__malloc_hookを書き換える。

writeup

traveller

難易度:★★★☆☆
概要:OOBで頑張ってGOTを書き換える。

writeup

Popping Caps 2

難易度:★★☆☆☆
概要:本当はヒープオーバーフローを使う。_dl_finiを利用して楽して解いた。

writeup

tvm

難易度:★★★★☆
概要:VM問。rev以外の何者でもない。

チームメンバーがVMを完全解析してマクロまで作ってくれたので簡単でした。

writeup

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でリターンアドレスを書き換えるだけ。

writeup

BufferOverflow #1

難易度:★☆☆☆☆
概要:BOFでリターンアドレスを書き換えるだけ。

writeup

BufferOverflow #2

難易度:★☆☆☆☆
概要:BOFでリターンアドレスを書き換えるだけ。

writeup

Format #0

難易度:★☆☆☆☆
概要:FSBでフラグを読むだけ。

writeup

Format #1

難易度:★☆☆☆☆
概要:FSBでGOTを書き換えるだけ。

writeup

Loopy #0

難易度:★★☆☆☆
概要:BOFでlibc leakしてシェルを取る。

writeup

Loopy #1

難易度:★★☆☆☆
概要:FSBで__stack_chk_failを潰してBOFでシェルを取る。

writeup

■ SEC-T CTF 2019

Baby0x01

難易度:★★☆☆☆
概要:BOFでシェルを取る。

writeup

Baby0x02

難易度:★☆☆☆☆
概要:任意ファイルが読めるのでflagを読み込む。想定解はたぶん/proc/self/cmdlineなどでパスを取得して絶対パスで読み込ませるまでやる。

writeup

lamehttpd

ARMなので対象外ですが競技中に解いたのでexploitコードはあります。 solver

rrop

難易度:★★★★☆
概要:シードを決められるランダムで生成されたROP gadgetでROPする。

writeup

rrop_morr

難易度:★★★★☆
概要:シードが時間で決まるランダムで生成されたROP gadgetでROPする。

writeup

blak flag

難易度:★★★☆☆
概要:readやopen, execve系が禁止されたBOFでフラグを読む。readvやsendfileで解ける。

writeup

mirc2077

あとで解く。

■ InCTF 2019

warmup

Windows問なので対象外です。(解いたけど書くの面倒)

schmaltz

概要:libc-2.29のoff-by-null
難易度:★★★☆☆

writeup

■ Dragon CTF Teaser 2019

rms-fixed

問題バイナリが見つかりませんでした。

Trusted Loading

問題バイナリが見つかりませんでした。

Trusted Loading 2

問題バイナリが見つかりませんでした。

■ PwnThyBytes CTF 2019

Baby Factory

■ BSides Delhi CTF 2019

message_saver

難易度:★★☆☆☆
概要:シンプルなUAF問。

writeup

notetaker

難易度:★★☆☆☆
概要:シンプルなOOB問。

writeup

■ Balsn CTF 2019

やりたくないです。

KrazyNote

カーネル問なので対象外です。

SecPwn

諦め。

Machbook

OSXバイナリなので対象外です。

securenote

諦め。

■ Layer7 CTF 2019

韓国謎CTF。24時間の個人戦にしては量が多かったですがpwnは面白かったです。

How old are you?

難易度:★★☆☆☆
概要:seccompがかかっているがopenatで開ける。

writeup

Angel-in-us

難易度:★★★☆☆
概要:House of Orangeとscanfの性質で無理やりfreeした後heap overflowで_IO_2_1_stdoutを破壊してlibc leakする。

writeup

sha1 breaker

難易度:★★★☆☆
概要:sprintfのoff-by-nullでROP chainを実行する。

writeup

math board

難易度:★★★☆☆
概要:巨大な負の数を指定するとoobできるのでfdを使ってheap leakした後に偽の構造を作ってlibc leakをする。

writeup

■ Rooters CTF 2019

babypwn

難易度:★★☆☆☆
概要:単純なStack Overflowでlibc leakしてシェルを取る。

writeup

Secure ROP

難易度:★★☆☆☆
概要:SROPでシェルを取る。

writeup

xsh

難易度:★★☆☆☆
概要:FSBでシェルを取る。

writeup

USER ADMINISTRAION

難易度:★★☆☆☆
概要:buffer overreadでproc baseをleakした後GOT overwriteでFSBしてlibc leakし、シェルを取る。

GOT overwriteでFSBに持ち込む問題なぜか知らないけど好き。

writeup

ForkMeBaby

難易度:★★★☆☆
概要:forkの子プロセスにスタックオーバーフローがあるのでcanaryをリークする。partial overwriteでwriteに飛んでproc baseを取った後普通にROPする。

fork自体のアイデアは簡単ですが、PIEをbypassするのが面白かったです。

writeup

■ Square CTF 2019

tcash

難易度:★★★☆☆
概要:サイズ固定のヒープオーバーフロー。

writeup

Worldwide Highest Velocity

難易度:★★★★☆
概要:サイズ固定のヒープオーバーフロー。`global_max_fast` を書き換えてfastbin attackする。

writeup

■ Reply Cyber Security Challenge

pwn問はありませんでした。

■ HITCON CTF 2019 Quals

良CTFですがちゃんと参加できなかったのでやっていき。

EmojiiiVM

独自VM問なので対象外です。

Trick or Treat

難易度:★★★☆☆
概要:任意サイズをmallocしてそのアドレスをもらったあと任意バイトに2回qwordを書き込める。

知っていれば簡単ですが、知らなかったので面白かったです。

writeup

Crypto in the Shell

難易度:★★★☆☆
概要:oobでいろんな領域を暗号化できる。

writeup

One Punch Man

難易度:★★★★★
概要:unlinkやらhouse of loreやらで頑張る。

writeup

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つまでなので頑張る。

writeup

Sum

難易度:★★☆☆☆
概要:任意書き込みができる。

writeup

Lazy

難易度:★★☆☆☆
概要:独自libcのBOF問。

writeup

remain

難易度:★★★☆☆
概要:Show系が無いtcache問。UAFがあるがlibc-2.30でmalloc回数が制限されているので頑張る。

writeup

Monoid Operator

難易度:★★★☆☆
概要:%nが使えないFSB。sprintfなのでバッファオーバーフローするが、canaryをTLSから取ってくる。

writeup

Mal

Rustが関与してるので対象外ということで。

■ Hack.lu CTF 2019

平日なので全然参加できませんでしたが、面白かったです。 公式がちゃんとwriteup出してるのも良いしwriteupにフィードバックくれたのも良かったです。

TCalc

難易度:★★★☆☆
概要:oobのヒープ問。

writeup

Schnurtelefon

難易度:★★★★☆
概要:UAF。サーバーとクライアントが分離しており面倒。

writeup

Chat

難易度:★★★☆☆
概要:allocaで別スレッドのスタックを破壊する。

writeup

Baby Kernel2

カーネル問なので対象外です。

No Risc, No Future

MIPSバイナリなので対象外です。

■ TastelessCTF 2019

問題バイナリが見つかりませんでした。

■ BackdoorCTF 2019

baby tcache

難易度:★★☆☆☆
概要:やるだけtcache問。

writeup

baby heap

難易度:★★★☆☆
概要:global_max_fast系のfastbin問。showも無いのでついでにFILE streamでlibc leakする。

writeup

miscpwn

難易度:★★★☆☆
概要:libc-2.28ではmalloc_hookからsvc_runを呼び出せばone gadgetが確実に動くという知識があれば簡単なmisc問。

writeup

reallocator

writeupが無い上方針が立たないので対象外です。

■ Newbie CTF 2019

python jail

難易度:★☆☆☆☆
概要:importやevalなどがブラックリストで使えないpython。

writeup

babypwn

難易度:★☆☆☆☆
概要:リターンアドレスを書き換えるだけのStack BOF。

writeup

Oneshot_Onekill

難易度:★☆☆☆☆
概要:ROPでsystemを呼ぶだけのStack BOF。

writeup

dRop the beat

難易度:★★☆☆☆
概要:ROPするだけのStack BOF。

writeup

revenge

難易度:★★★★☆
概要:任意書き込みが1度だけできるstatic linkバイナリ。.fini_arrayを書き換えてROPに持ち込む。

他は鬼簡単でしたが、この問題は面白かったです。

writeup

■ TCS Hackquest 4.0

pwn問はありませんでした。

■ Deloitte UK CTF Qualifier

問題が登録されていませんでした。

■ Pwn2Win CTF 2019

Full tRoll

難易度:★★☆☆☆
概要:Buffer OverreadでcanaryをリークしてStack Overflowでファイル名を書き換えてproc baseをリークする。

writeup

Random Vault

難易度:★★☆☆☆
概要:FSBで関数ポインタを書き換えてシェルコードの断片に飛ばす。シェルコードの位置はrandで決まるので計算する。

writeup

■ RITSEC CTF 2019

jit-calc

難易度:★★★☆☆
概要:即値やレジスタのみが指定できるx64の機械語実行プログラム。ret忘れを利用してシェルコードを実行する。

writeup

Bank

問題環境が再現できませんでした。

wumb0list

難易度:★★★★☆
概要:バイナリの解析がひたすら面倒なだけで脆弱性は単にOOB。

writeup

■ TU CTF 2019

runme

難易度:☆☆☆☆☆
概要:動かしたらフラグが出力される。

writeup

thefirst

難易度:★☆☆☆☆
概要:シンプルなBOF問。

writeup

shellme32

難易度:★☆☆☆☆
概要:BOFでシェルコードに飛ばす。

writeup

shellme64

難易度:★☆☆☆☆
概要:BOFでシェルコードに飛ばす。

writeup

3step

難易度:★☆☆☆☆
概要:若干小さいシェルコードを実行する。

writeup

leakalicious

難易度:★☆☆☆☆
概要:BOFでシェルを取る。

writeup

pancakes

難易度:★☆☆☆☆
概要:BOFでパスワードを取って再入力する。

writeup

printfun

難易度:★☆☆☆☆
概要:FSBで入力とパスワードを空にしてstrcmpを通過する。

writeup

vulnmath

難易度:★☆☆☆☆
概要:FSBでlibc leakしてシェルを取る。

writeup

ctftp

難易度:★☆☆☆☆
概要:BOFでシェルを呼ぶ。

writeup

■ CTFZone 2019 Quals

Tic-tac-toe

難易度:★★★☆☆
概要:まるばつゲームで、プログラムがpython製サーバーと通信している。単純なBOFがあるので100回勝つ状況をROPやシェルコードで再現して本体サーバーからフラグを貰う。

writeup

■ watevrCTF 2019

Voting Machine 1

難易度:★☆☆☆☆
概要:Stack Overflow

writeup

Voting Machine 2

難易度:★☆☆☆☆
概要:Stack Overflow

writeup

Club Mate

難易度:★☆☆☆☆
概要:Integer Overflow

writeup

Wat-sql

難易度:★☆☆☆☆
概要:エラーにより変数が設定されたままになるのでフラグが読める。

writeup

Betstar 5000

難易度:★★☆☆☆
概要:FSBでヒープ上のポインタを書き換えてAAWを作る。

writeup

sabataD

難易度:★☆☆☆☆
概要:globを使っているのでアスタリスクを使ってフラグを読む。

writeup

M-x 5x5

難易度:★★☆☆☆
概要:Lights OutでStack Overflowがあるのでリターンアドレスをflipで書き換える。

writeup

Spott-i-fy

難易度:★☆☆☆☆
概要:ログイン名にHeap Overflowがある。Reversingが大変なのでそれを乗り越えれば簡単。

writeup

Danish Blockchain

Rustなので対象外です。

感想

滑り出しは良かったんですが解けない問題が溜まるにつれて心的負担が大きくなりました。解くのよりもwriteupを書くのが正直大変でした。(特に参加したCTFで既に解いたものを書き直すのはつらすぎる。) 去年の今頃は簡単なROPこそできたもののヒープ系に関しては「???」という感じだったので、結果としてはやってよかったと思います。

体に悪いチャレンジだったので良い子のみんなは真似しないように。