CTFするぞ

CTF以外のことも書くよ

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

後半戦: 2019年のpwn問を全部解くチャレンジ【後半戦】 - CTFするぞ

まえがき (2019年3月記)

最近CTFに出るとそこそこ良い成績が残せる一方,チームのpwn担当として実力不足を感じています. そこで,pwn苦手意識を克服すべく本日2019年3月13日から,2019年1月1日から2019年12月31日までに出題されるpwn問を全て解いてwriteupを書くことにしました. 週2程度でCTFがあって,各CTFに3問くらいpwnがあるイメージなので,今からコツコツやれば来年の1月には記事が出来上がってるんじゃないかなーと思います.

追記(2019年5月8日記) 思った以上に量が多いので前半と後半に分けます。前半は7月上旬、後半は来年の1月上旬に投稿するつもりです。 ほぼ初心者の状態から始めたので、解説ミスとかあれば是非コメントかTwitterでご連絡くださいm(_ _)m

対象となる問題

攻略対象とするpwn問は次の条件をすべて満たすものとします.

  • CTFtimeに載せられた2019年のJeopardy形式のOnline CTFの問題である(Finalを除く)
  • pwn, pwningもしくはexploit, exploitation, binaryexploitationなどpwn関連のタグが付いている
  • 問題のバイナリが見つかる
  • 日本語,英語,中国語(簡体)いずれかのwriteupが見つかる(もしくは自力で解ける)
  • 環境依存(古いlibc,bash jailなど)の問題でDockerfileなどがなく環境が再現できないものは対象外
  • x86もしくはx86_64アーキテクチャ、またはbash jailなどで実行可能なもの
  • カーネルエクスプロイトは対象外

ということで頑張ります.

おすすめ問題

半年分の問題を解いてみて、中でも面白かったものや難しかったものなどをGolden Flag Awards的にいくつか紹介したいと思います。 面白い問題からクソみたいな問題までたくさんありましたが、なんとか1つずつ選びました。 完全な主観&現状で解けてる問題からの抜粋なので悪しからず。

  • Most Fun: Super Smash Bros [TSG CTF 2019]
  • Most Innovative: upxofcpp [*CTF 2019]
  • Most Difficult: straw clutcher [BSidesSF CTF 2019]
  • Most unexpected solution: genius [BSidesSF CTF 2019]

解いた問題とwriteup

以下に書いたwriteupのリンクを載せていきます. 難易度はすごい個人的なので,得意なFSBの難易度が下がってたり苦手なHeap系の難易度が上がってたりします. また、後半に行くにつれて前半と同じレベルの問題でも難易度が下がってるかもしれません。 たぶんpwn歴長い人は★4〜5つの問題でもそんなに難しく感じないかもです。

★☆☆☆☆ shellcode実行するだけなど,pwn入門者向け.
★★☆☆☆ ROP, FSBなど基礎的な知識だけで解ける.初心者向け.
★★★☆☆ 一工夫必要だけどそんなに苦労せずに解ける難易度.初級〜中級者向け.
★★★★☆ かなり苦労して解ける難易度.中級〜上級者向け.
★★★★★ もう一度やれって言われても解けない.上級者向け.

■ Insomni'hack teaser 2019

割と難しかったと聞くInsomni'hackですが,pwnを見ていきたいと思います.

onewrite

難易度:★★★☆☆
概要:任意のアドレスが書き換えられる系問題.__fini_array_startを書き換えて__libc_csu_finiから自由なアドレスにジャンプするが,ROP Gadgetを作るために何度も書き換え&ジャンプをするのが難しい.

このCTFで一番簡単なpwnです.普通に難しくて先行きが不安です.

writeup

echoechoechoecho

難易度:★★★★☆
概要:bashで限られた記号が限られた回数だけ使える.送ったコードの後ろに"|bash"がいくつか付け足せる.

pwnというよりbash jailに分離されるのかな.一応pwnタグが付いていたのでやりました.

writeup

nyanc

ARMバイナリのため実行できず.

winhttpd

Windows Serverバイナリのため実行できず.

■ FireShell CTF 2019

このCTFは参加しました. 問題が多くてpwnもいくらかあったのですが,うち1つは競技中に解き,2つは終了後に丁寧に復習したのでスラスラ解けるはずです. 私がpwnにハマるきっかけとなったCTFかもしれません。

leakless

難易度:★★☆☆☆
概要:単純なStack Overflow問題。libcが配布されていない。

参加したとき解けなかったのが悔しくて猛勉強した記憶があります. これをきっかけに当時libc databaseなるものを知ったのですが,今回はlibcのバージョンが不明でも解ける方法で解きました. この問題で学んだlibc databaseを後のCTFでも活用しているのでwriteupの大切さが分かります.

writeup

casino

難易度:★★☆☆☆
概要:Format String Exploit問題。グローバル変数を書き換えるだけ。

Format String Exploitは得意分野なので競技中に唯一解けたpwnです.

writeup

babyheap

難易度:★★★☆☆
概要:メモサービスのTCache Poisoning問題。CreateやEditなどの使用回数が基本1回までなので工夫する必要がある。

