後半戦: 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
- まえがき (2019年3月記)
- 対象となる問題
- おすすめ問題
- 解いた問題とwriteup
- ■ Insomni'hack teaser 2019
- ■ FireShell CTF 2019
- ■ Codegate CTF 2019 Preliminary
- ■ NeverLAN CTF 2019
- ■ nullcon HackIM 2019
- ■ BITSCTF 2019
- ■ Evlz CTF
- ■ Quals: Saudi and Oman National Cyber Security CTF
- ■ STEM CTF: Cyber Challenge 2019
- ■ TAMUctf 19
- ■ BSidesSF 2019 CTF
- ■ Aero CTF 2019
- ■ Pragyan CTF 2019
- ■ UTCTF
- ■ 0CTF/TCTF 2019 Quals
- ■ Securinets CTF Quals 2019
- ■ VolgaCTF 2019 Qualifier
- ■ boot2root '19
- ■ Sunshine CTF 2019
- ■ TyumenCTF 2019: Millennium
- ■ April Fools' GTF 3rd 2019
- ■ ENCRYPT CTF
- ■ RADARCTF
- ■ Midnight Sun CTF 2019 Quals
- ■ Swamp CTF
- ■ TJCTF
- ■ AceBear Security Contest 2019
- ■ SpamAndFlags Teaser 2019
- ■ CBM CTF 2019
- ■ Byte Bandits CTF 2019
- ■ WPICTF 2019
- ■ PlaidCTF 2019
- ■ YauzaCTF 2019 Quals
- ■ Hack Zone Tunisia 2019
- ■ MIEM Real CTF Quals
- ■ TG:Hack
- ■ angstromCTF
- ■ ASIS CTF Quals 2019
- ■ Blaze CTF 2019
- ■ CSA Capture The Flag 2019
- ■ UUT CTF
- ■ *CTF 2019
- ■ CTF19 - ALL.MN
- ■ INS'hAck 2019
- ■ TSG CTF
- ■ DEF CON CTF Qualifier 2019
- ■ RCTF 2019
- ■ Harekaze CTF
- ■ Security Fest 2019
- ■ Facebook CTF 2019
- ■ HSCTF 6
- ■ BCACTF I
- ■ Google Capture The Flag 2019 (Quals)
- ■ ISITDTU CTF 2019 Quals
- ■ Canadian Institute for Cybersecurity_Capture the Flag
- まとめと感想
対象となる問題
攻略対象とする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です.普通に難しくて先行きが不安です.
echoechoechoecho
難易度:★★★★☆ 概要:bashで限られた記号が限られた回数だけ使える.送ったコードの後ろに"|bash"がいくつか付け足せる.
pwnというよりbash jailに分離されるのかな.一応pwnタグが付いていたのでやりました.
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の大切さが分かります.
casino
難易度:★★☆☆☆ 概要:Format String Exploit問題。グローバル変数を書き換えるだけ。
Format String Exploitは得意分野なので競技中に唯一解けたpwnです.
babyheap
難易度:★★★☆☆ 概要:メモサービスのTCache Poisoning問題。CreateやEditなどの使用回数が基本1回までなので工夫する必要がある。
参加したときはノータッチですが,終了後に復習したやつです. ヒープ系の問題を初めて真面目に勉強した問題なので記憶に残っていますし,ヒープ初心者にもおすすめの良問です.
quotes list
難易度:★★★★☆ 概要:サイズが指定できるメモサービス。unsorted binを利用してlibc leakする。off-by-oneでサイズを書き換えてfree+mallocでoverlapし、TCache PoisoningによりGOTなどを書き換える。
これも参加したときはノータッチで、CTF終了後も全く見ていませんでした。 unsorted binを使うlibc leak、チャンクサイズ書き換えによるoverlapともに初めてだったので凄い勉強になりました。
■ 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に頼ってたので、今回はちゃんと書いて勉強になりました。 今後使うかは分からないけど......
HackIM Shop
難易度:★★★★☆ 概要:UAFからのTCache Poisoning。Format String Exploitを使っても解けるらしい。
こういう一度に構造体と文字列用に2回mallocされる問題は削除したときのfastbin/tcacheの状態が分かりにくい。 ということで今回はVMのUbuntuにpwndbgを入れました。 arenaやtcacheの様子が分かって便利ですね。
peasy-shell
難易度:★★★☆☆ 概要:easy-shellの制約に加えてshellcode領域への書き込みが禁止される。この際mmapのサイズに1を渡しているためshellcode領域の後半は書き込める状態になっていることを利用する。
ascii shellcode書くの面倒です。
babypwn
難易度:★★★☆☆ 概要:負数のオーバーフローでスタックにデータをたくさん書き込める。SSPが有効だかscanfに+を渡してcanaryを破壊せずROPに持ち込む。
scanfの仕組みを上手く使う問題で面白かったです。 そこさえ分かればあとは基本的なStack Overflow問題です。
tudutudututu
難易度:★★★☆☆ 概要:mallocしていないアドレスをfreeできる。ヒープ系のtcache poisoning問。
freeした後にNULLを代入し忘れているだけでシェルが取れちゃうという現実に起こりそうな問題です。 最近tcache poisoningが楽しい。
winblows
Windows 2012バイナリのため実行できず。
■ BITSCTF 2019
pwnがありませんでした。
■ Evlz CTF
まったく知らないCTFですが、pwnも出題されていました。
Attack Defence
問題環境が見つからず途中までしかできませんでしたが、斬新な問題だったので載せておきます。
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を書いたりする練習に良いでしょう。
pwn2
難易度:★★☆☆☆ 概要:バッファオーバーフローでローカル変数(関数ポインタ)を書き換える問題。
PIEがかかっていますが、フラグ出力用の関数との相対アドレスが近いことを利用して上手くオーバーフローを利用する問題です。
pwn3
難易度:★☆☆☆☆ 概要:バッファオーバーフローでリターンアドレスを書き換えてシェルコードを実行する。
pwnを始めてすぐの方にとって勉強になると思います。
pwn4
難易度:★☆☆☆☆ 概要:lsに任意の引数を与えられるので、シェルを取る。
jailに分類されるのかな?バッファオーバーフローを利用しても解けると思います。
pwn5
難易度:★★☆☆☆ 概要:ret2libcでsystem('/bin/sh')を実行する。もしくは';sh'と入力してシェルを取る。
非想定解があるので難易度1かもしれませんが、想定解はret2libcだったようです。
VeggieTales
難易度:★★★☆☆ 概要:pythonのpickleのdesirializationで任意のコマンドが実行できる脆弱性。
攻撃自体は簡単ですが、ソースコードが渡されない上、トークンがROT13されているというguess要素があったので難易度を上げました。
pwn6
難易度:★★★☆☆ 概要:FSBでGOTを書き換える。
ひたすら問題のバイナリがでかい。 FSBを見つければそんなに難しくないと思います。
■ BSidesSF 2019 CTF
このCTFも参加しましたが、TAMUの直後だったのでほとんど寝てました。 簡単なpwnは競技中に解けましたが、他のやつは激ムズっぽいので心配です。
runit
難易度:★☆☆☆☆ 概要:シェルコードを送るだけ。
特にひっかけも無い純粋なx64シェルコードです。
runitplusplus
難易度:★☆☆☆☆ 概要:反転したシェルコードを送るだけ。
リバージングできればrunitと変わりません。
slowfire
難易度:★★★☆☆ 概要:Stack Overflowでシェルコードを実行する。ソケット経由なのでdup2でfdをstdin, stdoutに複製する等の工夫が必要。
dup2の勉強になりました。
straw_clutcher
難易度:★★★★★ 概要:Heap Overflowでlibc leak, double freeからのfastbin attack。とにかくバイナリが複雑。
二度とやりたくないほど難しかったです。 こういうの自力で解けるようになるまで何年かかるんだろう。
genius
難易度:★★★★☆ 概要:テトリスゲームの2バイトだけ自由にバイナリを書き換えられる。memsetのGOTをsystemに向けて、テトリスのブロックを上手いこと並べて引数を作る。
テトリミノの並びでメモリ上にsh;
を作るというのが斬新でした。解いてて楽しかったです。
■ Aero CTF 2019
このCTFは参加しました。比較的guess要素が多かった気がします。 もうそろそろ最近のCTFに追いついて来たのでまだサーバーが動いていたりスコアサーバーから問題バイナリを落としたりできます。
pwn_warmup
難易度:★☆☆☆☆ 概要:off-by-nullのバッファオーバーフロー問題。
適当な文字をいっぱい送れば解けます。
navigation system
難易度:★★☆☆☆ 概要:Format String Exploitでグローバル変数を書き換える。
シンプルなFSB問題です。
engine script
難易度:★★★☆☆ 概要:独自VM問題。コードのサイズと命令セット的にbssセクション周辺しか読み書きできない。GOT書き換えでleakとoverwriteを2回に分けて実行する。
競技中に解けずwriteupもなかったので、もやもやしてた問題です。 writeupが無いので対象にはあたりませんが、気になっていたので挑戦したところ無事に解くことができました。 以前解けなかったものが解けるようになっていると楽しい。
■ Pragyan CTF 2019
海外のチームに協力してpwnをいくつか解いた記憶があります. なんかguess問が多いらしいですが,私の解いたpwnは普通だったと思います. ちょっと入学やら引越しやらで忙しかったので4月を過ぎてしまいましたが,久々にやっていきます.
Feed_me
難易度:★☆☆☆☆ 概要:Stack Overflowで変数を書き換え,条件を満たすようにする.
単純なバッファオーバーフロー問題ですが,特定の条件式を満たすようにローカル変数を上書きする必要があります. バッファオーバーフローを勉強したpwn初学者の腕試しに良いかもしれません.
Secret Keeper
問題バイナリが見つかりませんでしたが,これは確かUAFの問題でした. ユーザーを何個か作ってfastbinに上手く繋がるように削除してもう一回作ればrootユーザーが作れるみたいな感じだったと思います.
Armoury
難易度:★★★☆☆ 概要:FSBとStack Overflowを利用する.1回目のoverflowで破壊したcanaryを2回目のscanfで修復する.
scanfの性質を利用した問題です.
■ UTCTF
引越しで忙しかったですが最後の方だけ参加したCTFです. 問題がとても多くて,今見たらpwnもすごい多いですね. 最近CTFが多くて手を付けてない問題が溜まってますが頑張って消費していきます.
Baby Pwn
難易度:★★☆☆☆ 概要:スタックオーバーフローでシェルコードを実行する.
基礎的なオーバーフローです.
Baby Echo
難易度:★★☆☆☆ 概要:FSB問題.printfが1つなのでexitをmainに書き換えてlibc baseのリークとsystemの書き込みをする.
なんかctftimeにタグ付いてませんでしたが参加中に解いたのでpwnと分かりました. 他のCTFもタグ付いてなくて見逃した問題あるんだろうなぁ.
PPower enCryption
PowerPCの問題なので動かせませんでした.
Encryption Service
難易度:★★★★☆ 概要:ヒープ系のUse After Free脆弱性.細かいバグに気付けば割と簡単に解ける.
めっちゃ時間かかったけどそんなに難しくないと思うんでこういうのは解けるようになりたいです.
Jendy's
難易度:★★★★☆ 概要:ヒープ系の問題です.Linked Listを利用したoverlapで,最終的にFSBを使ってシェルを奪う.
最近時間が取れないので長い時間をかけてゆっくりと解きました. Linked Listの管理の問題を見つけてFSBと組み合わせて利用する問題で,なかなか面白かったです.
ECHO
問題バイナリが見つかりませんでした.
■ 0CTF/TCTF 2019 Quals
名前は知っていますが参加していません。
pwnがとても多いので心配です。
※問題バイナリが全然ありませんでした。
graneedさんが問題バイナリをすべて提供してくださいました。
ありがとうございます!
zerotask
難易度:★★★★☆ 概要:Race Conditionで頑張る。
baby_aegis
諦め。
plang
言語系なので対象外です。
scanner
諦め。
babyheap
難易度:★★★★★ 概要:consolidateで頑張ってoverlapさせる。
applepie
OSXなので対象外です。
Babysandbox
VM問なので対象外です。
■ Securinets CTF Quals 2019
このCTFは参加しました。 pwnはjail問が半分と、普通のpwnが半分という感じでした。
back to basics
問題バイナリが見つかりませんでした。
Baby one
難易度:★★★☆☆ 概要:スタックオーバーフローがあるが、rdxが0にされるためret2csuを使う必要がある。
面白い問題でした。
Simple
難易度:★★★☆☆ 概要:FSBがあるのでGOTを書き換える。printfは1回しかないのでmainを呼び出す。
Baby two
難易度:★★★★☆ 概要:スタックオーバーフローですが、write系命令が無いのでret2dl-resolveします。
競技中にころころバイナリが変わった問題です。
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バイト書き換えれば良い。
初心者向け問題です。
CyberRumble
難易度:★★☆☆☆ 概要:プログラミングミスをいくつか利用して任意のコマンドをsystem関数に渡します。
アセンブリをきちんと読めば解けます。
■ TyumenCTF 2019: Millennium
問題が登録されていませんでした。
■ April Fools' GTF 3rd 2019
問題が登録されていませんでした。 まぁこのCTFはpwnないと思う。
■ ENCRYPT CTF
やっとpwnにめぐり合えた。 参加したことはないですが、知らないCTFなので勝手に簡単と思っています。 問題+Dockerまで公開されているので大変よろしい。
pwn0
難易度:★☆☆☆☆ 概要:スタックオーバーフローで変数を書き換える。
超初心者向け問題です。
pwn1
難易度:★☆☆☆☆ 概要:スタックオーバーフローでリターンアドレスを書き換える。
初心者向け問題です。
pwn2
難易度:★★☆☆☆ 概要:スタックオーバーフローで引数を用意しつつsystem関数を呼び出す。もしくはシェルコードを実行する。
簡単な問題です。
pwn3
難易度:★★☆☆☆ 概要:スタックオーバーフローでlibcのアドレスをリークしてsystem("/bin/sh")を呼び出す。
やるだけ問題です。
pwn4
難易度:★★☆☆☆ 概要:スタックオーバーフローとFSBでSSPを回避しつつ関数を呼び出す。
比較的簡単な問題です。ptrlibにFSB機能が追加されました。
■ RADARCTF
pwn問がありませんでした。
■ Midnight Sun CTF 2019 Quals
海外チームで一応pwn担当として参加したのですが結局pwnは他の強い方々が解いちゃった。 なんか凄い難しいCTFだったので解けるか不安しか無いです。
Hfs-dos
問題バイナリが見つかりませんでした。
Hfsipc
問題バイナリが見つかりませんでした。
gissa2
難易度:★★★★☆ 概要:shortで保存される値がintで読み込めるので、サイズが大きくなりオーバーフローが発生。x32 ABIによりseccompを回避。
各段階に工夫が必要で面白かったです。
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にほぼ同じ問題がありましたね。
Slice of PIE
難易度:★★☆☆☆ 概要:スタックオーバーフロー。PIEが有効なのでvsyscallを呼びまくってスタック上にある補助関数まで持ってくる。
vsyscall知らなかったので勉強になりました。
Printf Polyglot
難易度:★★★☆☆ 概要:FSB問題。同じデータが2回printfに渡されるのでその2回でシェルを取る必要がある。
書き換えとシェル起動を行える書式文字列を作る必要がありますがptrlibがあれば脳死で解けます。
House of Horror
難易度:★★★☆☆ 概要:fastbinのヒープ問題。unsorted binでリークしてUAFで__malloc_hookを書き換えるだけ。
ヒープ慣れが見られる。
House of Horror 2
難易度:★★★☆☆ 概要:大きなサイズしか確保できないのでfastbinが使えないが、unsorted bin attackでglobal_max_fastを変更して無理やりfastbinを使う。
いろいろ工夫が必要で勉強になった上、凄い面白かったです。
Halcyon Heap
難易度:★★★☆☆ 概要:double freeのヒープ系問題。libc2.23でfastbinが使われるのでヒープでchunk overlapを起こしてlibcのアドレスをリークし、同様に__malloc_hookを書き換える。
tcache慣れするとfastbinが難しく感じますが、面白かったです。
■ 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が有効なスタックオーバーフロー問題として、シンプルな部類だと思います。
lemonshell
難易度:★★☆☆☆ 概要:シェルコード問題。execveが禁じられている。
いろいろ解き方はあると思いますが、私はexecveatで解きました。
NotSoEasy
難易度:★★☆☆☆ 概要:FSB問題。static linkなので注意。
GOTが使えなかったらどうするの?という問題ですね。
tudutudututu2
writeupが無いしCTFtimeにも載ってないので対象外ですが、せっかくバイナリあるし解きたい。 脆弱性が見つからないんですが、解ける方いたら教えてください。
hardmalloc
難易度:★★★☆☆ 概要:独自malloc問題。mallocにcanaryがあるのでリークしてから上書きする。
独自malloc問題を解くのは初めてですが、さくさく解けて面白かったです。
■ WPICTF 2019
知らないCTFです。
Remy's Epic Adventure
Windowsバイナリのため対象外です。
Source pt2
SSHサーバーが動いてないため解けません。
secureshell
難易度:★★☆☆☆ 概要:スタックオーバーフロー。randによる独自canaryだが、別の箇所で使われるrandの値からseedを予測できる。
今年初の独自canary問題です。頑張ってseedを求めます。
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
難易度:★☆☆☆☆ 概要:オーバーリードでスタック上のフラグを読む。
Pwntions 2
難易度:★☆☆☆☆ 概要:オーバーフローでスタック上の変数を変更する。
Pwntions 3
難易度:★☆☆☆☆ 概要:オーバーフローでリターンアドレスを変更する。
The great bank heist
問題バイナリが動きませんでした。
Are You Flipping Kidding Me?
難易度:★★★☆☆ 概要:任意の5ビットを反転できるサービス。頑張ってone gadget rceへつなげる。
試行錯誤が必要で面白かったです。
Baby's First Javascript Exploitation
writeupがありませんでした。
■ angstromCTF
zer0ptsで参加しました。 結構良問が多かったので個人的に好きなCTFです。
Aquarium
難易度:★☆☆☆☆ 概要:スタックオーバーフローでリターンアドレスを書き換える。
スタックオーバーフローで用意された関数を呼び出す問題です。
Chain Of Rope
難易度:★★☆☆☆ 概要:スタックオーバーフローでROPする。
ROPが学べる問題です。
Purchases
難易度:★★☆☆☆ 概要:FSBでGOTを書き換えて用意された関数へ飛ばす。
x64のFSBが学べる問題です。
PIE Shop
ブルートフォース問題なので飛ばします。
Over My Brain
難易度:★★★☆☆ 概要:brainf**kのエミュレータ。リターンアドレスを用意された関数へ書き換える。
内容自体はそんなに難しくないですが短いbrainf**kコードに収めるという点で難易度を上げました。
Returns
難易度:★★★☆☆ 概要:FSBがありますがflag関数がない。putsをmainに飛ばして適当にone gadgetへのアドレスを構成する。
個人的には簡単でしたがFSBが苦手な人にとっては辛いと思います。 そんな人のためにもptrlibには最近x64用のFSBモジュールが追加されたのでもう安心!(は?)
Server
難易度:★★★☆☆ 概要:アセンブリ製のhttpサーバー。なんやかんやで任意のsyscallが呼べる。
勝手にURL用バッファだけで解くという縛りを付けて解いてました。 脆弱性に気づけばそんなに難しくないと思います。 なお競技中はIDAの呪いでsyscallがしばらく見えてなかったので時間かかった。
Weeb Hunting
writeupが無いので対象外です。
■ ASIS CTF Quals 2019
ASISさんです。
Silk Road I
難易度:★★☆☆☆ 概要:Stack Overflow + 謎Reversing
Precise average
難易度:★★☆☆☆ 概要:scanfの性質を利用してcanaryを残したままオーバーフローする問題です。
pwn 101
難易度:★★★☆☆ 概要:off-by-one脆弱性を使うヒープ問です。
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を潰す。
一歩踏み込んだスタックオーバーフロー問題で面白かったです。
girlfriend
難易度:★★★☆☆ 概要:ヒープ系double free問題。libcが新しくtcacheにdouble free検知があるのでfastbinでごまかす。
libc-2.29は初めてで面白かったです。 これ競技中に解けたのはここまで数カ月頑張った成果ですね。
babyshell
難易度:★★☆☆☆ 概要:特定の文字コードのみでshellcodeを作る。
正攻法は予想外の方法でしたが、残念ながら抜け道があったので簡単でした。
blindpwn
問題バイナリがありませんでした。というかBlind系問題です。 writeupを読みましたが、libcが渡されているのでROP gadgetを探索せずに済みます。 競技中はBlind ROPでROP gadgetを探してましたがもっと簡単でした。
upxofcpp
難易度:★★★★☆ 概要:問題名通りC++製でUPX圧縮済み。UPXにするとほとんどRWX領域になるので単純なdouble freeでvtableをヒープのアドレスにしてshellcodeを実行する。
UPXの特性とC++の関数テーブルを利用した問題で面白かったです。
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なり何なりをする。
やるだけ問題。
ropberry
難易度:★★☆☆☆ 概要:リターンアドレスを書き換えてROPする。
やるだけ問題。
Intergover
難易度:★☆☆☆☆ 概要:242と入力するとシェルが取れる。
これがpwnとか訳分からん。
Signed or not signed
難易度:★☆☆☆☆ 概要:-666と入力するとシェルが取れる。
訳分からん。
Overcobol
■ TSG CTF
東大初の(CTFtimeに登録された)CTFですね。 残念ながら今年はまともに参加できませんでしたが、良問が多かったらしいので来年も是非開いてほしいです。
Odd Multiplier
競プロ要素があって解けないので飛ばします。
Super Smash Bros
難易度:★★★★★ 概要:ファイルシステムにヒープオーバーフローがある。ファイルをフォルダに変更してheapやlibcのアドレスをリークしていく。最後にTCache Poisoning。
脆弱性を見つけてもどう利用するかに悩まされ、すごい面白かったです。
Capacity Oriented Vector
諦め。
STLC
言語系なので対象外です。
■ DEF CON CTF Qualifier 2019
なんだかんだでDEF CONに参加したのは初めてな気がする。 超有名なので凄い良問ばかりを期待していたのですが、割とクソ問多いんだなーと思った記憶。
speedrun-001
難易度:★☆☆☆☆ 概要:スタックオーバーフロー。static linkなのでROPできる。
最初の5チーム以外は5点しか稼げないというクソ仕様やめてくれ。普通にFirst Bloodに点入れればいいじゃん。
speedrun-002
難易度:★★☆☆☆ 概要:スタックオーバーフロー。dynamic linkなのでlibc leakしてからROP。
speedrun-003
難易度:★★☆☆☆ 概要:シェルコード。サイズや条件があるので適当に作る。
speedrun-004
難易度:★★★☆☆ 概要:off-by-one。rbpの下位1バイトが書き換わるので後のleave; ret;でスタックポインタがバッファらへんに飛ぶ。
speedrun-005
難易度:★★☆☆☆ 概要:x64のFSB問題。一度に複数のアドレスに書き込む必要あり。
競技ではリモートとローカルのバイナリが違う&修正が入らないとかいう史上最悪のクソ問だったそうです。
speedrun-006
難易度:★★★☆☆ 概要:シェルコード問。int3が挿入されるのでreadでシェルコードを上書きするなどして適当に回避。
speedrun-007
難易度:★★☆☆☆ 概要:書き換えだけできるのでone gadgetに飛ぶようブルートフォースするだけのクソ問。
speedrun-008
バイナリどっかいったぞ...?
speedrun-009
難易度:★★☆☆☆ 概要:リーク用のFSBとROP用のBOFが用意されているので、やるだけ。
speedrun-010
難易度:★★☆☆☆ 概要:UAFでlibcのアドレスをリークし、さらに関数ポインタを書き換えてone gadgetを呼ぶ。
speedrun-011
難易度:★★★☆☆ 概要:シェルコード。seccompでread, write等が禁止される。time based attackするだけ。
speedrun-012
これもバイナリどっかいった。
babyheap
難易度:★★★☆☆ 概要:ヒープ系問題。off-by-oneがあるのでchunk overlapし、工夫して次のチャンクのfdを書き換える。
ひと工夫必要で面白かったです。
■ RCTF 2019
Harekaze CTFに出ていたのでほぼ参加していません。
babyheap
seccomp付きでfastbinも使えなくしといてbabyheapとか何考えてるんだろ。
shellcoder
やめ。
manynotes
諦め。
syscall_interface
対象外です。
chat
対象外です。
■ Harekaze CTF
このCTFは韓国の強い方々と合同で参加して優勝しました。 面白い問題ばかりでしたし、チームで協力して楽しかったです。
Baby ROP
難易度:★☆☆☆☆ 概要:スタックオーバーフロー。systemや/bin/shもあるのでret2pltするだけ。
初心者向けで大変やさしい。
Baby ROP 2
難易度:★★☆☆☆ 概要:スタックオーバーフロー。libc leakしてret2libcするだけ。
典型問題ですね。
Login System
難易度:★★★☆☆ 概要:scanfの書式文字列がsprintfで構成され、ユーザー入力が使われる。scanfでどうやってlibc leakするかの工夫が必要。
初めて見る形式で面白かったです。
Harekaze Note
難易度:★★★★☆ 概要:UAF。libc 2.29なのでfastbin dupを利用。あとノートのサイズが0x50バイトまでなのでいろいろ工夫する。
libcのアドレスを取るまでの流れが面白かったです。
Ramen
難しいので飛ばします。
■ Security Fest 2019
Cyber Mimic Defenseに出場していたので出られませんでした。 (TokyoWesternsは両方出てどっちも良い成績を残しているので怖い。) 問題回収しようと終了した次の日くらいにスコアサーバーを見に行くと既に落とされていましたが、megumishさんとgraneedさんに問題バイナリをいくつかいただきました。 ありがとうございます!
Baby1
難易度:★☆☆☆☆ 概要:スタックオーバーフローで特定の関数を呼び出す。
Baby2
難易度:★★☆☆☆ 概要:スタックオーバーフローでlibc leakしてシェルを取る。
Baby3
難易度:★★★☆☆ 概要:FSBでGOT overwriteする。
Baby4
難易度:★★☆☆☆ 概要:スタックオーバーリード&オーバーフローでlibc leak&canary leakしてシェルを取る。
libcが付いてなかったけどlibc databaseで見つかるやつなのだろうか。
Baby5
難易度:★★☆☆☆ 概要:単純なdouble freeがあるので、unsorted binでlibc baseを取ってtcache poisoningする。
こういうのをbabyheapって言うんだぞ。
Baby6
ARMバイナリのため対象外です。
Halleb3rry
問題バイナリが見つかりませんでした。
xtore
Kernel Exploitなので対象外。
Brainfuck64
Kernel Exploitなので対象外。
■ Facebook CTF 2019
これは参加しました。割と簡単なものから難しいものまであったと思います。
overfloat
難易度:★★☆☆☆ 概要:float型配列にオーバーフローがあります。
otp_server
難易度:★★★☆☆ 概要:sprintfの性質を利用してスタックオーバーフローする問題。
勉強になりました。競技中に東京サーバー用意してくれた運営ありがとう。
rank
難易度:★★★☆☆ 概要:ret2csuを使って解ける問題です。
ret2csuって現実的にはこういうときに役立つんだなぁ。
babylist
難易度:★★★★☆ 概要:vectorをmemcpyしちゃう脆弱性を持ったバイナリ。
C++は本当に分からない。公式writeupにはこれがEasyって書いてたので :thinking_face: です。
kpets
Kernel Exploit問なので対象外です。
rusty_shop
諦め。
asciishop
諦め。
raddest_db
諦め。
■ HSCTF 6
これも参加しました。割と初心者向けの問題が多かったと思います。
Return To Sender
難易度:★☆☆☆☆ 概要:スタックオーバーフローによりリターンアドレスを書き換える。
Combo Chain Lite
難易度:★☆☆☆☆ 概要:スタックオーバーフローによりリターンアドレスを書き換える。
Storytime
難易度:★★☆☆☆ 概要:スタックオーバーフローによりリターンアドレスを書き換える。
Combo Chain
難易度:★★☆☆☆ 概要:スタックオーバーフローによりリターンアドレスを書き換える。
Bit
難易度:★★☆☆☆ 概要:最大4ビット反転できるのでGOTを書き換える。
Byte
難易度:★★☆☆☆ 概要:FSBでアドレスをリークしたあとにそこを書き換える。
Caesar's Revenge
難易度:★★★☆☆ 概要:x64のFSB問題。
FSBは安定して解ける気がする。
Aria Writer
難易度:★★★☆☆ 概要:TCache PoisoningでGOTを書き換えてlibc leakおよびone gadgetを呼ぶ。
これくらいの難易度が体に良い。
Aria Writer v3
難易度:★★★☆☆ 概要:TCache Poisoningでbssに偽のチャンクを作ってlibc leakする。
なんで競技中に解けなかったんだろうってなるやつです。
Hard Heap
難易度:★★★★☆ 概要:UAFでheap leakしてoverlapでunsorted binに繋いでlibc leakし、さらにtop_chunkを書き換えて__malloc_hookを書き換える。
初めてやる手法で面白かったです。
■ 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できるため名前に偽のチャンクを置いておけば良い。
iz_heap_lv2
難易度:★★★☆☆ 概要:ヒープ系問題で、off-by-nullを使う。
解けた中では初off-by-nullだと思います。
babyshellcode
難易度:★★★☆☆ 概要:alarm以外禁止されているshellcodeで、メモリ上のxorされたフラグを読む。
Tokenizer
難易度:★★★☆☆ 概要:cstringで処理するためsaved rbpをstrsepで一部nullにできる。これを利用してバッファ中のROP chainにrbpを向ける。
prisonbreak
やめ。
■ Canadian Institute for Cybersecurity_Capture the Flag
問題も登録されてないしスコアサーバーもどこにあるのか分かりませんでした。
まとめと感想
とりあえず半分終わりましたが、難しい問題が積み上がっているので年末の悪夢になりそうです。 最初の目標であったpwn苦手意識の克服はできたと思います。 ただARMとかPowerPCのバイナリ降ってきたら解けませんし、Kernel Exploitも無理です。 まだ半年残ってるので頑張って続けていこうと思います。