まとめではないので、いつかはまとめたい。
SharifCTFのpwnで学んだことが一つあるのでそれについて。
Sharif CTF pwn 150点の問題の概要
「fsbが有って、それを使ってELFを引っこ抜いてpwnする!以上だ!」
みたいな感じだった(だった気がする、細かいことは気にしない)
個人的には、スタックのリークとアドレスの上書き(GOT Overwrite等)くらいかなと思ってたけど、ELFの引っこ抜きは盲点だった。
ってわけで、やってみる。
ELFファイルが実行されるときは、大体仮想アドレス上の0x400000に固定されて走る
ELFファイルもココに全部マッピングされる。
つまり、fsbで0x00400000から0x00410000くらいまでをリークすればELFファイル
を復元できる
(厳密には完全に復元できるわけじゃなく特定のセクション、今回は.textのみ復元できる)
.textが復元できれば、プログラムの構造がだいたいどんなふうに成っているか分かるし
pwnしやすくなる。
と言うわけでやっていきましょう。
このあたりから攻撃対象になるソースコードをコピペしてちょっと改造(面倒なので)
改造したのが上のソース、下のソースがELFのリークをするためのPythonコード
考え方は、以下の通り。
- 0x00400000は必ず固定であるととりあえず思っておく(PIEの場合は例外)
- 0x00400000から0x10000位を読み出すようにコードを書く
- リークされる
- 手元にELFバイナリができるので、後はバイナリを読むだけ
上記のコードでリークされたバイナリ(leakElf2)をBinaryNinjaで見てみる
_startは正常に見える。
BinaryNinjaはELFなんかおかしいぞ?といいつつ見れるようにしてくれているので最高。
さぁ、皆も買おう。
main関数も正常。正しくリークできている。
次に、GOT(.got.pltセクション)も見てみる。
ココが見られると、色々嬉しい。
GOTがFullRELROでなければ、EIP取ったときに書き換えて、飛ばしたりできる。
ソースからコンパイルした方の正規ファイルのGOT
ファイルなので、書き換えは行われていないけれど、
実行すると書き換えが起こって、正しくlibcのアドレスを指すようになる。
というわけで、fsb有って手元にバイナリがないなら、
とりあえずELFをリークしてみてはいかがでしょうか?
と言う選択肢を得たので次回からやってみる。
0 件のコメント:
コメントを投稿