概述
一、根据虚拟地址获取实际地址,根据gdb调试时候虚拟地址的位置获取实际地址的真实位置。
输入程序
用于测试
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *pInt = (int *)malloc(sizeof(int));
getchar();
*pInt = 3;
getchar();
free(pInt);
return 0;
}
gcc main.cpp -g -o main
产生core
在程序结束前第二个getchar时候手动gdb产生core
获取所有LOAD
readelf -l core.8344
调试core,获取数据虚拟地址。
拿到&pInt和pInt的虚拟地址
根据虚拟地址去查找实际地址。
0x7fffffffdea8
虚拟地址
将之前获取的虚拟地址到实际地址的转化保存到一个文本里,然后搜索0x7fffffffdea8,找到符合的区间。如下图,就是我找到的区间。
虚拟地址包含在0x00007ffffffde000
对应的实际地址0x000000000007c430
求取偏移,获取数据的实际位置。
0x7fffffffdea8
- 0x7ffffffde000
0x00000001FEA8
求出虚拟地址按照起始地址偏移了0x00000001FEA8
因为实际地址映射到虚拟地址上,因此虚拟地址偏移多少,实际地址就会偏移多少。
求取数据实际位置。
0x000000000007c430
+ 0x000000000001FEA8
0x000000000009C2D8
偏移获取文件数据。根据地址获取真实的数据。
hexdump -s0x000000000009C2D8 -n8 -C core.8344
发现好玩了吧根据int**的地址获取到的实际是int*的地址
我用的小端linux因此
实际的虚拟地址为0x00005555555592a0
64位所以我获取的长度是8位
练习
上边我获取了&pInt的地址证明了 &pInt地址实际包含的时pInt的地址,可以选择练习按照上述步骤获取pInt地址的内容。
模仿上边的步骤,你操作获取下0x00005555555592a0的数据。
0x5555555592a0
0x555555559000
0x4430
0x02a0
0x46d0
0x0000000000004430
0x00000000000046d0
总结
主要是验证下虚拟地址和实际地址的映射关系,实际上需求可能用不到,如果你可以调试的话,在虚拟地址里一样可以操作,gdb下x/32xg就可以打印二进制数据,等效于hexdump -s数据偏移 -n显示的字节数。
最后
以上就是粗心橘子为你收集整理的根据虚拟地址获取实际地址的全部内容,希望文章能够帮你解决根据虚拟地址获取实际地址所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复