468pts)個人としては次の問題が解けました。468pts)まずは、CTFで問題を解くときの基本の問題文です(Pwnの場合はあまり関係ないですが。likvideraミニマルなブラウザをexploitするチャレンジみたいですね。upは別の記事で載せるため(あくまでも「つもり」です、強靭な気力があればいつかきっと。)、ここでは簡単な流れの解説のみを行います。pwn」と呼びます)です。pwnの問題は、ここ最近の大きめのCTFではちょくちょく出題されている形式で、大抵は主要ブラウザの大規模JSエンジン(V8やSpiderMonkeyなど)がターゲットになります。ELFバイナリで、JSエンジンにはduktapeが採用されていました。対応していない旨のエラーを表示というものでした。つぎに、ターゲットのバイナリに施されている保護機構を示します。(censored)続いて、問題の脆弱性の解析とそのexploitについて軽く解説します。pwnの問題には、脆弱性を埋め込むためのパッチファイルが添付されています。題意としては「脆弱性を作り込むパッチが当たった状態のJSエンジンをexploitしなさい」というものです。browserにも次のようなパッチが用意されていました。functionさて、このパッチを読むとターゲットのduktapeでは、TypedArrayに対してmidnight()というメソッドが実装されている対象のTypedArrayのsize、これに対応するArrayBufferのlengthフィールドをそれぞれ31337に設定するということがわかります。ちなみにTypedArrayによる値の読み書きは、内部的に対象のTypedArrayに対応するArrayBufferのindex番目に対してta.BYTES_PER_ELEMENT分の読み書きを行います。midnight()を呼び出した場合、実際に確保されているサイズはそのままの状態で、対象のTypedArrayのsizeと当該ArrayBufferのlengthが書き換わってしまいます。R/W)が可能となります。browserで問われている脆弱性はこれでした。以下に脆弱性を再現するためのPoCを示します。31337とても意図的でシンプルな脆弱性ですね。R/Wは強力なものですが、exploitationの目的である"/bin/sh"の起動の実現をするにはまだすこし弱いです。AAR/AAW)を実現するというものがあります。ta.BYTES_PER_ELEMENTに上書きすることで、当該プロセスの全メモリ空間で読み書きをすることが可能となります。addressOfArrayBufferを行ってから書き込む必要があります。以上でAAR/AAWが手に入りました。あとは書き込み先を考えるだけです。先に述べた保護機構の情報から以下のことがわかります。Read-Only)がないためGOTの領域が書き込み可能である。位置独立実行形式)ではない。バイナリのロードされるアドレスは固定であるため、書き込み対象のアドレスをリークする必要はない今回は次の手順で攻略しました。browserに時間はかけてしまったものの解けた点に関しては安心しました。チームとしては、上位に入ることができたのでよかったなあと思っています。browserが解けたあとで集中が切れてしまい、結果として1問だけしか解けていないという残念な結果になったため個人としての得点への貢献は薄くなってしまいました。次のCTFではうまいことテンポよく解いていきたいと思います。Inc.スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。