いずれの問題もNXとASLRは有効である。NXが有効なため、スタック上ではシェルコードを実行できない。相当する箇所をsystem関数に書き換えておき、スタックを調整しておくことで、write関数が呼ばれた際にsystem("/bin/sh")が実行される。'__main__':main(sys.argv)これで、flagの読み込みが可能となった。#ropasaurusrex2ここから魔改造が始まる。Level2は、入力文字数が160bytesに制限されている。PivotによりROP領域を.bssに移して実行する。同様のやり方で/bin/shを奪取できた。'__main__':main(sys.argv)最初はbss領域の先頭にESPを持っていっていたため、system関数が呼ばれた後にESPが頭打ちとなり、SIGSEGVで動かなかったため、.bssの先頭から少し先のアドレスを設定する。ちなみにここからFlag名が簡単には推測できないようになっている。配下を見れなくなっている。以下2通りを考えたが、後者のやり方を実装することにした(mprotectは以前やったことあるのとggったらシェルコードが見つかったため)。.bss領域のRWX権限を書き換え、その領域でコードインジェクションを実行するディレクトリ読み出しとファイル読み出しのシェルコードは最初頑張って書いていたが、途中でなんとなくggったらすぐ見つかったので少し後悔した。(参考)read-dirのシェルコードread-fileのシェルコード追記:あとで伺ったところ、このread-dirのシェルコードもbataさんが書いたものだったらしい。実行する際のアドレスは、最初は末尾3ビットが"000"以外のところからやろうとしたら失敗していたため試行錯誤した。0x1000単位で実行してみるとうまく書き換わったため、ひとつ新しい発見になった。潰されており、libcの情報をリークできない。今回のバイナリはxinetd型で動いているため、ASLRの影響で接続する度にアドレス配置が変わる。Forceで突破して解いたことがあったため、これはピンときた。ベースアドレスをいくつか見てみる。f75dd000x86では、ランダマイズされるアドレス空間が狭い。末尾3bitも"000"で固定のため、今回はBruteForceでの突破のアプローチで攻める。上記のうち最小と最大のものの中間値(0xf75ab000)に固定し、読み出せるまでスクリプトを回した。アドレスは書き換える手間がないので、.bssに詰むものはシンプルになる。'__main__':main(sys.argv)これでLevel4についてもflagが取得できた。[])KeyboardInterrupt[root@ubuntu]ropasaurusrex5Level5.bataさん曰く、「libcは甘え」らしい(「libcは甘え」らしいorz)libcを使わずにExploitをしなければならない。今のところまだ解法が思いついていないので、今日の夜までに頑張ってみようと思う。サーバが落ちた後でも、ローカルでできたら追記する予定。追記:Level5も解けたため追記。最初は.text領域のROP芸のみでmprotectのシステムコールを呼び出しシェルコードを実行しようとしていたが、ROPガジェットが足りない。呼び出すことで全レジスタの値をStackから復元できることに気付く。sigreturnが呼び出された際には、Stack上の値を複数のレジスタに復元することができる。このときの構造は、sigcontext構造体の定義のとおりとなる。システムコール番号はこちらを参照した。mprotectを発生させてコードインジェクションというアプローチにする。Level3のときのmprotect呼び出し直前のレジスタの状態を見てみると以下のとおり。0x63しかし最初のsigreturn呼び出し時のeax(システムコール番号)のセット方法がよくわからない。ここで他の人の解法を参照してみると、Write関数で119文字書き込めると戻り値で119がセットされることがわかる。順番に呼び出すことにする。Level5は、256文字入力可能なため、mprotect発動までに利用できる領域は128bytes分である。mprotect後のリターンアドレスは、vuln関数へのポインタとなっているアドレスを指定し、ret2vulnにて再度read関数を実行させる。このreadで、RWX可能且つ使われていない領域にシェルコードを流し込み、実行する。'__main__':main(sys.argv)途中どうしてもうまくいかず悩んでいたが、bufとbuf2を送り込む前にsleepを入れると想定通りの挙動となった。今回の攻略は、リモートサーバが停止していたためローカルにて実施。配下が表示されていることがわかる。#sigreturn強い...。x64でもこれは使えそうだ。それにしても独学でやってきたBOFについて、ここまで丁寧に説明してもらえたことは今までのCTF活動の中で一番と言ってよいほど有意義だったと思う。このごろ燻ぶっていたけれど、久しぶりにやる気に火がついた気がした。学ぶことも多いし、周りのスピードも信じられないぐらい早い。そんな中でも、こんなに良いきっかけを与えたくれたkatagaitaiや運営の方々には大変感謝したい。今年中には、もっと高いところから取り組めるよう、また外に向かって良い貢献ができるよう、精進していこうと強く思う。modeの暗号文解読と改ざん現在、ブロック暗号ではAESが広く使われている。~夏の陣~昨日まで、都内某所でpwn合宿に参加してきたのでその感想を。feedme月別アーカイブ参加グループテクノロジーセキュリティはてなブログをはじめよう!f_rinさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。