私はヒープオーバーフロー攻撃の基本を学ぼうとしてきました。私は主に、攻撃の基礎としてチャンクメタデータの破損または変更を使用することに関心がありますが、他の提案も受け入れています。私のエクスプロイトの目標は、printf()
関数ポインターを関数ポインターのそれで上書きすることであるべきだと知っていますchallenge()
が、その書き込みを実現する方法がわからないようです。悪用したい次のコードがあります。これはmalloc
fromを使用していglibc 2.11.2
ます。
void challenge()
{
puts("you win\n");
}
int main(int argc, char **argv)
{
char *inputA, *inputB, *inputC;
inputA = malloc(32);
inputB = malloc(32);
inputC = malloc(32);
strcpy(inputA, argv[1]);
strcpy(inputB, argv[2]);
strcpy(inputC, argv[3]);
free(inputC);
free(inputB);
free(inputA);
printf("execute challenge to win\n");
}
明らかに、割り当てられたチャンクのメタデータの実際の上書きを実現することは簡単です。ただし、標準的な手法を使用してこのコードを悪用する方法を見つけることができませんでした。私は以下の手法を読み、実装しようとしました。
- 論文:ヒープオーバーフローに関するw00w00
- 論文は非常に明確ですが、この
unlink
手法はしばらくの間廃止されています。
- 論文は非常に明確ですが、この
- Malloc Maleficarum.txt
- このホワイトペーパーでは、w00w00の時代からのエクスプロイト手法を拡張し、新しいバージョンのglibcについて説明します。ただし、このペーパーで詳しく説明されている5つの手法を考えると、上記のコードがこれらの手法の前提条件のいずれにも一致することはわかりません。
- ヒープを壊して理解する(pdf)
- pdfは、ヒープがどのように機能するかについてかなり良いレビューを提供しますが、ダブルフリーテクニックに焦点を当てています。
私はもともと、inputCのチャンクのサイズ値を操作してこのコードを悪用しようとしたため、inputCチャンクの先頭を指すようになりました。それがうまくいかなかったとき、私はさらにinputBのチャンクを指してみました。そのとき、新しいglibcがサイズ値の健全性チェックを実行することに気付きました。
割り当てられたチャンクのメタデータを任意の値に編集し、GOTの値を上書きしたり、他の任意のアドレスに書き込んだりする機能があると仮定して、ユーザーはどのようにして無料を利用するエクスプロイトを作成できますか?
注:「任意のアドレス」を書き込む場合、メモリページは読み取り専用または保護されている可能性があることを理解しています。つまり、書き込み可能と見なすことができるアドレスを意味します。