一、根据虚拟地址获取实际地址,根据gdb调试时候虚拟地址的位置获取实际地址的真实位置。
输入程序
用于测试
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#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
复制代码
1
2readelf -l core.8344
调试core,获取数据虚拟地址。
拿到&pInt和pInt的虚拟地址
根据虚拟地址去查找实际地址。
复制代码
1
2
3
40x7fffffffdea8 虚拟地址 将之前获取的虚拟地址到实际地址的转化保存到一个文本里,然后搜索0x7fffffffdea8,找到符合的区间。如下图,就是我找到的区间。
复制代码
1
2
3虚拟地址包含在0x00007ffffffde000 对应的实际地址0x000000000007c430
求取偏移,获取数据的实际位置。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
190x7fffffffdea8 - 0x7ffffffde000 0x00000001FEA8 求出虚拟地址按照起始地址偏移了0x00000001FEA8 因为实际地址映射到虚拟地址上,因此虚拟地址偏移多少,实际地址就会偏移多少。 求取数据实际位置。 0x000000000007c430 + 0x000000000001FEA8 0x000000000009C2D8 偏移获取文件数据。根据地址获取真实的数据。 hexdump -s0x000000000009C2D8 -n8 -C core.8344 发现好玩了吧根据int**的地址获取到的实际是int*的地址 我用的小端linux因此 实际的虚拟地址为0x00005555555592a0 64位所以我获取的长度是8位
练习
上边我获取了&pInt的地址证明了 &pInt地址实际包含的时pInt的地址,可以选择练习按照上述步骤获取pInt地址的内容。
模仿上边的步骤,你操作获取下0x00005555555592a0的数据。
复制代码
1
2
3
4
5
6
7
8
9
100x5555555592a0 0x555555559000 0x4430 0x02a0 0x46d0 0x0000000000004430 0x00000000000046d0
总结
主要是验证下虚拟地址和实际地址的映射关系,实际上需求可能用不到,如果你可以调试的话,在虚拟地址里一样可以操作,gdb下x/32xg就可以打印二进制数据,等效于hexdump -s数据偏移 -n显示的字节数。
最后
以上就是粗心橘子最近收集整理的关于根据虚拟地址获取实际地址的全部内容,更多相关根据虚拟地址获取实际地址内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复