ELF解析06 - 入口参数与傀儡进程

04 里面的重定位表没讲完,这里继续,我们说过重定位的类型有很多,04 里面基本只介绍了一种,就是 plt 表。重定位不仅仅发生在代码里面,还会发生在数据里面,比如so程序里面对一些全局变量的引用,它们的重定位信息是放在另外一个表里面:

对应 section 的:

里面的结构体与 rela.plt 的结构体是一样的。以第一项为例:

0x05D690 表示符号地址。

0x0403 表示符号重定位类型。由于它不属于符号表,所以索引为0。0x403 表示的重定位类型是:

#define R_GENERIC_RELATIVE  R_AARCH64_RELATIVE

对应的逻辑:

case R_GENERIC_RELATIVE:*reinterpret_cast<ElfW(Addr)*>(reloc) = (load_bias + addend);

load_bias,就是第一个可加载段所在的位置,需要是页对齐的,否则:

load_bias = phdr0_load_address - page_start(phdr0->p_vaddr)

所以,我们只需要在这个位置按照上面的方式计算好地址填进去就行。

打印一下 ls 这个 elf 有哪些类型:

rela.dyn type = 403 
rela.dyn type = 401

发现只有两种类型,非常nice。

0x401的逻辑如下(8.0 逻辑):

case R_GENERIC_GLOB_DAT:count_relocation(kRelocAbsolute);MARK(rel->r_offset);TRACE_TYPE(RELO, "RELO GLOB_DAT %16p <- %16p %s\n",reinterpret_cast<void*>(reloc),reinterpret_cast<void*>(sym_addr + addend), sym_name);*reinterpret_cast<ElfW(Addr)*>(reloc) = (sym_addr + addend);

8.0 相比 2.0 没啥变化,就是多了一个 addend。

傀儡进程

实验失败了,还没分析出问题,可以不用往下看

前面,我们分析了重定位表

  • rela.plt

  • rela.dyn

ls elf 文件里面的重定位类型一共有3种:

  • 0x401

  • 0x402

  • 0x403

我们可以手动将其重定位:

if (rela_type == 0x402)
{uint64_t *sym_save_addr = BASE + rela_ptr->r_offset;uint64_t relocation_type = rela_ptr->r_info & 0xFFFFFFFF;uint64_t symbol_index = rela_ptr->r_info >> 32;uint32_t table_index = symtab_addr[symbol_index].st_name;char *symbol_name = strtab_addr + table_index;// find symbol addrfor (size_t i = 0; i < needed_so_count; i++){void *symbol_addr = dlsym(needed_so_handles[5], symbol_name);if (symbol_addr != NULL){*(uint64_t *)sym_save_addr = (uint64_t)symbol_addr + rela_ptr->r_addend;printf("so name = %s, symbol name = %s, symbol_addr = %10lx\n", needed_so_names[i], symbol_name, *sym_save_addr);break;}}
}if (rela_type == 0x0403)
{uint64_t *target_addr = BASE + p_rela->r_offset;*target_addr = p_rela->r_addend + BASE;p_rela++;
}
else if (rela_type == 0x0401)
{// 现找到符号表地址,再加上 r_addend// find symbol addruint64_t symbol_index = p_rela->r_info >> 32;uint32_t table_index = symtab_addr[symbol_index].st_name;char *symbol_name = strtab_addr + table_index;for (size_t i = 0; i < needed_so_count; i++){void *symbol_addr = dlsym(needed_so_handles[5], symbol_name);if (symbol_addr != NULL){uint64_t *target_addr = BASE + p_rela->r_offset;*target_addr = p_rela->r_addend + symbol_addr;printf("so name = %s, symbol name = %s, symbol_addr = %10lx\n", needed_so_names[i], symbol_name, *target_addr);break;}}/* code */
}

主要是利用 dlopen 与 dlsym 这两个函数,从依赖的 so 文件里面定位到符号地址。拿到地址之后,就根据重定位类型回填符号地址就行。

做完之后,我们就可以主动调用入口地址,然后执行这个 elf 文件:

typedef int (*START)(int x0, int x1, int x2, int x3, int x4, int x5, int x6, int x7, int argc, char *argv, ...);START fun = (START)(ehdr->e_entry + BASE);fun(0, 0, 0, 0, 0, 0, 0, 0,1, cmd,0,0);

由于ls在执行的时候,是使用的栈来传递参数,所以我们使用额外的8个参数来占用寄存器,后面真正的参数 argc,argv 放在第9 与 10 位置,这样这两个参数就分配在了栈中。

我们将 ls 入口地址改成死循环,看一下栈中的数据,好模仿参数传递:

 

栈中,第一个参数是 1,第二个参数是一个地址,去地址看看:

第二个参数是字符串:/data/local/tmp/ls

后面是一些环境变量。也是放在栈中的。

参数都模仿好之后,调用入口地址,发现报了Segmentation fault ,用  IDA 调试发现是一个空指针错误,寄存器访问了一个 0 地址,搞到晚上1点了都没找到原因先放着了。

