blogこの広告は、90日以上更新していないブログに表示しています。medに参加いたしまして、CTFの中では珍しい部類に入るWindowsPwnについて学習しました。濃い内容ではあったのですが、自分なりに理解できたポイントをWriteUpという形でまとめたいと思います。・読むに当たっての前提breznのバイナリを解析し、選択肢毎の挙動を把握しているROPを理解している・brezn攻略のポイント1.fork-server型breznはfork-server型のバイナリです。バイナリを起動するとListen状態で接続を待ち構えます。APIMonitorを起動し、breznのPIDを確認します。-naoでPIDに紐づくポート番号を確認します。確認できたポート番号にncコマンドで接続することで処理が開始されます。2.TypeConfusion&BufferOverReadbreznには攻略に使用できる脆弱性が2つ存在します。Foodを選択した場合は、スロット内に作成されているFoodから指定されたFoodの情報を表示します。その際にユーザーから入力された情報を元に表示するFoodのタイプを決定して表示しています。0x403F90(*1)のフード情報表示処理内の該当箇所を示します。(*1)以降16進数のアドレス表記は断りがない場合IDAでバイナリを開いた場合のアドレスを指す物とします。この脆弱性を利用することでBrezelをInsertしたにも関わらずSemmelとして表示する。いった様な操作が可能となります。Foodはそれぞれサイズが異なるため挿入したFoodと異なるタイプを指定する事でBufferOverReadを発生させ、アドレスリークを発生させる事が出来そうです。3.UseAfterFree2つ目の脆弱性としてUseAfterFreeが存在します。該当箇所はロボット処理関数(0x401820)内のFoodの削除処理部分です。上記画像の通り、FoodをFreeした後に、deleteする処理が存在しません。このため、Free済のエリアへアクセス可能なポインタがVector内に残存している状態となっています。以上のポイントを元に攻撃手順を考えます。Food内に存在するTypeConfusion&BufferOverReadを利用して、アドレスリークを行う事を考えます。注意しなければならないポイントとしては、効率よくアドレスリークを行うためFree領域をダミーに確保させアドレスリークに用いるFood領域は隣接した領域に配置される様にします。アドレスリークに用いるFoodはSemmelとLaugenstangerlを使いましょう。Laugenstangerlはvtableのポインタ、Semmelはheapのアドレスが保存されています。LaugenstangerlとSemmelを隣接した領域に配置し、先述したBufferOverReadを利用してvtableのポインタ、heapアドレス二つのアドレスをリークする事を考えます。3-2.共有状態の作成アドレスリークに成功した後はeipを奪取し、制御を奪う事を考えます。ロボットにFoodを削除させる事でUseAfterFreeが発生する事、二つ以上のFoodを挿入しFreeする事で領域の結合が発生する事を利用します。結合した領域に対しEditFoodでの書き換えを行う事を目的としています。EditFoodは800バイトの受信を行なっているため、共有領域は800バイト以上のサイズでなければなりません。この攻撃を行うに当たってロボットが別プロセスで5秒毎に動作するという処理を利用しなければなりません。この処理を見逃してしまうとbreznを解く事は出来ませんので重要なポイントです。共有状態の作成についてイメージ図を示します。3-3.シェルコード実行ここまで準備が整えば書き込み可能となった領域にシェルコードを配置し、制御を奪う準備が整いました。StackPivotでheapを参照しているアドレスをespに移し替える事でheapをStackと見なして任意の処理を実行させる事を忘れずに組み込みます。heapを参照しているアドレスは0x401160(オーブン処理関数内)に存在します。最後に、idataをチェックし、シェル起動に有用な関数を探します。Collapseこのexploitを実行するとシェルが起動します(筆者がコネクトバック環境を持ち合わせていないので、ローカルでシェル起動確認)以上がbreznのwriteupとなります。学習要素の多い問題で、個人的には学びが多い問題だなと感じました。Windows問ですので、本番CTFに直結する可能性は低いのですが食わず嫌いをせずに解いてみる事をオススメいたします。katagaitaiのbataさんが素晴らしい資料を作成されています、リンクを掲載いたしますので是非目を通してみてください。World!月別アーカイブ参加グループプログラミングはてなブログをはじめよう!m00minpwnさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。