mallocが使用するシステムコール
System Call Used Malloc
英語の記事のソースアドレス: mallocで使用されるシステムコール
この記事を読む前に、malloc
システムコールを使用してメモリを取得することを知っておく必要があります。次の画像に示すように、malloc
転送brk
またはmmap
システムはメモリを取得するために呼び出します。
brk : brk
追加することによりbrk
場所はカーネルからメモリを取得します(0で初期化されません)。最初は、ヒープの初期位置(start_brk
)と終了位置(brk
)は同じ場所を指しています。
-
when
ASLR
close、start_brk
withbrk
Will pointdata/bss
セグメントの終わり(end_data)。
-
when
ASLR
on、start_brk
withbrk
等しくなるdata/bss
セグメントの終わり(end_data)とランダムなbrkオフセット。
上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 }
出力分析:
-
増加する手順
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$
-
増加した後、以下の出力を見ることができます
heap
すでに持っているので、start_brk = end_data = 0x804b000
withbrk = 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
出力分析:
-
mmapの前に、以下の出力から、共有ライブラリに属していることがわかります。
libc.so
withld-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$
-
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です。
-
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
が閉じていることに注意してください。