mallocが使用するシステムコール



System Call Used Malloc



英語の記事のソースアドレス: mallocで使用されるシステムコール

この記事を読む前に、mallocシステムコールを使用してメモリを取得することを知っておく必要があります。次の画像に示すように、malloc転送brkまたはmmapシステムはメモリを取得するために呼び出します。



brk
brk追加することによりbrk場所はカーネルからメモリを取得します(0で初期化されません)。最初は、ヒープの初期位置(start_brk)と終了位置(brk)は同じ場所を指しています。

  • when ASLR close、start_brk with brk Will point data/bssセグメントの終わり(end_data)。



  • when ASLR on、start_brk with brk等しくなるdata/bssセグメントの終わり(end_data)とランダムなbrkオフセット。

図15-1-6

Process virtual address layout-画像はstart_brkヒープセグメントの始まりであり、brk(プログラムブレーク)はヒープの終わりです。



例:

/* sbrk and brk examples */ #include #include #include int main() { void *curr_brk, *tmp_brk = NULL printf('Welcome to sbrk example:%d ', getpid()) /* sbrk(0) gives the break position of the program */ tmp_brk = curr_brk = sbrk(0) printf('Program Break Location1:%p ', curr_brk) getchar() /* brk(addr) Increase/decrease the break position of the program */ brk(curr_brk+4096) curr_brk = sbrk(0) printf('Program break Location2:%p ', curr_brk) getchar() brk(tmp_brk) curr_brk = sbrk(0) printf('Program Break Location3:%p ', curr_brk) getchar() return 0 }

出力分析:

  1. 増加する手順break前に、以下の観察を通して、heapセグメントがない、したがってstart_brk = brk = end_data = 0x804b000がないことがわかります。

    root@xxxxx:~/ptmalloc.ppt/syscalls$ ./sbrk Welcome to sbrk example:6141 Program Break Location1:0x804b000 ... root@xxxxx:~/ptmalloc.ppt/syscalls$ cat /proc/6141/maps ... 0804a000-0804b000 rw-p 00001000 08:01 539624 /home/sploitfun/ptmalloc.ppt/syscalls/sbrk b7e21000-b7e22000 rw-p 00000000 00:00 0 ... root@xxxxx:~/ptmalloc.ppt/syscalls$
  2. 増加した後、以下の出力を見ることができますheapすでに持っているので、start_brk = end_data = 0x804b000 with brk = 0x804c000

    root@xxxxx:~/ptmalloc.ppt/syscalls$ ./sbrk Welcome to sbrk example:6141 Program Break Location1:0x804b000 Program Break Location2:0x804c000 ... root@xxxxx:~/ptmalloc.ppt/syscalls$ cat /proc/6141/maps ... 0804a000-0804b000 rw-p 00001000 08:01 539624 /home/sploitfun/ptmalloc.ppt/syscalls/sbrk 0804b000-0804c000 rw-p 00000000 00:00 0 [heap] b7e21000-b7e22000 rw-p 00000000 00:00 0 ... root@xxxxx:~/ptmalloc.ppt/syscalls$

ここにある、

  • 0804b000-0804c000は、ヒープの仮想アドレスの開始/終了範囲です。
  • Rw-pは、読み取り、書き込み、実行可能、プライベート/共有のアクセス許可フラグです。
  • 00000000はファイルオフセットです–どのファイルからもマップされていないため、ここでは0です。
  • 00:00プライマリ/セカンダリデバイス番号–ファイルからのマッピングがないため、これは0です。
  • 0ノード番号–ファイルからのマッピングがないため0。
  • [ヒープ]ヒープの説明

mmap

malloc use mmapプライベートマップメモリ​​セグメントを作成します。目的は、新しいメモリ(0パディング)を申請することです。このメモリは、呼び出しプロセス専用になります。

例:

/* Create private memory using the mmap system call */ #include #include #include #include #include #include #include void static inline errExit(const char* msg) { printf('%s failed. Exiting the process ', msg) exit(-1) } int main() MAP_ANONYMOUS, -1, 0) if (addr == MAP_FAILED) errExit('mmap') printf('After mmap ') getchar() /* Unmap mapped region. */ ret = munmap(addr, (size_t)132*1024) if(ret == -1) errExit('munmap') printf('After munmap ') getchar() return 0

出力分析:

  1. mmapの前に、以下の出力から、共有ライブラリに属していることがわかります。libc.so with ld-linux.soメモリマップ:

    root@xxxxx:~/ptmalloc.ppt/syscalls$ cat /proc/6067/maps 08048000-08049000 r-xp 00000000 08:01 539691 /home/sploitfun/ptmalloc.ppt/syscalls/mmap 08049000-0804a000 r--p 00000000 08:01 539691 /home/sploitfun/ptmalloc.ppt/syscalls/mmap 0804a000-0804b000 rw-p 00001000 08:01 539691 /home/sploitfun/ptmalloc.ppt/syscalls/mmap b7e21000-b7e22000 rw-p 00000000 00:00 0 ... root@xxxxx:~/ptmalloc.ppt/syscalls$
  2. mmapの後、観察することにより、メモリマップセグメント(b7e00000-b7e22000、設定したサイズ132k)と既存のメモリマップ(b7e21000-b7e22000)が組み合わされていることがわかります。

    root@xxxxx:~/ptmalloc.ppt/syscalls$ cat /proc/6067/maps 08048000-08049000 r-xp 00000000 08:01 539691 /home/sploitfun/ptmalloc.ppt/syscalls/mmap 08049000-0804a000 r--p 00000000 08:01 539691 /home/sploitfun/ptmalloc.ppt/syscalls/mmap 0804a000-0804b000 rw-p 00001000 08:01 539691 /home/sploitfun/ptmalloc.ppt/syscalls/mmap b7e00000-b7e22000 rw-p 00000000 00:00 0 ... root@xxxxx:~/ptmalloc.ppt/syscalls$

ここに、

  • B7e00000-b7e22000セグメントの仮想アドレス
  • Rw-pは、読み取り、書き込み、実行可能、プライベート/共有のアクセス許可フラグです。
  • 00000000はファイルオフセットです–どのファイルからもマップされていないため、ここでは0です。
  • 00:00プライマリ/セカンダリデバイス番号–ファイルからのマッピングがないため、これは0です。
  • ファイルからのマッピングがないため、0は0です。
  1. munmapの後、メモリマップセグメントは以下の出力を介してオペレーティングシステムに返されました。

    root@xxxxx:~/ptmalloc.ppt/syscalls$ cat /proc/6067/maps 08048000-08049000 r-xp 00000000 08:01 539691 /home/sploitfun/ptmalloc.ppt/syscalls/mmap 08049000-0804a000 r--p 00000000 08:01 539691 /home/sploitfun/ptmalloc.ppt/syscalls/mmap 0804a000-0804b000 rw-p 00001000 08:01 539691 /home/sploitfun/ptmalloc.ppt/syscalls/mmap b7e21000-b7e22000 rw-p 00000000 00:00 0 ... root@xxxxx:~/ptmalloc.ppt/syscalls$

私たちのプログラムではASLRが閉じていることに注意してください。