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