如何通过读取目标内存地址值获取second_type_t类型对象指针?
如何从指定地址读取值并转换为目标类型指针
问题背景
已知信息如下:
- 变量
target的值为0x52d000000938,由ctx + offset计算得出,伪代码:
int offset = calculate_offset(); type_t *ctx = get_ctx(); printf("[+] ctx + offset %p\n", ctx + offset);
当ctx = 0x52d000000410、offset = 1320时,输出结果为0x52d000000938。
- 通过GDB查看该地址存储的值:
gdb> x/g 0x52d000000938 0x52d000000938: 0x00007ffff702f820
0x00007ffff702f820指向一个second_type_t类型的对象。
需求:读取0x52d000000938地址的值,得到指向该对象的second_type_t类型指针。
实现方案
核心是通过指针类型转换和内存解引用完成,以下是几种可行写法:
1. 简洁写法
直接将target地址转换为指针的指针类型,解引用后再转换为目标类型:
// 已知target的数值为0x52d000000938 uintptr_t target = 0x52d000000938; // 读取target地址存储的指针值,再转换为second_type_t* second_type_t *obj_ptr = *(second_type_t**)target;
2. 分步清晰写法
拆分步骤,便于理解每一步的作用:
uintptr_t target = 0x52d000000938; // 第一步:读取target地址中存储的原始地址值 uintptr_t stored_addr = *(uintptr_t*)target; // 第二步:将原始地址转换为目标类型指针 second_type_t *obj_ptr = (second_type_t*)stored_addr;
3. GDB中验证方法
如果需要在调试时直接查看目标对象,可使用GDB的类型转换命令:
// 直接通过存储的地址查看对象内容 gdb> p *(second_type_t*)0x00007ffff702f820 // 间接通过target地址读取并转换 gdb> p *(second_type_t**)0x52d000000938
关键说明
0x52d000000938是一个存储指针的地址,必须先解引用它才能拿到指向second_type_t对象的指针值,再做类型转换。- 使用
uintptr_t是为了保证跨平台兼容性,它是C标准库定义的无符号整数类型,可完整存储任意指针值。
内容的提问来源于stack exchange,提问作者Fabio Xanti
相关产品推荐
相关产品推荐

