64bit、動的リンク、NX有効。0;}数値を入力して選択肢を選んでいるが数値のチェックが行われていないためアドレスのわかる関数なら任意の関数を実行することができる。自分はbufに関数のアドレスを置いてそこへのオフセットを入力することで関数を実行したが、PLTにある関数を直接呼ぶこともできるはず。%sでアドレスのリーク、%nで任意のアドレスへ書き込みが行える。よって、stackのアドレスをリークすることでROPを行うことができる。libcが与えられていないため、リークしたアドレスからlibc内にあるsystemなどの関数をオフセットから計算することはできない(ローカルでは使っているlibcがわかるため可能)。そこでret2dlresolveによって必要な関数のアドレスを解決させる。詳しい説明はももいろテクノロジーさんの記事に譲ります。bufに偽のシンボルテーブルを作り_dl_runtime_resolveの引数にそこへのオフセットを渡すことでsystem関数を解決させシェルを起動した。my_sandbox常設らしいけど今は運営されていないので書きます。32-bit、動的リンク、RELRO以外無効。libcが与えられているがおそらく古いため手元では使えない。Entered:FSBがある。これでlibcのアドレスをリークできる。最初に入力する名前は.bssに格納されるため__free_hookをそのアドレスで上書きしてシェルコードを実行した。32-bit、動的リンク、RELRO以外有効。enabledまず始めに(^V<>)からEを目指すゲームのようなものが現れる。これは適当にAにぶつからないようにEの方向に進めば高い確率で抜けられる。(w,a,s,d,q):次にKEYを聞かれる。0;}をしているのでこれをpythonに書き直して突破する。次に進むと時間外のためアクセスできないというメッセージが出る。TARDISSelection:コードに戻ってみるとudp通信をしていることがわかる(下図参照。socketの第二引数が2なのでudp)。通信先は127.0.0.1:1234。deniedは出ないで次に進める。CTF本番ではサーバ側からudp通信がされていたことを期待して手元からudpパケットを送った。追記:実際にudpパケットは送られていたらしい。正しい値が送られるのはCTF終了の20分前から。4)が繰り返されている(0x565b6bcbはその関数のアドレス)。alarmにこんな使い方があったか...ということでsockを0に書き換えてから数秒待ち、正しいtokenを送ると認証される。次は座標を与えると浮動小数点で表示する。1,1x座標とy座標をそれぞれ何かの値と比較している。左の分岐に行くとFSBの脆弱性がある。(jpはアンダーフローしたときに分岐する。デバッガでそれぞれの値を確認して入力したら左の分岐に行くことができた。あとはFSBを使ってret2dlresolveをしてシェルを起動する。main()本質はret2dlresolveなのに無駄なパートが多すぎる...3連続FSBというのも珍しい。RELROとSSPとNXとPIE有効。(1)はてなブログをはじめよう!h_nosonさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。