ELF解析02 - linker

news2024/11/19 17:32:55

01里面,我们看到了修改后的 ls 程序在 maps 里面的布局:

在 01 里面,我们说到,r—p 这个段是一个 padding 段,但是实际上不是的。

我们一行行介绍,从第一行看起:

5fde6d4000-5fde731000 r-xp 00000000 103:13 1450012 /data/local/tmp/ls 

这个显然是对应的:

第二行:

5fde731000-5fde734000 r--p 0005c000 103:13 1450012                       /data/local/tmp/ls

这个段的权限标志是 r-- ,这个与010中两个可加载段都不匹配,这是为啥呢?

其实,这个段是010中第二个可加载段的一部分,只不过它的权限被修改了。是被下面这个段修改的:

这个段描述的就是,在 elf 被重定位之后,将虚拟位置 5D660 且大小为 10656 字节的区域的权限改成只读的。

我们算一下:

且由于4kb对齐,所以5fde731000 就是需要被修改为只读的起始地址。

10656 的十六进制是29A0,对齐后是 3000,所以5fde731000-5fde734000 就是一个 r-- 段。

第三行:

5fde734000-5fde736000 rw-p 0005f000 103:13 1450012                       /data/local/tmp/ls

这就就是对应第二个可加载段中中间的一部分。

第四行:

5fde736000-5fde73a000 rw-p 00000000 00:00 0

这个就是第二个可加载段的结尾部分,为啥呢?而且它为啥没有对应的文件路径呢?

起始可以比对一下第二个可加载段的 RAM 大小,就知道这个段是第二个可加载段的结尾部分。至于为啥它没有名字,那是因为它的文件大小要小于映射后的 RAM 大小,所以RAM超出文件的部分就没有文件映射了,很奇特是不是?!!

下面进入正题。

Program Header

这个段里面就2块数据有用:

文件偏移与虚拟地址,它们都是40H,而且这个值与 elf_header 必须是相等的。这个值某种意义上就是 elf_header 的大小。那为啥还需要在这里再储存一次呢?

可以简单理解,是因为 linker 里面有一些指针指向的是 elf_header,而有些指针指向的是 program_header,互相转换的时候,会使用指针偏移来计算,偏移大小就是这里的 40H,所以就在这里也记录了值。

p_data 就是整个 program_header_table 的内容。

p_type 不知道有没有用,没试过改这里,假定有用吧。

Interpreter Path

这个段描述的是解释器路径:

这个段与上面的 Program Header 段必须要出现在可加载段前面。

这个段里面,我们只需要关注其 p_data,会发现它是一个字符串:

/system/bin/linker64

我们的手机上是有这个文件的。

ELF 的可加载段就是有这个文件来加载的,包括重定位操作等等。

既然ELF里面使用了一个路径来描述它,那么是不是意味着我们可以修改这个字符串,使用我们自定义的 linker 来加载 ELF 文件呢?

做如下操作:

  • 将 /system/bin/ls cp 到 /data/local/tmp/ls 位置

  • 将 /system/bin/linker64 copy 到 /data/local/tmp/er64 位置

  • 将 /data/local/tmp/ls 的这个段的加载器路径改为 /data/local/tmp/er64

  • 将 /data/local/tmp/er64 的入口地址改为死循环

注意加载器路径长度不能超过 p_filesz_SEGMENT_FILE_LENGTH 这个限制,而且要以 00 字节结尾。

修改完之后,我们再运行 /data/local/tmp/ls 程序,查看其 maps 文件信息:

5d2ab79000-5d2abd6000 r-xp 00000000 103:13 1450012                       /data/local/tmp/ls
5d2abd6000-5d2abdb000 rw-p 0005c000 103:13 1450012                       /data/local/tmp/ls
5d2abdb000-5d2abdf000 rw-p 00000000 00:00 0
73e9eee000-73e9eef000 r--p 00000000 00:00 0                              [vvar]
73e9eef000-73e9ef0000 r-xp 00000000 00:00 0                              [vdso]
73e9ef0000-73e9fe7000 r-xp 00000000 103:13 1450018                       /data/local/tmp/er64
73e9fe8000-73e9fed000 rw-p 000f7000 103:13 1450018                       /data/local/tmp/er64
73e9fed000-73ea061000 rw-p 00000000 00:00 0
7fcd826000-7fcd847000 rw-p 00000000 00:00 0                              [stack]