参加したときはノータッチですが,終了後に復習したやつです. ヒープ系の問題を初めて真面目に勉強した問題なので記憶に残っていますし,ヒープ初心者にもおすすめの良問です.

writeup

quotes list

難易度:★★★★☆
概要:サイズが指定できるメモサービス。unsorted binを利用してlibc leakする。off-by-oneでサイズを書き換えてfree+mallocでoverlapし、TCache PoisoningによりGOTなどを書き換える。

これも参加したときはノータッチで、CTF終了後も全く見ていませんでした。 unsorted binを使うlibc leak、チャンクサイズ書き換えによるoverlapともに初めてだったので凄い勉強になりました。

writeup

■ Codegate CTF 2019 Preliminary

FireShellとかぶっていたので出ていないCodegateです。 CTFtimeを覗いた限りpwnは5問あります。 Codegateは結構難しい印象があるので無事解けることを祈ります...... ※全然問題のファイルが見つかりませんでした。

aeiou

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

god-the-reum

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

archiver

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

Maris_shop

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

cg_casino

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

■ NeverLAN CTF 2019

reconとtriviaばっかりでpwnがありませんでした。

■ nullcon HackIM 2019

全く知らないCTFです。 pwnも出題されていましたし、調べたら問題ファイルとdocker環境がすべて公開されていました。

easy-shell

難易度:★★★☆☆
概要:英数字でshellcodeを書く。seccompでexecveが封じられているので注意。

なんだかんだで英数字shellcodeはmetasploitに頼ってたので、今回はちゃんと書いて勉強になりました。 今後使うかは分からないけど......

writeup

HackIM Shop

難易度:★★★★☆
概要:UAFからのTCache Poisoning。Format String Exploitを使っても解けるらしい。

こういう一度に構造体と文字列用に2回mallocされる問題は削除したときのfastbin/tcacheの状態が分かりにくい。 ということで今回はVMUbuntuにpwndbgを入れました。 arenaやtcacheの様子が分かって便利ですね。

writeup

peasy-shell

難易度:★★★☆☆
概要:easy-shellの制約に加えてshellcode領域への書き込みが禁止される。この際mmapのサイズに1を渡しているためshellcode領域の後半は書き込める状態になっていることを利用する。

ascii shellcode書くの面倒です。

babypwn

難易度:★★★☆☆
概要:負数のオーバーフローでスタックにデータをたくさん書き込める。SSPが有効だかscanfに+を渡してcanaryを破壊せずROPに持ち込む。

scanfの仕組みを上手く使う問題で面白かったです。 そこさえ分かればあとは基本的なStack Overflow問題です。

writeup

tudutudututu

難易度:★★★☆☆
概要:mallocしていないアドレスをfreeできる。ヒープ系のtcache poisoning問。

freeした後にNULLを代入し忘れているだけでシェルが取れちゃうという現実に起こりそうな問題です。 最近tcache poisoningが楽しい。

writeup

winblows

Windows 2012バイナリのため実行できず。

■ BITSCTF 2019

pwnがありませんでした。

■ Evlz CTF

まったく知らないCTFですが、pwnも出題されていました。

Attack Defence

問題環境が見つからず途中までしかできませんでしたが、斬新な問題だったので載せておきます。

writeup

Multi

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

Ytube

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

■ Quals: Saudi and Oman National Cyber Security CTF

pwnは出題されなかったようです。

■ STEM CTF: Cyber Challenge 2019

pwnは出題されなかったようです。

■ TAMUctf 19

このCTFには参加し、pwnは1問だけ残しました。 学生のみのCTFなのでpwnは非常に簡単でしたが、pwn入門者の練習として適切なレベルだと思います。 運営がCTF終了後に問題および環境、解法まで公開してくれたので非常に好感が持てるCTFでした。

pwn1

難易度:★☆☆☆☆
概要:バッファオーバーフローでローカル変数を書き換える問題。

pwn入門者向けです。IDAで逆解析して脆弱性を見つけたり、pwntoolsでexploitを書いたりする練習に良いでしょう。

writeup

pwn2

難易度:★★☆☆☆
概要:バッファオーバーフローでローカル変数(関数ポインタ)を書き換える問題。

PIEがかかっていますが、フラグ出力用の関数との相対アドレスが近いことを利用して上手くオーバーフローを利用する問題です。

writeup

pwn3

難易度:★☆☆☆☆
概要:バッファオーバーフローでリターンアドレスを書き換えてシェルコードを実行する。

pwnを始めてすぐの方にとって勉強になると思います。

writeup

pwn4

難易度:★☆☆☆☆
概要:lsに任意の引数を与えられるので、シェルを取る。

jailに分類されるのかな?バッファオーバーフローを利用しても解けると思います。

writeup

pwn5

難易度:★★☆☆☆
概要:ret2libcでsystem('/bin/sh')を実行する。もしくは';sh'と入力してシェルを取る。

非想定解があるので難易度1かもしれませんが、想定解はret2libcだったようです。

