当前位置: 首页 > news >正文

营销型网站建设模板百度推广客户端怎么登陆

营销型网站建设模板,百度推广客户端怎么登陆,厦门市建设局,网站建设最新技术及发展趋势前言 一次意外执行了 malloc(0x5000)&#xff0c;结构使用 gdb 调试发现其分配的位置在 TLS 区域&#xff0c;这令我不解&#xff08;&#xff1a;最后去看了下 malloc 源码和 mmap 源码实现&#xff0c;发现似乎可能是 gdb 插件的问题&#xff0c;乐 场景复现 #include <…

前言

一次意外执行了 malloc(0x5000),结构使用 gdb 调试发现其分配的位置在 TLS 区域,这令我不解(:最后去看了下 malloc 源码和 mmap 源码实现,发现似乎可能gdb 插件的问题,乐

场景复现

#include <stdio.h>
int main() {malloc(0x5000);return 0;
}

调试:
在这里插入图片描述
wtf 不应该啊,这咋能分配到 tls 区域去了呢?

问题探索

通过对 malloc 源码的查看,发现其超过了 mmap_threshold,所有最后走的 mmap 映射的一段私有匿名区域(这里大家应该都很熟悉了)所以不应该分配到 tls 区域去啊,在与 henry 师傅交流后,觉得可能与 mmap 的行为有关,于是说干就干,简单地去审了一下 mmap 的源码,最后发现可能是插件的问题

mmap 源码分析就不写了,我也没做笔记,毕竟是开源的,需要时自己去看看就行了,而且我看完 mmap 源码时已经快凌晨 3 点了,就简单说下 mmap 是如何分配虚拟内存的。在内核态,为进程维护了一颗红黑树,其根据地址组织了空闲的 vma(struct vm_area_struct 结构体表示),而在我的 ubuntu 22.04 上,文件与匿名映射区是从高地址往低地址增长的,所以 mmap 在寻找虚拟内存区域时是从高地址往低地址扫描的

知道这之后一切都可以解释了,简单调试一下,啥也不执行,看下内存布局:把随机化关了,方便调试
在这里插入图片描述
可以看到在 tls 前后存在 0x17e0000x11000 的空间,我们来验证一下:

#include <stdio.h>
#include <sys/mman.h>
int main() {void *p0 = malloc(0x17e000-0x1000);void *p1 = mmap(0, 0x11000, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);printf("p0: %p\np1: %p\n", p0, p1);return 0;
}

我的机器上 mmap_threshold = 128kb,所以 malloc(0x11000-0x1000) 会走 brk,所以这里我直接使用 mmap

关于这里 malloc 分配为啥要减去 0x1000 请自行审计 sysmalloc 源码(大家应该比较熟悉)

调试结果如下:
在这里插入图片描述
可以看到 mmap0x11000 区域就是 tls 下方的区域,malloc0x17e000 就是 tls 前面的那块区域,这里的 gdb 插件把其当作 TLS 了似乎。当然这里可能就是 tls 预留的,我没有具体调试内核,仅仅静态分析了 mmap 的代码。当然我通过分配一些线程局部变量调整了一下 tls 区域的位置,然后也是这样的:

#include <sys/mman.h>
__thread char p0[0x17e000+0x1000];
int main() {void *p1 = mmap(0, 0x193000, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);printf("p0: %p\np1: %p\n", p0, p1);return 0;
}

调试结果:
在这里插入图片描述

所以当我们 malloc 超过 0x17e000-0x1000 时,就会在 libc 前面映射一段空间,也就是大家打 CTF 时说的 malloc 一块大堆块,会使用 mmaplibc 前面分配一个堆块,一般网上都是说分配 0x200000,其实自己简单算一算就知道了,验证一下:

#include <stdio.h>
#include <sys/mman.h>
int main() {void *p0 = malloc(0x17e000);printf("p0: %p\n", p0);return 0;
}

调试结果如下:
在这里插入图片描述
一切都是吻合的

一个有趣的 demo

这里给大家看一个 demo,感兴趣的可以自行研究下背后的原因

#include <stdio.h>
#include <stdint.h>
#include <string.h>int show() {FILE *maps_file;char line[256];char pathname[256];maps_file = fopen("/proc/self/maps", "r");if (maps_file == NULL) {perror("Failed to open /proc/self/maps");return 1;}while (fgets(line, sizeof(line), maps_file)) {if (sscanf(line, "%*x-%*x %*s %*x %*x:%*x %*u %s", pathname) == 1) {if (strcmp(pathname, "[stack]") == 0 || strcmp(pathname, "/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2") == 0) {printf("%s", line);}}}fclose(maps_file);return 0;
}int main() {uint64_t addr;show();puts("==========================================");scanf("%llx", &addr);*(uint64_t*)addr = 0xdeadbeef;puts("==========================================");show();return 0;
}

输出如下:
在这里插入图片描述

总结

mmap 的源码还是比较复杂的,我只是看了我感兴趣的部分,有兴趣的同学可以自己去看看源码,本来想说搭建环境调调 mmap 的,最后还是算了,太累了,睡觉了(:

当然这个东西本身连技术都不算,之所以记录一下,也算是回答自己刚开始学习时的一些疑问,记得当时看网上说 malloc 要分配 0x20000 才能够保证分配的空间在 libc 前面,其实根本没有问过自己为什么?也没有想过 mmap 底层是如何进行虚拟内存分配的?

当然其实现在来解决这些问题也挺好的,毕竟有一些基础,如果最开始就去看 mmap 的源码,相信我早就被劝退了

http://www.dt0577.cn/news/49941.html

相关文章:

  • 长沙网站优化方法今日国际新闻10条
  • 奶牛福利app导入色多多aso优化怎么做
  • 国外如何建立个人网站做市场推广应该掌握什么技巧
  • 厦门做网站公司有哪些做网站怎么做
  • 手机网站页面模板怎么给产品做网络推广
  • 烟台市科技局网站seo优化有哪些
  • 阿里云服务器网站开发谷歌推广新手教程
  • 如何做花店网站大数据技术主要学什么
  • 如何做团购网站中的美食地处地图功能免费推广网站地址大全
  • 房产网站建设的功能上海seo公司哪家好
  • 免费自助建站网站建设免费信息发布沈阳关键字优化公司
  • 设计网站页面教案百度收录规则2022
  • 用jsp做网站需要的知识谷歌广告投放步骤
  • 淘宝网站可以做轮播吗优化关键词的方法
  • wordpress邮箱验证登录页面网站seo优化多少钱
  • wordpress视频设置网站做优化
  • 做垃圾网站百度云服务器官网
  • 网站代码免费复制国内最近发生的重大新闻
  • 网站制作宜昌怎么做?苏州百度快照优化排名
  • 营销网站找什么公司做semen
  • c#做网站谷歌推广哪家好
  • php企业网站 源码成都计算机培训机构排名前十
  • 做一个网站前端页面多少钱下载百度app最新版并安装
  • 聊城 网站制作免费推广的网站
  • 宜昌市住房和城乡建设委员会网站浏览器下载大全
  • 医疗网站建设资讯推特最新消息今天
  • 有没有做相册的网站今日头条新闻最新
  • 建筑设计参考网站怎样免费给自己的公司做网站
  • 帝国做的网站怎么上传图片教你免费申请个人网站
  • 企业网站不被百度收录网络事件营销