vmmap介绍 当你用vmmap去查看一个正在运行的进程的时候。可以看到如下图,不同类型的内存使用采用不同的颜色标明。 那么VMMap这里所指的内存就是后备存储器为RAM, Paging File, 或者Mapped file。 VMMap分析内存泄露 笔者曾经有一次用过VMMap分析过内存泄露,但是最终问题并不是通过VMMap分析出来的,主要是因为当运行到比较长的时间的时候VMMap偶尔会出现崩溃的情况。 但是VMMap确实可以辅助分析出内存泄露问题,笔者也是将这个方法分享给大家。 下面是一段便于读者理解Vmmap分析方法的样例。 第二步 当运行程序,首先看到整个VMMap界面。这个时候映入眼帘的好多好多数据,该看什么呢?
最近在学习 Windows 内存管理时有人介绍了这款工具 VMMap。 它可以很方便的查看每一个进程的虚拟内存地址空间的状态,实际内部就是调用 VirtualQueryEx 实现的功能。
使用GDB的vmmap查看bss段权限 将shellcode数据写入到bss段 将程序溢出到上一步用户提交变量的地址 因为写入到bss段之后,关于read函数read(int fd,buf,size_t 用vmmap查看bss段权限 ?
将程序导入gdb并运行,ctrl+c将程序中断,利用vmmap查看地址段权限 $ gdb ret2sc gdb-peda$ r # ctrl + c gdb-peda$ vmmap 我们看到bss段是可写可执行的
对于iOS平台,除了Fish Hook的方式,还有一套使用门槛更低的工具链:MemGraph + vmmap + malloc_history MemGraph + vmmap + malloc_history 2)然后通过vmmap工具将快照文件按照VM ZONE进行分类。 到这里,我们通过vmmap --summary命令就得到了一个初步的分模块内存。而且所有模块内存相加等于游戏整体内存,没有遗漏。 并且vmmap工具给出的数据很清晰表示出内存的Dirty Size 和 Swapped Size,而Dirty Size + Swapped Size = FootPrint内存。 具体做法是: 先通过vmmap工具将VMALLOCATE中的所有内存地址打印出来。 然后通过malloc_history工具将内存地址转为分配堆栈。
init_options)); if (aa == 0) { //****1****初始化JSVM OH_JSVM_Init(&init_options); aa++; } g_vmMap memset(&options, 0, sizeof(options)); //****2****创建JSVM实例 status = OH_JSVM_CreateVM(&options, g_vmMap [ENVTAG_NUMBER]); //****3****创建JSVM作用域 status = OH_JSVM_OpenVMScope(*g_vmMap[ENVTAG_NUMBER], &g_vmScopeMap [coreEnvId]); g_vmMap[coreEnvId] = nullptr; g_vmMap.erase(coreEnvId); //删除回调 delete [] g_callBackStructMap sstream>#define LOG_TAG "TEST_TAG"using namespace std;// 定义map管理每个独立vm环境static map<int, JSVM_VM*> g_vmMap
可能这么说大家有点懵逼,不过没关系,可以借助 VMMap 工具观察。 开启多个 ConsoleApp6 进程观察 接下来反复点击 ConsoleApp6 生成多个实例,再次使用 VMMap 观察,截图如下: 三:总结 我尽最大努力通过多个观察工具用眼见为实的方式把这几个内存指标系统的说了一下
可能这么说大家有点懵逼,不过没关系,可以借助 VMMap 工具观察。 开启多个 ConsoleApp6 进程观察 接下来反复点击 ConsoleApp6 生成多个实例,再次使用 VMMap 观察,截图如下: 三:总结 我尽最大努力通过多个观察工具用眼见为实的方式把这几个内存指标系统的说了一下
我们还发现了最重要的切入点 get() 我的大刀已经饥渴难耐了 实例开始 step1 检查保护 step2 查看buf2 step3 查601080的段是否可执行 我们利用vmmap看看601080
可以看到只开启了nx保护 程序中有直接可以读取flag的get_flag函数,但这次我们使用mprotect的方式来直接拿shell 使用gdb中的vmmap先来看一下bss段的权限 ?
以前介绍过 VMMap 工具是可以查看一个进程中的虚拟内存信息的,其内部的实现原理就是调用 VirtualQueryEx 函数(支持查看其他进程)得到一个进程的虚拟内存信息。
利用思路 先使用cyclic测试出溢出点,构造初步的payload 确定程序中的溢出位,看是否可在bss段传入数据 使用GDB的vmmap查看bss段(一般为用户提交的变量在bss段中) 先发送为shellcode
本文的案例主要发生在Windows平台, 可以使用Windows自带的任务管理器和性能监视器或者sysinternals工具集中的Process Explorer和vmmap进行观察,首先区分出是常见的句柄泄露 <<vmmap分析内存泄露问题>>: 虽然也可以用来做内存泄露分析,但是一般本人喜欢用于做辅助分析,可以比较清晰的看出各种类型内存的动态变化。
— 0x0 # malloc的返回值 pwndbg> vmmap 0x7f4109f8c000 0x7f4109f90000 rw-p 4000 37000 /usr/lib/ — 0x0 # malloc的返回值 pwndbg> vmmap 0x7f4109f52000 0x7f4109f54000 rw-p 2000 0 [anon_7f4109f52 当我把payload的大小调整为0x200时,这个时候的内存布局如下: pwndbg> vmmap 0x7f94440ce000 0x7f94440d0000 rw-p 2000 另外需要考虑对齐的问题,堆分配到的地址不可能结尾地址为0xfb,所以还需要微调一下:envp[0x25 + 0xb8] = "\x28\x40\x40"; 再看一下内存结构: pwndbg> vmmap 我又查看了内存布局,在执行ld代码的时候,内存布局大致如下: pwndbg> vmmap 0x55985479c000 0x55985479e000 r--p 2000 0
调查此问题需要用到微软极品工具箱的 VMMap 工具 通过 vmmap 可以看到此时的应用的 Private Data 占用达到接近 3G 的大小,因此可以定位到 Xx 应用闪退的原因是因为申请内存超过 因此大概可以确定不是因为某个业务申请大量的内存导致内存泄露,至少不是申请托管内存 继续回到确定 OOM 导致的原因上,我重新运行 Xx 应用,通过 VMMap 工具不断按 F5 刷新,经过三个小时间断追踪 而不是快速就能定位出来,需要通过 VMMap 经过一段时间,按照小时为单位,看 Private Data 的占用,才能了解到是否内存泄露。 在 VMMap 工具上,通过 Private Data 的数据可以看到堆上有很多大小相同的数据,根据 Win32 内存调试的套路,基本上可以确定这就是某个相同的模块申请的,而且也没有释放 为了确定是哪个模块申请了某个非托管内存 不过我通过 VMMap 工具大概了解到方向了,于是就只使用三次。首次执行的命令和输出如下 0:024> !
0x104cc <main+28> mov r3, r0 0x104d0 <main+32> str r3, [r11, #-8] ... gef> vmmap
当您使用 Dagger 的多重绑定特性时,这是一个常常会遇到的问题,比如: class MyVMFactory @Inject constructor( private val vmMap: Map
利用MacOS堆的特性leak libsystem_c.dylib 查看程序运行时的vmmap,可以看到程序下方有个Malloc metadata的region,这里开头存放的就是DefaultZone 所以可以看下vmmap,确定下libsystem_c.dylib与libsystem_malloc.dylib加载地址,得到偏移量。 ->la_symbol_ptr = ' + hex(libsystem_c_exit_la_symbol_ptr)) # 发现libsyste_c.dylib等动态库DATA与TEXT段分离较远(vmmap
进行读取 读取的长度为256字节(0x100),由于read是底层的系统调用,所以此处不能武断的认为一定是调用了read,有可能是任何封装了read的函数(如 `fread` ),再通过gdb调试其程序vmmap
vdIn{ int fd; //设备描述符 char *videodevice; //设备节点,在linux下,通用的视频采集设备节点为/dev/video0 struct video_mmap vmmap