『脆弱性』を利用したルート権限の乗っ取りって?
良く言われている
「『脆弱性』を利用してルート権限を横取りする」
バッファーオーバーフローって
どうやったら出来るのだろう…?
と言う訳で作ってみた。
※この表現は、多分に誤解されるなぁ…。
#include <stdio.h>
#include <stdarg.h>
void test(char*format,...)
{
va_list Args;
char buffer[8];
va_start(Args,format);
vsprintf(buffer,format,Args);
printf(buffer);
}
void weak(void)
{
printf("weak");
_asm pop eax
}
char string[8+4]="12345678";
void main(void)
{
*(long*)(string+8)=(long)weak;
test(string);
}
リリースモードでコンバートしないと正常に?
いや、目的通りの動作をしないよ。
デバッグモードでは、オート変数のメモリー確保が
異なるので…正常に動作してしまう。
正常に動作するのが…実は、バグ…。(笑
出力結果
123456780@weak
バッファーオーバーフローで
リターンアドレスを書き換えて
「weak」を実行している!
成功だ!
邦画ならここで
「やりましたね!博士!」
とか言われるのだが…。
※美人な助手から言われたい…。
…妄想は、置いといて…。
で、以下の条件が有る関数が
バッファーオーバーフローの脆弱性を
持つ事が分かった。
・入力バイト数が可変である。
(主に文字操作を行う関数になるでしょう…。)
・入力を受け取るバッファーがオート変数である。
(スタック上に無いとリターンアドレスを書き換えられなからねぇ…。)
・バッファーオーバーフローのチェックを行わない。
(※まあ、これが『脆弱』さ…ですなぁ。)
所で、『脆弱性』ってどうやって調べているのだろうか?
さぞかし、凄腕のプログラマーが
調べているとのかと思いきや…
誰にでも出来る!
のだ…。
例えば、HPで文字入力が可能な所に
1万文字とか1000万文字とかを放り込み
ハングアップしたら、そこが『脆弱』だ!
ね、誰にでも出来るでしょ!
ただ、実際にこのやり方でルート権限を取る場合には
入力データを細工するために色々知っている必要がある…。
それこそ、凄腕のプログラマーが作っているのでは?
取り敢えず疑問が晴れたので良しとする!
| 固定リンク
コメント