writeup

VeggieTales

難易度:★★★☆☆
概要:pythonのpickleのdesirializationで任意のコマンドが実行できる脆弱性。

攻撃自体は簡単ですが、ソースコードが渡されない上、トークンがROT13されているというguess要素があったので難易度を上げました。

writeup

pwn6

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

ひたすら問題のバイナリがでかい。 FSBを見つければそんなに難しくないと思います。

writeup

■ BSidesSF 2019 CTF

このCTFも参加しましたが、TAMUの直後だったのでほとんど寝てました。 簡単なpwnは競技中に解けましたが、他のやつは激ムズっぽいので心配です。

runit

難易度:★☆☆☆☆
概要:シェルコードを送るだけ。

特にひっかけも無い純粋なx64シェルコードです。

writeup

runitplusplus

難易度:★☆☆☆☆
概要:反転したシェルコードを送るだけ。

リバージングできればrunitと変わりません。

writeup

slowfire

難易度:★★★☆☆
概要:Stack Overflowでシェルコードを実行する。ソケット経由なのでdup2でfdをstdin, stdoutに複製する等の工夫が必要。

dup2の勉強になりました。

writeup

straw_clutcher

難易度:★★★★★
概要:Heap Overflowでlibc leak, double freeからのfastbin attack。とにかくバイナリが複雑。

二度とやりたくないほど難しかったです。 こういうの自力で解けるようになるまで何年かかるんだろう。

writeup

genius

難易度:★★★★☆
概要:テトリスゲームの2バイトだけ自由にバイナリを書き換えられる。memsetのGOTをsystemに向けて、テトリスのブロックを上手いこと並べて引数を作る。

テトリミノの並びでメモリ上にsh;を作るというのが斬新でした。解いてて楽しかったです。

writeup

■ Aero CTF 2019

このCTFは参加しました。比較的guess要素が多かった気がします。 もうそろそろ最近のCTFに追いついて来たのでまだサーバーが動いていたりスコアサーバーから問題バイナリを落としたりできます。

pwn_warmup

難易度:★☆☆☆☆
概要:off-by-nullのバッファオーバーフロー問題。

適当な文字をいっぱい送れば解けます。

writeup

難易度:★★☆☆☆
概要:Format String Exploitでグローバル変数を書き換える。

シンプルなFSB問題です。

writeup

engine script

難易度:★★★☆☆
概要:独自VM問題。コードのサイズと命令セット的にbssセクション周辺しか読み書きできない。GOT書き換えでleakとoverwriteを2回に分けて実行する。

競技中に解けずwriteupもなかったので、もやもやしてた問題です。 writeupが無いので対象にはあたりませんが、気になっていたので挑戦したところ無事に解くことができました。 以前解けなかったものが解けるようになっていると楽しい。

writeup

■ Pragyan CTF 2019

海外のチームに協力してpwnをいくつか解いた記憶があります. なんかguess問が多いらしいですが,私の解いたpwnは普通だったと思います. ちょっと入学やら引越しやらで忙しかったので4月を過ぎてしまいましたが,久々にやっていきます.

Feed_me

難易度:★☆☆☆☆
概要:Stack Overflowで変数を書き換え,条件を満たすようにする.

単純なバッファオーバーフロー問題ですが,特定の条件式を満たすようにローカル変数を上書きする必要があります. バッファオーバーフローを勉強したpwn初学者の腕試しに良いかもしれません.

writeup

Secret Keeper

問題バイナリが見つかりませんでしたが,これは確かUAFの問題でした. ユーザーを何個か作ってfastbinに上手く繋がるように削除してもう一回作ればrootユーザーが作れるみたいな感じだったと思います.

Armoury

難易度:★★★☆☆
概要:FSBとStack Overflowを利用する.1回目のoverflowで破壊したcanaryを2回目のscanfで修復する.

scanfの性質を利用した問題です.

writeup

■ UTCTF

引越しで忙しかったですが最後の方だけ参加したCTFです. 問題がとても多くて,今見たらpwnもすごい多いですね. 最近CTFが多くて手を付けてない問題が溜まってますが頑張って消費していきます.

Baby Pwn

難易度:★★☆☆☆
概要:スタックオーバーフローでシェルコードを実行する.

基礎的なオーバーフローです.

writeup

Baby Echo

難易度:★★☆☆☆
概要:FSB問題.printfが1つなのでexitをmainに書き換えてlibc baseのリークとsystemの書き込みをする.

なんかctftimeにタグ付いてませんでしたが参加中に解いたのでpwnと分かりました. 他のCTFもタグ付いてなくて見逃した問題あるんだろうなぁ.

writeup

PPower enCryption

PowerPCの問題なので動かせませんでした.

Encryption Service

難易度:★★★★☆
概要:ヒープ系のUse After Free脆弱性.細かいバグに気付けば割と簡単に解ける.

めっちゃ時間かかったけどそんなに難しくないと思うんでこういうのは解けるようになりたいです.

writeup

Jendy's

