はじめに
この記事は弊研究室の某課題について考える9日目分の記事です。
SECCONお疲れさまでした。また今日からガンバリマス。え、私の戦果?クソ雑魚ナメクジですが???
ヒープの話というよりかはmallocの話ですね....
お品書き
- Heapの仕組みとヒープBOF
Heapの仕組みとヒープBOF
ヒープを理解するうえで重要になるmallocのソースコードはこちら
関数の仕組みの記事で出した図ですがプログラムの実行時にはこのような配置になっています。今日はこのヒープセグメントに関するお話です。
ヒープとはmallocした時に確保される領域です。mallocして使い終わった領域はfreeして解放します。
#include<stdio.h> #include<string.h> #include<malloc.h> int main(int argc, char* argv[]){ char* ptr; ptr = (char*)malloc(20); strcpy(ptr,argv[1]); printf("%s\n", ptr); free(ptr); return 0; }
mallocを使用した時にはあるルールに従ってヒープセグメントから領域を確保します。
ヒープの中身
そのヒープですがリスト構造になっています。そしてリストの各領域をチャンクと呼びます。
ヒープオーバーフローはスタックの時と同じで下の図のように確保した領域以外に書き込めるとデータ破壊等が発生するというものですね。おしまい!!!
スタックバッファオーバーフローと違うのは、スタックバッファオーバーフローはEIPを書き換えることによって制御を奪いますが、ヒープオーバーフローはアドレスを書き換えるだけです。アドレスを書き換えて任意のコマンドを実行させるにはGOToverwriteとかの攻撃テクニックが必要になるので今回はここまで
おわりに
内容少ないですがヒープオーバーフローの感じだけでもつかんでもらえればいいかなと