What is it, naokirin?

読書「Haking:美しき策謀」 (1)

読書の秋。
ということで久々に

Hacking: 美しき策謀 ―脆弱性攻撃の理論と実際Hacking: 美しき策謀 ―脆弱性攻撃の理論と実際
(2005/06/20)
Jon Erickson

商品詳細を見る
という本を引っ張り出してきて読んでみる。


この本はいつ読んでも、どうしてそういう風になるかはわかるけど思いつきはしない、というものばかり。
これはパズルですね。


たとえばlibcへのリターン。

まずそもそもsystem()関数という関数の存在そのものを知らなかったのですが、その関数でどのようにroot権限でコマンドを実行させるかということを行っています。
大体シェルコードやメモリ上の命令を使ってハッキングを行う場合に問題になるのがNULLバイトの存在なんですが、上の話ではそれをprintf()関数で解決しています。

最終的には呼び出すのは標準のlibcだけとなり、スタック上でコードを実行することなく脆弱性攻撃を行うことができています。

関数呼び出しが行われる場合、スタック上は

関数のアドレス戻りアドレス引数1引数2・・・
となっていることと、フォーマット指定子の使い方として、"%m$n"とすることでm番目の引数を明示的に使うということを指定して"%n"でそのm番目の引数のアドレスが指す領域にこの指定子までの出力文字数を書き込むということを用いて、execl()関数の最後の引数がNULLバイト出なければならず、直接NULLバイトを用いれば処理がそこで終了してしまうという問題を解決しています。


やはり、まだまだ修行が足りないということをこういう部分では実感します(ただのアプリケーション開発するならそこまで必要な知識ではないでしょうが)。関数のボキャブラリが圧倒的に足りないのがその一因だとは思います。そして経験も足りません。

そんなこんなで今度からLinux系のC言語の関数の勉強を再開したいと思っています。
忙しい時期ですが今やらないとそれこそ勉強する時間はなくなると思うので、しっかりやっていこうと思います。

うーん、一時期はゲーム開発でもやってみようかとか思ってたんだけどなあ・・・。