DEFCON 2017 Quals 2017年5月1日
wasamusumeでDEFCON 2017 Qualsに参加した.
順位とかは確認できていない. どのくらいだろう.
自分はpwn3問を解いた.
[baby’s first] smashme
nxもpieもcanaryも何もない, やるだけの問題.
BOFがあり, ROPしてreadを読んでbssにシェルコードを設置し, そこに飛ばしてシェルを取った.
https://gist.github.com/ytn86/22b7be00aef59479f9a1aab2ada7767f#file-smashme-py
[pwnables] mute
シェルコードを送ると実行してくれる. ただしseccompにより以下のsyscallに限られている.
read, open, close, stat, fstat,lstat, poll, lseek, mmap, mprotect, munmap, brk, execve
read, open, (,close) だけでとけるんですが, 他のsyscallが許可されてるのはよくわからない.
作問者の意図が知りたいところ.
基本的には, たとえば
open(‘flag’. 0, 0);
が成功したら無限ループさせるようなコードを書くことで探索していく.
フラグについては1bitずつ探索するようにして自動化するべきだったんですが, 遅延かなんかでうまく行かなかったため,
1byteずつ気合で手動でにぶたんするという暴挙. つらい. シェルコードはこんな感じ.
The flag is: I thought what I’d do was, I’d pretend I was one of those deaf mutes d9099cd0d3e6cb47fe3a9b0e631901fa
[pwnables] peROPdo
名前を入力すると, サイコロが指定回数分ふることができる問題.
static linkかつstrippedなのでシンボル情報がないけど気合でなんとかなる.
nameの先頭4byteを別の変数にコピーし, unsigned intの値としてsrandに渡していることが分かる.
また, サイコロを振る回数が23以上だとスタックが壊れる.
サイコロを振るごとにrandが呼ばれており, スタックに値が置かれる. この値をなんとか操作して, leaveでnameが保存されているbssにpivotし, nameに含めたROP chainを実行させていくという方針で解いた.
いい感じのrandの値をもってくるところはcookiesがやってくれて非常に助かった.
リモートはchrootされているのかなんかで /bin/sh
が見つからない. なので open read writeした.
static link, strippedされるとつらいけどガジェットがたくさんあるのでROPがすごい楽.
初日に研究室BBQかぶっていることに気付いて12時間くらいロスしてしまった.
まぁGWだしそういうのもあるよね(震え声)
実質2人状態でやってたけど, まぁまぁ解けたのでよかった. ただもうちょっと解けた感もあるので, また精進しましょう.
…いい加減このブログにも証明書がほしいなぁ
Leave a Reply