難易度:★★★★☆
概要:ヒープ系の問題です.Linked Listを利用したoverlapで,最終的にFSBを使ってシェルを奪う.

最近時間が取れないので長い時間をかけてゆっくりと解きました. Linked Listの管理の問題を見つけてFSBと組み合わせて利用する問題で,なかなか面白かったです.

writeup

ECHO

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

■ 0CTF/TCTF 2019 Quals

名前は知っていますが参加していません。 pwnがとても多いので心配です。 ※問題バイナリが全然ありませんでした。 graneedさんが問題バイナリをすべて提供してくださいました。 ありがとうございます!

zerotask

難易度:★★★★☆
概要:Race Conditionで頑張る。

writeup

baby_aegis

諦め。

plang

言語系なので対象外です。

scanner

諦め。

babyheap

難易度:★★★★★
概要:consolidateで頑張ってoverlapさせる。

writeup

applepie

OSXなので対象外です。

Babysandbox

VM問なので対象外です。

■ Securinets CTF Quals 2019

このCTFは参加しました。 pwnはjail問が半分と、普通のpwnが半分という感じでした。

back to basics

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

Baby one

難易度:★★★☆☆
概要:スタックオーバーフローがあるが、rdxが0にされるためret2csuを使う必要がある。

面白い問題でした。

writeup

Simple

難易度:★★★☆☆
概要:FSBがあるのでGOTを書き換える。printfは1回しかないのでmainを呼び出す。

writeup

Baby two

難易度:★★★★☆
概要:スタックオーバーフローですが、write系命令が無いのでret2dl-resolveします。

競技中にころころバイナリが変わった問題です。

writeup

Stone Mining

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

Eyesless

問題バイナリが見つかりませんでした。(というかバイナリが配布されない問題で、Blind ROPするやつだったと思う)

■ VolgaCTF 2019 Qualifier

名前は知っていますが参加したことはありません。 pwnはCTFTimeに1つだけ載っていたのでさくっと消化できそう。 なんでCTF終わった後に問題公開しないんだ? もう問題回収用のCTFアカウント作った方がいいのか?

warm

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

■ boot2root '19

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

■ Sunshine CTF 2019

参加しました。何かguessが多かった気がしますが、pwnは普通でした。

Return To Mania

難易度:★☆☆☆☆
概要:PIEが有効ですが近くのアドレスに移動すれば良いのでリターンアドレスを1バイト書き換えれば良い。

初心者向け問題です。

writeup

CyberRumble

難易度:★★☆☆☆
概要:プログラミングミスをいくつか利用して任意のコマンドをsystem関数に渡します。

アセンブリをきちんと読めば解けます。

writeup

■ TyumenCTF 2019: Millennium

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

■ April Fools' GTF 3rd 2019

問題が登録されていませんでした。 まぁこのCTFはpwnないと思う。

■ ENCRYPT CTF

やっとpwnにめぐり合えた。 参加したことはないですが、知らないCTFなので勝手に簡単と思っています。 問題+Dockerまで公開されているので大変よろしい。

pwn0

難易度:★☆☆☆☆
概要:スタックオーバーフローで変数を書き換える。

超初心者向け問題です。

writeup

pwn1

難易度:★☆☆☆☆
概要:スタックオーバーフローでリターンアドレスを書き換える。

初心者向け問題です。

writeup

pwn2

難易度:★★☆☆☆
概要:スタックオーバーフローで引数を用意しつつsystem関数を呼び出す。もしくはシェルコードを実行する。

簡単な問題です。

writeup

pwn3

難易度:★★☆☆☆
概要:スタックオーバーフローでlibcのアドレスをリークしてsystem("/bin/sh")を呼び出す。

やるだけ問題です。

writeup

pwn4

難易度:★★☆☆☆
概要:スタックオーバーフローとFSBでSSPを回避しつつ関数を呼び出す。

比較的簡単な問題です。ptrlibにFSB機能が追加されました。

writeup

■ RADARCTF

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

■ Midnight Sun CTF 2019 Quals

海外チームで一応pwn担当として参加したのですが結局pwnは他の強い方々が解いちゃった。 なんか凄い難しいCTFだったので解けるか不安しか無いです。

Hfs-dos

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

Hfsipc

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

gissa2

難易度:★★★★☆
概要:shortで保存される値がintで読み込めるので、サイズが大きくなりオーバーフローが発生。x32 ABIによりseccompを回避。

各段階に工夫が必要で面白かったです。

writeup

Hfs-vm2

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

■ Swamp CTF

まったく知らないCTFです。 1週間以上前のCTFなのにサーバーがまだ動いています。 しかもpwnサーバーも生きてるっぽいです。有能。 ダウンロードリンクは全部切れていました。残念。

Heap Golf

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

Dream Heap

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

Wetware

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

Wetware 2

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

Bad File

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

Serial Killer

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

■ TJCTF

これも知らないCTFです。が、良問ばかりで楽しかったです。 d3npäさんからCTFTimeに載っている以外にも問題があるという情報をいただき、すべて解きました。

Silly Sledshop