发现,相比之前少了很多东西,什么 libc 相关的东西都没有。

这个就是因为现在进程卡在了非常早的时机,连这个 ELF 文件自身的段的重定位都没有做,只是光将 ELF 文件中的东西放到内存里面了。

那么上面的信息中,前面两行里面,我们发现 ls 文件被加载了,这又是为啥?我们明明已经在 linker 的入口函数加了一个死循环,linker 根本不会执行加载逻辑才对。

其实是因为,这两个可执行段不是由 ls 中指定的 linker 加载的,而是其他进程中的 linker 加载的,现在先简单的理解为是 init 进程干的吧(虽然也不一定对,等后面搞os再研究,不知要到猴年马月)。剩下的其他 ELF 依赖文件,比如 libc 等将由路径中指定的 linker 来加载。

我们使用 IDA 来验证一下,先附加到进程:

可以看到,这里面就两个 so 被加载。

我们还原一下 linker 的入口地址指令,让其继续执行,并且在  ls 的入口地址加上断点。

按 F8 步过 linker_init,发现此时,linker 加载了很多的 so:

再按 F9 让程序执行到 ls 入口地址:

linker 的特点

它没有 imports:

因为它不依赖其他 so,它也不能依赖其他 so,因为它运行的时候,其他 so 都还没加载呢。比如 open 函数,它就不能使用 libc 中的 open 函数,它必须自己实现 open 函数才行。它必须实现所有自己需要的函数。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

洗地机什么牌子最好?洗地机口碑榜

洗地机融合了吸尘、拖地、洗地和消毒功能,实现了一体化的清洁解决方案。它能够同时进行多种清洁动作,从而在一次操作中高效完成吸尘、拖地、洗地和消毒清洁任务,大大提高了清洁效率。但是面对面目琳琅的洗地机,我们该如何去挑选呢…

CDMP考试解析:从报名到成功不走弯路

❤️CDMP数据管理专业认证是由DAMA国际于2004推出,是一项涵盖学历教育、工作经验和专业知识考试在内的综合资格认证,也是目前全球wei一数据管理方面权威性认证。 💰考试费用:CDMP的考试费用约为每科2500元。 其他可能的费用&#…

C语言KR圣经笔记 5.7多维数组 5.8指针数组初始化 5.9指针vs多维数组

5.7 多维数组 C 提供了矩形的多维数组,虽然实际上它们用得比指针数组少得多。本节我们将展示多维数组的一些特性。 考虑下日期转换的问题:把某月的第几天转换为当年的第几天,以及反向转换。例如,3月1日是非闰年的第60天&#xf…

CG Magic分享3d max渲染效果图时,不可忽略的灯光技巧!

一幅效果图是否能够呈现更完美,不止是完美的模型基础,而且灯光的设置也不能忽视。 尤其,对于3dmax室内灯光渲染还是很重要的,对于新手伙伴来说,可能会想到的3dmax怎么打灯渲染? 3dmax灯光渲染设置需要注意…

CSS基础笔记-01CSS概述

