きゅうり。

主にCTF関係のことを書いていく気がします

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を定義してるだけなので適宜置き換えてください。全部ローカルでのアドレスです。

後半のアドレス指定が雑感ハンパないのは許して。