如果能成功运行,我们就可以将 ls 这个程序运行到我们的进程中,并执行里面的功能,非常的神奇。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/412007.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV——双边滤波

目录 一、双边滤波二、C代码三、python代码四、结果展示 OpenCV——双边滤波由CSDN点云侠原创。如果你不是在点云侠的博客中看到该文章&#xff0c;那么此处便是不要脸的爬虫与GPT。 一、双边滤波 双边滤波是一种综合考虑滤波器内图像空域信息和滤波器内图像像素灰度值相似性的…

通过开发一个桶装水上门送水订水小程序,可以解决哪些问题?

提高订水效率&#xff1a;用户可以直接在小程序上完成订水流程&#xff0c;无需拨打水站电话或前往水站&#xff0c;节省了用户的时间和精力。 方便管理用户信息&#xff1a;水站可以建立用户管理系统&#xff0c;对用户的订单信息、送水地址等进行管理&#xff0c;方便后续的送…

思绪记忆:伦敦金是以美元计价的黄金!

伦敦金是以美元计价的黄金衍生投资品种&#xff0c;是一种交易网络遍及各个主要市场的黄金保证金交易方式。目前投资者通过香港到伦敦金平台入市&#xff0c;只需要付出2%的保证金&#xff0c;就可以拥有一手100盎司、价值20多万的标准化黄金合约的交易权益&#xff0c;无论在涨…

使用 ClassFinal 对SpringBoot jar加密加固并进行机器绑定

写在前面&#xff1a;各位看到此博客的小伙伴&#xff0c;如有不对的地方请及时通过私信我或者评论此博客的方式指出&#xff0c;以免误人子弟。多谢&#xff01;如果我的博客对你有帮助&#xff0c;欢迎进行评论✏️✏️、点赞&#x1f44d;&#x1f44d;、收藏⭐️⭐️&#…

恒驰喜讯 | 荣获华为云优秀服务伙伴奖!华为云生态大会2024开启联合解决方案新篇章

1月15日-16日&#xff0c;以“领航新开局&#xff0c;共赢新生态”为主题的华为云生态大会2024在华为云贵安数据中心云上屯隆重启幕。华为云和全国生态伙伴、开发者&#xff0c;在新年伊始&#xff0c;共同见证华为云生态战略的新进展、伙伴政策的新升级&#xff0c;分享源自优…

7.图像验证码与cookie操作

有很多第三方的公司可以解决图像验证码问题&#xff0c;但是人家都需要费用&#xff0c;比如 云码 验证码识别价格_验证码识别费用多少钱-云码 超级鹰 超级鹰验证码识别-专业的验证码云端识别服务,让验证码识别更快速、更准确、更强大 如果不需要搞定太专业的验证码&#xff0…

Vue3 + Electron框架读取程序外部配置文件

网上找了一堆都不行&#xff0c;根据这个步骤来肯定能用 1. 在项目下新建一个config.json文件 2. json文件中写入一些配置 3. vue.config.js中配置打包时把config.json文件copy到应用目录下 pluginOptions:{electronBuilder:{nodeIntegration:true,builderOptions: {extraReso…

软件是什么?前端,后端,数据库

软件是什么&#xff1f; 由于很多东西没有实际接触&#xff0c;很难理解&#xff0c;对于软件的定义也是各种各样。但是我还是不理解&#xff0c;软件开发中的前端&#xff0c;后端&#xff0c;数据库到底有什么关系呢&#xff01; 这个问题足足困扰了三年半&#xff0c;练习时…

【数据结构】八大排序之计数排序算法

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 一.计数排序简介及思想 二.计数排序代码实现 三.计数排序复杂度分析 &#x1f4cc;时间复杂度 &#x1f4cc;空间复杂度 结语 一.计数排序简介及思想 计数排序(Cou…

7、DETR:基于Transformer的端到端目标检测

目录 一、论文题目 二、背景与动机 三、创新与卖点 四、具体实现细节 模型架构 简易代码 五、结论与展望 六、一些资料 一、论文题目 End-to-End Object Detection with Transformershttps://arxiv.org/abs/2005.12872 二、背景与动机 在计算机视觉领域&#xff0c;目标…

使用docker搭建LNMP架构

目录 环境准备 下载安装包 服务器环境 任务分析 nginx部分 建立工作目录 编写 Dockerfile 脚本 准备 nginx.conf 配置文件 生成镜像 创建自定义网络 启动镜像容器 验证nginx MySQL部分 建立工作目录 编写 Dockerfile 准备 my.cnf 配置文件 生成镜像 启动镜像…

如何利用SD-WAN升级企业网络,混合组网稳定性更高?

随着企业信息化的升级&#xff0c;传统网络架构已经无法满足企业复杂的、多样化的组网互联需求。 企业多样化的组网需求包括&#xff1a; 一是需要将各办公点互联起来进行数据传输、资源共享&#xff1b; 二是视频会议、ERP、OA、邮箱系统、云服务应用程序等访问需求&#xff…