ヒープオーバーフロー(弊研究室の某課題について考える9日目)

はじめに

この記事は弊研究室の某課題について考える9日目分の記事です。

SECCONお疲れさまでした。また今日からガンバリマス。え、私の戦果?クソ雑魚ナメクジですが???

ヒープの話というよりかはmallocの話ですね....

お品書き

  • Heapの仕組みとヒープBOF

Heapの仕組みとヒープBOF

ヒープを理解するうえで重要になるmallocソースコードこちら

関数の仕組みの記事で出した図ですがプログラムの実行時にはこのような配置になっています。今日はこのヒープセグメントに関するお話です。

f:id:kataware8136:20171202204359p:plain

ヒープとは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を使用した時にはあるルールに従ってヒープセグメントから領域を確保します。

ヒープの中身

そのヒープですがリスト構造になっています。そしてリストの各領域をチャンクと呼びます。

f:id:kataware8136:20171211141840p:plain

ヒープオーバーフローはスタックの時と同じで下の図のように確保した領域以外に書き込めるとデータ破壊等が発生するというものですね。おしまい!!!

f:id:kataware8136:20171211153651p:plain

スタックバッファオーバーフローと違うのは、スタックバッファオーバーフローはEIPを書き換えることによって制御を奪いますが、ヒープオーバーフローはアドレスを書き換えるだけです。アドレスを書き換えて任意のコマンドを実行させるにはGOToverwriteとかの攻撃テクニックが必要になるので今回はここまで

おわりに

内容少ないですがヒープオーバーフローの感じだけでもつかんでもらえればいいかなと