文章目录 前言CSS是什么CSS的作用CSS语法添加CSS的方法 前言 CSS是什么?有什么作用?怎么编写CSS?怎样添加CSS?本文对CSS的四个方面作了学习并形成学习笔记。 CSS是什么 CSS (Cascading Style Sheets,层叠…

vite环境变量的坑

最近在写项目的时候,遇到这么一个bug。直接看图: 这是我启动项目的时候vscode的提示: 然后默认自动打开浏览器 是不是发现bug了。你们绝对想不到这个bug是什么。我直接说吧。 这个bug来着一个环境变量,这个变量用来配置是否默认…

Mac 软件出现「意外退出」及「打不开」解决方法

Mac 软件出现「意外退出」及「打不开」解决方法 软件出现意外退出及软件损坏的情况,这是因为苹果删除了TNT的证书,所以大部分TNT破解的Mac软件会出现无法打开,提示意外退出。 终端需先安装Xcode或Apple命令行工具 如未装Xcode可以使用下列命…

SWM341系列之86盒智能开关应用

SWM341系列 86盒智能开关应用 华芯微特SWM341系列的SWM34SRET6,在86盒智能开关产品中的应用。 SWM34SRET6性能和UI的描述 SWM34SRET6是一款基于ARM Cortex-M33内核,最高主频可达150MHz时钟,提供内置512KB Flash,64KB SRAM&#…

给出一句话来描述想要的图片,就能从图库中搜出来符合要求的

介绍 地址:https://github.com/mazzzystar/Queryable The open-source code of Queryable, an iOS app, leverages the OpenAIs CLIP model to conduct offline searches in the Photos album. Unlike the category-based search model built into the iOS Photos…

js逆向第8例:猿人学第1题-js 混淆-源码乱码

题目1:抓取所有(5页)机票的价格,并计算所有机票价格的平均值,填入答案。 老规矩打开控制台调试,出现debugger 过掉这个很简单了,右键点击“一律不在此处暂停” 这样就可以查看具体的网络请求如下: m是加密值,熟悉的大佬能发现这串加密字符非常像md5,|后面的就是时…

linux 浅练一下哈

1.新建用户test不建家目录不允许登录,uid为10086_____________________ useradd -u 10086 -M -s /sbin/nologin 2.将 /opt 文件夹中所有文件的属主,属组改成,test_______________________ chown -R test.test /opt chown -R …

【基础篇】十三、强软弱虚引用、终结器引用

文章目录 0、相关🖊1、强引用2、软引用3、弱引用4、虚引用5、终结引用 关于对象能否被回收: 计数器可达性分析 还可以根据引用的类型,不同的引用类型,对应对象的不同GC回收规则。 0、相关🖊 📕【强软弱虚…

【HarmonyOS开发】ArkUI-X 跨平台框架(使用ArkTs开发AndroidIOS)

ArkUI-X 跨平台框架进一步将 ArkUI 开发框架扩展到了多个OS平台,目前支持OpenHarmony、HarmonyOS、Android、 iOS,后续会逐步增加更多平台支持。开发者基于一套主代码,就可以构建支持多平台的精美、高性能应用。 一、跨平台框架有哪些? 1、…

java发送邮件到qq邮箱

自己的授权码自己记好 引入依赖 <dependency><groupId>com.sun.mail</groupId><artifactId>javax.mail</artifactId><version>1.6.2</version> </dependency> <dependency><groupId>javax.mail</groupId>&…

[C#]使用OpenCvSharp实现区域文字提取

【官方框架地址】 github.com/shimat/opencvsharp 【算法介绍】 采用opencv算法实现文字区域提取&#xff0c;步骤如下&#xff1a; &#xff08;1&#xff09;形态学操作 &#xff08;2&#xff09;查找轮廓 &#xff08;3&#xff09;筛选那些面积小的 &#xff08;4&#…

【AI】人类视觉感知特性与深度学习模型(1/2)

目录 一、关于人类视觉感知 1.1 视觉关注 1.自上而下&#xff08;Top-down&#xff09;的视觉关注 ​编辑 2.自下而上&#xff08;Bottom-up&#xff09;的视觉关注 3.区别和记忆点 1.2 视觉掩盖 1.常见的视觉掩盖效应 2.恰可识别失真&#xff08;Just Noticeable Dif…

缓存数据库一致性问题

为什么使用缓存&#xff1f; 业务处于起步阶段&#xff0c;流量非常小&#xff0c;那无论是读请求还是写请求&#xff0c;直接操作数据库随着业务指数级增长&#xff0c;请求量剧增&#xff0c;直接访问数据库&#xff0c;导致性能急剧下降&#xff0c;需要引入缓存提高读性能…

win环境安装yarn脚手架

win环境安装yarn脚手架 1、安装命令 npm install -g yarn 2、查看安装的版本 yarn --version 报错了&#xff01;&#xff01;&#xff01; 解决方案 搜索​​ PowerShell​​&#xff0c;右键以管理员身份运行&#xff1b; 输入&#xff1a;​​set-ExecutionPolicy Remo…

知虾shopee数据:为卖家提供了丰富的数据分析工具

使用Shopee的卖家都知道&#xff0c;这个平台为卖家提供了丰富的数据分析工具&#xff0c;帮助他们更好地理解店铺运营状况和市场趋势。这些数据分析工具不仅能够提供数据总览&#xff0c;还包括买家分析、商品排名、分类排名、销售辅导、流量分析、销售结构、行销活动、聊天响…

性能优化-OpenMP概述(一)-宏观全面理解OpenMP

本文旨在从宏观角度来介绍OpenMP的原理、编程模型、以及在各个领域的应用、使用、希望读者能够从本文整体上了解OpenMP。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xff08;HPC&#xff09;开发基础…