難易度:★★☆☆☆
概要:スタックオーバーフローを利用してshellcodeを書き込んで実行する問題。

ENCRYPT CTFにほぼ同じ問題がありましたね。

writeup

Slice of PIE

難易度:★★☆☆☆
概要:スタックオーバーフロー。PIEが有効なのでvsyscallを呼びまくってスタック上にある補助関数まで持ってくる。

vsyscall知らなかったので勉強になりました。

writeup

Printf Polyglot

難易度:★★★☆☆
概要:FSB問題。同じデータが2回printfに渡されるのでその2回でシェルを取る必要がある。

書き換えとシェル起動を行える書式文字列を作る必要がありますがptrlibがあれば脳死で解けます。

writeup

House of Horror

難易度:★★★☆☆
概要:fastbinのヒープ問題。unsorted binでリークしてUAFで__malloc_hookを書き換えるだけ。

ヒープ慣れが見られる。

writeup

House of Horror 2

難易度:★★★☆☆
概要:大きなサイズしか確保できないのでfastbinが使えないが、unsorted bin attackでglobal_max_fastを変更して無理やりfastbinを使う。

いろいろ工夫が必要で勉強になった上、凄い面白かったです。

writeup

Halcyon Heap

難易度:★★★☆☆
概要:double freeのヒープ系問題。libc2.23でfastbinが使われるのでヒープでchunk overlapを起こしてlibcのアドレスをリークし、同様に__malloc_hookを書き換える。

tcache慣れするとfastbinが難しく感じますが、面白かったです。

writeup

■ AceBear Security Contest 2019

House of loop

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

Darknote

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

Gifremake

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

■ SpamAndFlags Teaser 2019

pwnがありませんでした。

■ CBM CTF 2019

public votingを見ると簡単すぎのCTFだったようです。 問題名がpwnなのにreversingタグしか付いてない問題もあったのですが、簡単だったということでしょうか? いずれにせよ問題バイナリが無いのでできません。

little pwn

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

pwn5

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

Bad Binary

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

■ Byte Bandits CTF 2019

CTFtimeにはあまり載ってませんでしたが、一応問題回収していたのでスコアは分かりませんが解いてみます。

warmup

難易度:★★☆☆☆
概要:スタックオーバーフロー。バッファオーバーリードでcanaryなどをリークできる。

SSPが有効なスタックオーバーフロー問題として、シンプルな部類だと思います。

writeup

lemonshell

難易度:★★☆☆☆
概要:シェルコード問題。execveが禁じられている。

いろいろ解き方はあると思いますが、私はexecveatで解きました。

writeup

NotSoEasy

難易度:★★☆☆☆
概要:FSB問題。static linkなので注意。

GOTが使えなかったらどうするの?という問題ですね。

writeup

tudutudututu2

writeupが無いしCTFtimeにも載ってないので対象外ですが、せっかくバイナリあるし解きたい。 脆弱性が見つからないんですが、解ける方いたら教えてください。

writeup

hardmalloc

難易度:★★★☆☆
概要:独自malloc問題。mallocにcanaryがあるのでリークしてから上書きする。

独自malloc問題を解くのは初めてですが、さくさく解けて面白かったです。

writeup

■ WPICTF 2019

知らないCTFです。

Remy's Epic Adventure

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

Source pt2

SSHサーバーが動いてないため解けません。

secureshell

難易度:★★☆☆☆
概要:スタックオーバーフロー。randによる独自canaryだが、別の箇所で使われるrandの値からseedを予測できる。

今年初の独自canary問題です。頑張ってseedを求めます。

writeup

Breakingin

SSHサーバーが動いてないため解けません。

■ PlaidCTF 2019

めちゃくちゃ難しいやつですね。 正直やりたくない......

cppp

諦め。

Plaid Adventure II

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

SPlaid Birch

諦め。

Suffarring

諦め。

Spectre

諦め。

■ YauzaCTF 2019 Quals

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

■ Hack Zone Tunisia 2019

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

■ MIEM Real CTF Quals

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

■ TG:Hack

知らないCTFです。 問題サーバーが動いていたので問題をダウンロードできました。 ジャンルごとにページがあったり、割と独特なスコアサーバーでした。

Pwntions 1

難易度:★☆☆☆☆
概要:オーバーリードでスタック上のフラグを読む。

writeup

Pwntions 2

難易度:★☆☆☆☆
概要:オーバーフローでスタック上の変数を変更する。

writeup

Pwntions 3

難易度:★☆☆☆☆
概要:オーバーフローでリターンアドレスを変更する。

writeup

The great bank heist

問題バイナリが動きませんでした。

Are You Flipping Kidding Me?

難易度:★★★☆☆
概要:任意の5ビットを反転できるサービス。頑張ってone gadget rceへつなげる。

試行錯誤が必要で面白かったです。

writeup

Baby's First Javascript Exploitation

writeupがありませんでした。

■ angstromCTF

zer0ptsで参加しました。 結構良問が多かったので個人的に好きなCTFです。

Aquarium

難易度:★☆☆☆☆
概要:スタックオーバーフローでリターンアドレスを書き換える。

