2016年12月23日金曜日

fsbでELFファイルを引っこ抜いてみる

fsbでできることをとりあえず書いていく
まとめではないので、いつかはまとめたい。

SharifCTFのpwnで学んだことが一つあるのでそれについて。
Sharif CTF pwn 150点の問題の概要
「fsbが有って、それを使ってELFを引っこ抜いてpwnする!以上だ!」
みたいな感じだった(だった気がする、細かいことは気にしない)

個人的には、スタックのリークとアドレスの上書き(GOT Overwrite等)くらいかなと思ってたけど、ELFの引っこ抜きは盲点だった。
ってわけで、やってみる。

ELFファイルが実行されるときは、大体仮想アドレス上の0x400000に固定されて走る
ELFファイルもココに全部マッピングされる。

つまり、fsbで0x00400000から0x00410000くらいまでをリークすればELFファイル
を復元できる
(厳密には完全に復元できるわけじゃなく特定のセクション、今回は.textのみ復元できる)
.textが復元できれば、プログラムの構造がだいたいどんなふうに成っているか分かるし
pwnしやすくなる。

と言うわけでやっていきましょう。

このあたりから攻撃対象になるソースコードをコピペしてちょっと改造(面倒なので)
改造したのが上のソース、下のソースがELFのリークをするためのPythonコード
考え方は、以下の通り。


  1. 0x00400000は必ず固定であるととりあえず思っておく(PIEの場合は例外)
  2. 0x00400000から0x10000位を読み出すようにコードを書く
  3. リークされる
  4. 手元にELFバイナリができるので、後はバイナリを読むだけ
上記のコードでリークされたバイナリ(leakElf2)をBinaryNinjaで見てみる

_startは正常に見える。
BinaryNinjaはELFなんかおかしいぞ?といいつつ見れるようにしてくれているので最高。
さぁ、皆も買おう。
 main関数も正常。正しくリークできている。

次に、GOT(.got.pltセクション)も見てみる。
ココが見られると、色々嬉しい。
GOTがFullRELROでなければ、EIP取ったときに書き換えて、飛ばしたりできる。


ちゃんと取れてて嬉しい。

ソースからコンパイルした方の正規ファイルのGOT
ファイルなので、書き換えは行われていないけれど、
実行すると書き換えが起こって、正しくlibcのアドレスを指すようになる。


というわけで、fsb有って手元にバイナリがないなら、
とりあえずELFをリークしてみてはいかがでしょうか?

と言う選択肢を得たので次回からやってみる。

0 件のコメント:

コメントを投稿