malloc
FB招聘站
分类阅读
专栏
公开课
FIT 2019
企业服务
用户服务
搜索
投稿
登录
注册
Malloc两种内存获取方式的区别 Ox9A822016-11-04金币奖励+11共259352人围观 ,发现 5 个不明物体 系统安全终端安全
可能很多关注CTF Pwn赛题的赛棍们都有读过《Linux x86漏洞教程》这份资料,其实这份资料就是根据本文作者的博文翻译而来,可见作者很强大。这篇文章虽短但是条例很清晰,值得一看:)
既然你正在看这篇文章,那么你就应该知道malloc函数是通过syscall调用从操作系统获取内存的。 如下图所示,malloc是通过调用brk或mmap这两种syscall之一来获取内存的。
sGVsoF3VjOo5z1XDVPhU9dw.png
1.brk方式
brk:brk是通过增设程序断点来从内核获取内存(非清零)的。最初堆段的起点(start_brk)和堆段终点(brk)是指向相同的位置的。当ASLR关闭时,start_brk和brk将指向data/bss段(end_data)的末尾。当ASLR打开时,start_brk和brk的值将等于data/bss段(end_data)的结尾加上一个随机的brk偏移。
Image
正如上面的“进程虚拟内存布局”图展示的,start_brk是堆段的开始,brk(程序中断)是堆段的结尾。
例程如下:
/* sbrk and brk example */
#include
#include
#include
int main()
{
void *curr_brk, *tmp_brk = NULL;
printf("Welcome to sbrk example:%d\n", getpid());
/* sbrk(0)返回此进程的断点位置*/
tmp_brk = curr_brk = sbrk(0);
printf("Program Break Location1:%p\n", curr_brk);
getchar();
/* brk(addr)递增/递减程序的断点位置*/
brk(curr_brk+4096);
curr_brk = sbrk(0);
printf("Program break Location2:%p\n", curr_brk);
getchar();
brk(tmp_brk);
curr_brk = sbrk(0);
printf("Program Break Location3:%p\n", curr_brk);
getchar();
return 0;
}
输出分析:在增设程序中断之前,通过下面的输出,我们可以看到并没有堆段。
因此:• start_brk = brk = end_data = 0x804b000
sploitfun@sploitfun-VirtualBox:~/ptmalloc.ppt/syscalls$ ./sbrk
Welcome to sbrk example:6141
Program Break Location1:0x804b000
...
sploitfun@sploitfun-VirtualBox:~/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
...
sploitfun@sploitfun-VirtualBox:~/ptmalloc.ppt/syscalls$
在增设了程序断点后:在下面的输出我们可以观察到有堆段。
因此:• start_brk = end_data = 0x804b000• brk = 0x804c000
sploitfun@sploitfun-VirtualBox:~/ptmalloc.ppt/syscalls$ ./sbrk
Welcome to sbrk example:6141
Program Break Location1:0x804b000
Program Break Location2:0x804c000
...
sploitfun@sploitfun-VirtualBox:~/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
...
sploitfun@sploitfun-VirtualBox:~/ptmalloc.ppt/syscalls$
其中0804b000-0804c000是此堆段的虚拟地址范围
rw-p是Flags(可读,可写,不可执行,私有)
00000000是文件偏移 – 由于不存在文件映射,所以这里为零
00:00是主要/次要设备号 – 由于不存在文件映射,所以这里为零
0是Inode编号 – 由于不存在文件映射,所以这里为零
[heap]表示是堆段
2.mmap方式
mmap:malloc使用mmap去创建一个私有的匿名映射段。映射这个私有匿名段的主要目的是为了分配新的内存(已清零),并且这个新的内存将被调用进程独占使用。
例程:
/* Private anonymous mapping example using mmap syscall */
#include
#include
#include
#include
#include
#include
#include
void static inline errExit(const char* msg)
{
printf("%s failed. Exiting the process\n", msg);
exit(-1);
}
int main()
{
int ret = -1;
printf("Welcome to private anonymous mapping example::PID:%d\n", getpid());
printf("Before mmap\n");
getchar();
char* addr = NULL;
addr = mmap(NULL, (size_t)132*1024, PROT_READ|PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if (addr == MAP_FAILED)
errExit("mmap");
printf("After mmap\n");
getchar();
/* Unmap mapped region. */
ret = munmap(addr, (size_t)132*1024);
if(ret == -1)
errExit("munmap");
printf("After munmap\n");
getchar();
return 0;
}
输出分析:
mmap调用前:在下面的输出中,我们只能看到属于共享库libc.so和ld-linux.so的内存映射段
sploitfun@sploitfun-VirtualBox:~/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
...
sploitfun@sploitfun-VirtualBox:~/ptmalloc.ppt/syscalls$
mmap调用后:在下面的输出中,我们可以看到我们的内存映射段(b7e00000 – b7e21000,大小为132KB)与已映射的内存映射段(b7e21000 – b7e22000)拼接在一起了。
sploitfun@sploitfun-VirtualBox:~/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
...
sploitfun@sploitfun-VirtualBox:~/ptmalloc.ppt/syscalls$
其中b7e00000-b7e22000是此段的虚拟地址范围
rw-p是Flags(可读,可写,不可执行,私有)
00000000是文件偏移 – 由于不存在文件映射,所以这里为零
00:00是主要/次要设备号 – 由于不存在文件映射,所以这里为零
0是Inode编号 – 由于不存在文件映射,所以这里为零
munmap调用后:在下面的输出中,我们可以看到我们的内存映射段是未映射的,就是说其相应的内存已经释放到操作系统了。
sploitfun@sploitfun-VirtualBox:~/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
...
sploitfun@sploitfun-VirtualBox:~/ptmalloc.ppt/syscalls$
注意:在我们的示例程序中ASLR是关闭的。
原文地址
*本文作者:Ox9A82,转载请注明Freebuf(Freebuf.com)
Ox9A82
Ox9A82
1 篇文章
等级: 1级
||
上一篇:恶意软件作者演示愚蠢的加密错误,安全专家或可轻易破解下一篇:【漏洞预警】GitLab未授权访问漏洞可导致远程命令执行
发表评论已有 5 条评论
helloworld 2016-11-04回复 1楼
《Linux x86漏洞教程》这个没看过,没找到,给个地址呗?
亮了(4)
fangdangbuji (1级) 2016-11-04回复 2楼
这个翻译很粗暴啊。。。。这里是原文https://sploitfun.wordpress.com/2015/02/11/syscalls-used-by-malloc/
亮了(2)
fangdangbuji (1级) 2016-11-04回复 3楼
这种东西都能投稿啊。。。。醉了
亮了(3)
河蟹 2016-11-04回复 4楼
垃圾文章都能上
亮了(2)
Sarshes 2016-11-07回复 5楼
http://blog.163.com/xychenbaihu@yeah/blog/static/132229655201210975312473/
亮了(0)
昵称
请输入昵称
必须您当前尚未登录。登陆?注册邮箱
请输入邮箱地址
必须(保密)表情插图
有人回复时邮件通知我
Ox9A82
Ox9A82
Syclover&Nu1L
1
文章数
6
评论数
最近文章
Malloc两种内存获取方式的区别
2016.11.04
浏览更多
相关阅读
ShadowBroker是这样放大招的:Windows零日利用工具更多数据呈现Linux 恶意程序分析学习笔记Android N如何限制重置密码以遏制勒索软件分析一个用于传播Hancitor恶意软件的Word文档(第一部分)走近微软安全技术Shim
特别推荐
关注我们 分享每日精选文章
活动预告
11月
FreeBuf精品公开课·双11学习狂欢节 | 给努力的你打打气
已结束
10月
【16课时-连载中】挖掘CVE不是梦(系列课程2)
已结束
10月
【首节课仅需1元】挖掘CVE不是梦
已结束
9月
【已结束】自炼神兵之自动化批量刷SRC
已结束
FREEBUF免责声明协议条款关于我们加入我们广告及服务寻求报道广告合作联系我们友情链接关注我们
官方微信
新浪微博腾讯微博Twitter赞助商
Copyright © 2018 WWW.FREEBUF.COM All Rights Reserved 沪ICP备13033796号
css.php 正在加载中...0daybank
文章评论