スタックオーバーフローで用意された関数を呼び出す問題です。

writeup

Chain Of Rope

難易度:★★☆☆☆
概要:スタックオーバーフローでROPする。

ROPが学べる問題です。

writeup

Purchases

難易度:★★☆☆☆
概要:FSBでGOTを書き換えて用意された関数へ飛ばす。

x64のFSBが学べる問題です。

writeup

PIE Shop

ブルートフォース問題なので飛ばします。

Over My Brain

難易度:★★★☆☆
概要:brainf**kのエミュレータ。リターンアドレスを用意された関数へ書き換える。

内容自体はそんなに難しくないですが短いbrainf**kコードに収めるという点で難易度を上げました。

writeup

Returns

難易度:★★★☆☆
概要:FSBがありますがflag関数がない。putsをmainに飛ばして適当にone gadgetへのアドレスを構成する。

個人的には簡単でしたがFSBが苦手な人にとっては辛いと思います。 そんな人のためにもptrlibには最近x64用のFSBモジュールが追加されたのでもう安心!(は?)

writeup

Server

難易度:★★★☆☆
概要:アセンブリ製のhttpサーバー。なんやかんやで任意のsyscallが呼べる。

勝手にURL用バッファだけで解くという縛りを付けて解いてました。 脆弱性に気づけばそんなに難しくないと思います。 なお競技中はIDAの呪いでsyscallがしばらく見えてなかったので時間かかった。

writeup

Weeb Hunting

writeupが無いので対象外です。

■ ASIS CTF Quals 2019

ASISさんです。

Silk Road I

難易度:★★☆☆☆
概要:Stack Overflow + 謎Reversing

writeup

Precise average

難易度:★★☆☆☆
概要:scanfの性質を利用してcanaryを残したままオーバーフローする問題です。

わしが育てた

writeup

pwn 101

難易度:★★★☆☆
概要:off-by-one脆弱性を使うヒープ問です。

わしが育てた

writeup

Silk road II

やめ。

Double cream

やめ。

Silk road III

やめ。

Baby VM1

あとでやる?

■ Blaze CTF 2019

知らないCTFです。 よく考えたら私が初めて解いたKernel Exploit問のblazemeを出題したところでした。 ところでCTFのロゴがかわいい。

sanity

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

bfkush1

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

wasm

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

diy

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

■ CSA Capture The Flag 2019

知らないCTFです。 スコアサーバーが生きてたので登録しましたが、問題バイナリは「authorization error」でダウンロードできませんでした。

Feed me

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

■ UUT CTF

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

■ *CTF 2019

これは参加しました。pwnはどれも良問でした。

quicksort

難易度:★★★☆☆
概要:スタックオーバーフロー。SSPが有効だが、配列のポインタをGOTに書き換えてSSPを潰す。

一歩踏み込んだスタックオーバーフロー問題で面白かったです。

writeup

girlfriend

難易度:★★★☆☆
概要:ヒープ系double free問題。libcが新しくtcacheにdouble free検知があるのでfastbinでごまかす。

libc-2.29は初めてで面白かったです。 これ競技中に解けたのはここまで数カ月頑張った成果ですね。

writeup

babyshell

難易度:★★☆☆☆
概要:特定の文字コードのみでshellcodeを作る。

正攻法は予想外の方法でしたが、残念ながら抜け道があったので簡単でした。

writeup

blindpwn

問題バイナリがありませんでした。というかBlind系問題です。 writeupを読みましたが、libcが渡されているのでROP gadgetを探索せずに済みます。 競技中はBlind ROPでROP gadgetを探してましたがもっと簡単でした。

upxofcpp

難易度:★★★★☆
概要:問題名通りC++製でUPX圧縮済み。UPXにするとほとんどRWX領域になるので単純なdouble freeでvtableをヒープのアドレスにしてshellcodeを実行する。

UPXの特性とC++の関数テーブルを利用した問題で面白かったです。

writeup

hack_me

Kernel Exploitなので対象外

oob-v8

v8 Javascript Engineなので対象外

■ CTF19 - ALL.MN

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

■ INS'hAck 2019

insomni'hackとは違うのかな?pwnは多いですがどれも50点だから解けると信じて頑張ります。 問題&環境が全部githubに公開されてるので大変有能。

gimme your shell

難易度:★☆☆☆☆
概要:リターンアドレスを書き換えてROPなり何なりをする。

やるだけ問題。

writeup

ropberry

難易度:★★☆☆☆
概要:リターンアドレスを書き換えてROPする。

やるだけ問題。

writeup

Intergover

難易度:★☆☆☆☆
概要:242と入力するとシェルが取れる。

これがpwnとか訳分からん。

writeup

Signed or not signed

難易度:★☆☆☆☆
概要:-666と入力するとシェルが取れる。

訳分からん。

writeup

Overcobol

COBOLスクリプトのため対象外。

■ TSG CTF

東大初の(CTFtimeに登録された)CTFですね。 残念ながら今年はまともに参加できませんでしたが、良問が多かったらしいので来年も是非開いてほしいです。

