Codegate 2016 OldSchool writeup
いわゆるbataさんのリストのeasyの問題。
チーム内の勉強会で解いたのでそのwrituepです。
まずは挙動確認
$ ./oldschool YOUR INPUT :hoge RESPONSE :hoge $ ./oldschool YOUR INPUT :%08x RESPONSE :000003fc
どうやら入力をそのまま返してくるだけのプログラムで、FSBがあります。
ちなみにソースコードも渡される?っぽいので、そっちを見ればFSBは自明です。
続いてセキュリティ機構のチェック。
CANARY : ENABLED FORTIFY : disabled NX : ENABLED PIE : disabled RELRO : disabled
NX有効。
方針
FSBがあるので、適当に情報をリークしてやればlibcのアドレスやstackのアドレスはわかりそう。各種アドレスがリークできれば、ret2libcでsystemを呼び出せば終わり。
ただし、これを実現するには2回FSBをする必要があります。(1回目でリーク、2回目でreturnアドレスの書き換え)
ですがプログラム自体はprintf(buf)直後に終了してしまうので、.fini_arrayを書き換えてmainをもう一度呼び出します。TW CTF 2016のgreetingを解いたことがあったのでここの発想はわりとすんなり出てきました。
あとはこれらを実装するだけ。
from m1z0r3 import * はsocket通信部分をpack, unpackを定義してるだけなので適宜置き換えてください。全部ローカルでのアドレスです。
後半のアドレス指定が雑感ハンパないのは許して。