我是靠谱客的博主 粗心橘子,这篇文章主要介绍根据虚拟地址获取实际地址,现在分享给大家,希望可以做个参考。

一、根据虚拟地址获取实际地址,根据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
2
readelf -l core.8344

在这里插入图片描述

调试core,获取数据虚拟地址。

在这里插入图片描述
在这里插入图片描述

拿到&pInt和pInt的虚拟地址

根据虚拟地址去查找实际地址。

复制代码
1
2
3
4
0x7fffffffdea8 虚拟地址 将之前获取的虚拟地址到实际地址的转化保存到一个文本里,然后搜索0x7fffffffdea8,找到符合的区间。如下图,就是我找到的区间。

在这里插入图片描述

复制代码
1
2
3
虚拟地址包含在0x00007ffffffde000 对应的实际地址0x000000000007c430

求取偏移,获取数据的实际位置。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
0x7fffffffdea8 - 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
10
0x5555555592a0 0x555555559000 0x4430 0x02a0 0x46d0 0x0000000000004430 0x00000000000046d0

在这里插入图片描述

总结

主要是验证下虚拟地址和实际地址的映射关系,实际上需求可能用不到,如果你可以调试的话,在虚拟地址里一样可以操作,gdb下x/32xg就可以打印二进制数据,等效于hexdump -s数据偏移 -n显示的字节数。

最后

以上就是粗心橘子最近收集整理的关于根据虚拟地址获取实际地址的全部内容,更多相关根据虚拟地址获取实际地址内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(79)

评论列表共有 0 条评论

立即
投稿
返回
顶部