Odd Multiplier

競プロ要素があって解けないので飛ばします。

Super Smash Bros

難易度:★★★★★
概要:ファイルシステムにヒープオーバーフローがある。ファイルをフォルダに変更してheapやlibcのアドレスをリークしていく。最後にTCache Poisoning。

脆弱性を見つけてもどう利用するかに悩まされ、すごい面白かったです。

writeup

Capacity Oriented Vector

諦め。

STLC

言語系なので対象外です。

■ DEF CON CTF Qualifier 2019

なんだかんだでDEF CONに参加したのは初めてな気がする。 超有名なので凄い良問ばかりを期待していたのですが、割とクソ問多いんだなーと思った記憶。

speedrun-001

難易度:★☆☆☆☆
概要:スタックオーバーフロー。static linkなのでROPできる。

最初の5チーム以外は5点しか稼げないというクソ仕様やめてくれ。普通にFirst Bloodに点入れればいいじゃん。

writeup

speedrun-002

難易度:★★☆☆☆
概要:スタックオーバーフロー。dynamic linkなのでlibc leakしてからROP。

writeup

speedrun-003

難易度:★★☆☆☆
概要:シェルコード。サイズや条件があるので適当に作る。

writeup

speedrun-004

難易度:★★★☆☆
概要:off-by-one。rbpの下位1バイトが書き換わるので後のleave; ret;でスタックポインタがバッファらへんに飛ぶ。

writeup

speedrun-005

難易度:★★☆☆☆
概要:x64のFSB問題。一度に複数のアドレスに書き込む必要あり。

競技ではリモートとローカルのバイナリが違う&修正が入らないとかいう史上最悪のクソ問だったそうです。

writeup

speedrun-006

難易度:★★★☆☆
概要:シェルコード問。int3が挿入されるのでreadでシェルコードを上書きするなどして適当に回避。

writeup

speedrun-007

難易度:★★☆☆☆
概要:書き換えだけできるのでone gadgetに飛ぶようブルートフォースするだけのクソ問。

writeup

speedrun-008

バイナリどっかいったぞ...?

speedrun-009

難易度:★★☆☆☆
概要:リーク用のFSBとROP用のBOFが用意されているので、やるだけ。

writeup

speedrun-010

難易度:★★☆☆☆
概要:UAFでlibcのアドレスをリークし、さらに関数ポインタを書き換えてone gadgetを呼ぶ。

writeup

speedrun-011

難易度:★★★☆☆
概要:シェルコード。seccompでread, write等が禁止される。time based attackするだけ。

writeup

speedrun-012

これもバイナリどっかいった。

babyheap

難易度:★★★☆☆
概要:ヒープ系問題。off-by-oneがあるのでchunk overlapし、工夫して次のチャンクのfdを書き換える。

ひと工夫必要で面白かったです。

writeup

■ RCTF 2019

Harekaze CTFに出ていたのでほぼ参加していません。

babyheap

seccomp付きでfastbinも使えなくしといてbabyheapとか何考えてるんだろ。

shellcoder

やめ。

manynotes

諦め。

syscall_interface

対象外です。

chat

対象外です。

■ Harekaze CTF

このCTFは韓国の強い方々と合同で参加して優勝しました。 面白い問題ばかりでしたし、チームで協力して楽しかったです。

Baby ROP

難易度:★☆☆☆☆
概要:スタックオーバーフロー。systemや/bin/shもあるのでret2pltするだけ。

初心者向けで大変やさしい。

writeup

Baby ROP 2

難易度:★★☆☆☆
概要:スタックオーバーフロー。libc leakしてret2libcするだけ。

典型問題ですね。

writeup

Login System

難易度:★★★☆☆
概要:scanfの書式文字列がsprintfで構成され、ユーザー入力が使われる。scanfでどうやってlibc leakするかの工夫が必要。

初めて見る形式で面白かったです。

writeup

Harekaze Note

難易度:★★★★☆
概要:UAF。libc 2.29なのでfastbin dupを利用。あとノートのサイズが0x50バイトまでなのでいろいろ工夫する。

libcのアドレスを取るまでの流れが面白かったです。

writeup

Ramen

難しいので飛ばします。

■ Security Fest 2019

Cyber Mimic Defenseに出場していたので出られませんでした。 (TokyoWesternsは両方出てどっちも良い成績を残しているので怖い。) 問題回収しようと終了した次の日くらいにスコアサーバーを見に行くと既に落とされていましたが、megumishさんとgraneedさんに問題バイナリをいくつかいただきました。 ありがとうございます!

Baby1

難易度:★☆☆☆☆
概要:スタックオーバーフローで特定の関数を呼び出す。

writeup

Baby2

難易度:★★☆☆☆
概要:スタックオーバーフローでlibc leakしてシェルを取る。

writeup

Baby3

難易度:★★★☆☆
概要:FSBでGOT overwriteする。

writeup

Baby4

難易度:★★☆☆☆
概要:スタックオーバーリード&オーバーフローでlibc leak&canary leakしてシェルを取る。

libcが付いてなかったけどlibc databaseで見つかるやつなのだろうか。

writeup

Baby5

難易度:★★☆☆☆
概要:単純なdouble freeがあるので、unsorted binでlibc baseを取ってtcache poisoningする。

こういうのをbabyheapって言うんだぞ。

writeup

Baby6

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

Halleb3rry

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

xtore

Kernel Exploitなので対象外。

Brainfuck64

Kernel Exploitなので対象外。

Facebook CTF 2019

これは参加しました。割と簡単なものから難しいものまであったと思います。

overfloat

難易度:★★☆☆☆
概要:float型配列にオーバーフローがあります。

writeup

otp_server

難易度:★★★☆☆
概要:sprintfの性質を利用してスタックオーバーフローする問題。

勉強になりました。競技中に東京サーバー用意してくれた運営ありがとう。

writeup

rank

難易度:★★★☆☆
概要:ret2csuを使って解ける問題です。

ret2csuって現実的にはこういうときに役立つんだなぁ。

writeup

babylist

難易度:★★★★☆
概要:vectorをmemcpyしちゃう脆弱性を持ったバイナリ。

C++は本当に分からない。公式writeupにはこれがEasyって書いてたので :thinking_face: です。

writeup

kpets

Kernel Exploit問なので対象外です。

rusty_shop

諦め。

asciishop

諦め。

raddest_db

諦め。

■ HSCTF 6

これも参加しました。割と初心者向けの問題が多かったと思います。

Return To Sender

難易度:★☆☆☆☆
概要:スタックオーバーフローによりリターンアドレスを書き換える。

writeup

Combo Chain Lite

難易度:★☆☆☆☆
概要:スタックオーバーフローによりリターンアドレスを書き換える。

writeup

Storytime

難易度:★★☆☆☆
概要:スタックオーバーフローによりリターンアドレスを書き換える。

writeup

Combo Chain

難易度:★★☆☆☆
概要:スタックオーバーフローによりリターンアドレスを書き換える。

writeup

Bit

難易度:★★☆☆☆
概要:最大4ビット反転できるのでGOTを書き換える。

writeup

Byte

難易度:★★☆☆☆
概要:FSBでアドレスをリークしたあとにそこを書き換える。

writeup

Caesar's Revenge

難易度:★★★☆☆
概要:x64のFSB問題。

FSBは安定して解ける気がする。

writeup

Aria Writer

難易度:★★★☆☆
概要:TCache PoisoningでGOTを書き換えてlibc leakおよびone gadgetを呼ぶ。

これくらいの難易度が体に良い。

writeup

Aria Writer v3

難易度:★★★☆☆
概要:TCache Poisoningでbssに偽のチャンクを作ってlibc leakする。

なんで競技中に解けなかったんだろうってなるやつです。

writeup

Hard Heap

難易度:★★★★☆
概要:UAFでheap leakしてoverlapでunsorted binに繋いでlibc leakし、さらにtop_chunkを書き換えて__malloc_hookを書き換える。

初めてやる手法で面白かったです。

writeup

■ BCACTF I

最初の方は参加しましたが簡単 or エスパーすぎたので途中止めしたCTFです. 一応exploitも2つ出ましたが、バイナリの中にbrainf**cのコードが隠されていて、それを実行したらフラグが出るとかいうpwn要素皆無の問題でした。 幸いにもファイルは全部削除しており、バイナリが見つからなかったので対象外です。

executable

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

executable-2

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

Google Capture The Flag 2019 (Quals)

難しいというかguess要素が多すぎて泣いたCTFです。

MicroServiceDaemonOS

諦め。

Secure Boot

OSなので対象外です。

JIT

対象外です。

Regex

諦め。

■ ISITDTU CTF 2019 Quals

このCTFは参加しました。pwnは楽しかったです。

iz_heap_lv1

難易度:★★★☆☆
概要:ヒープ系問題で、任意のインデクスでfreeできるため名前に偽のチャンクを置いておけば良い。

writeup

iz_heap_lv2

難易度:★★★☆☆
概要:ヒープ系問題で、off-by-nullを使う。

解けた中では初off-by-nullだと思います。

writeup

babyshellcode

難易度:★★★☆☆
概要:alarm以外禁止されているshellcodeで、メモリ上のxorされたフラグを読む。

writeup

Tokenizer

難易度:★★★☆☆
概要:cstringで処理するためsaved rbpをstrsepで一部nullにできる。これを利用してバッファ中のROP chainにrbpを向ける。

writeup

prisonbreak

やめ。

■ Canadian Institute for Cybersecurity_Capture the Flag

問題も登録されてないしスコアサーバーもどこにあるのか分かりませんでした。

まとめと感想

とりあえず半分終わりましたが、難しい問題が積み上がっているので年末の悪夢になりそうです。 最初の目標であったpwn苦手意識の克服はできたと思います。 ただARMとかPowerPCのバイナリ降ってきたら解けませんし、Kernel Exploitも無理です。 まだ半年残ってるので頑張って続けていこうと思います。