ARM ELF的函数重定位与x86是一致的,但由于汇编指令不同,再鼓捣一遍。

示例代码:

#include <stdio.h>
#include <stdlib.h> int main () {
puts ("Hello world");
sleep (1);
FILE *fp = fopen ("1.c", "r");
fclose (fp);
exit (0);
}

通过 readelf -r 可以查看ELF中所有需要重定位的函数,我们以fopen()函数为例,分析其重定位过程。

$ arm-linux-androideabi-readelf -r elf_2

Relocation section '.rel.plt' at offset 0x278 contains 7 entries:
Offset Info Type Sym.Value Sym. Name
00009ff4 00000516 R_ARM_JUMP_SLOT 00000000 fopen

首先main()函数中,通过 bl 82f4调用fopen(),82f4是一个16进制表示的地址,位于.plt节。

$ arm-linux-androideabi-objdump -d elf_2
000083c8 <main>:
...
8404: ebffffba bl 82f4 <fopen@plt>
 Disassembly of section .plt:

 000082f4 <fopen@plt>:
82f4: e28fc600 add ip, pc, #0, 12 @由于ARM三级流水,PC = 0x82f4 + 0x8
82f8: e28cca01 add ip, ip, #4096
82fc: e5bcfcf8 ldr pc, [ip, #3320]! @ip + 0xcf8 = 0x9ff4

以上三条指令执行完,从0x9ff4位置取值给pc,完成间接寻址的跳转。看一下0x9ff4处内容:

(gdb) p/x *0x9ff4
$1 = 0x82b0

程序跳转到0x82b0位置:

Disassembly of section .plt:

000082b0 <__libc_init@plt-0x14>:
82b0: e52de004 push {lr} ; (str lr, [sp, #-4]!)
82b4: e59fe004 ldr lr, [pc, #4] ; 82c0 <__libc_init@plt-0x4>
82b8: e08fe00e add lr, pc, lr
82bc: e5bef008 ldr pc, [lr, #8]!
82c0: 00001d18 andeq r1, r0, r8, lsl sp

可以看到,这是.plt节的开始位置,IDA帮助我们做了一些显示的优化,所以其汇编结果与objdump看到的不同,它假装替我们完成了GOT的重定位过程,实际并非如此:

@ida的显示结果
.got:00009FF4 fopen_ptr DCD __imp_fopen

下面解析一下.plt节开头的这几条指令:

@ 1. stack <- lr

@ 2. lr <- 0x1d18

@ 3. lr <- 0x82c0 + 0x1d18 = 0x9fd8

@ 4. pc <- [0x9fd8 + 0x8], lr <- 0x9fd8 + 0x8 = 0x9fe0

发现程序最终从0x9fe0地址处取值,并间接寻址将其作为地址跳转过去执行。使用gdb发现,此处静态值为0x0。显然这块地址内容,要由程序运行时动态补充的,否则这条指令将产生0地址访问异常。

(gdb) p/x *0x82c0
$1 = 0x1d18
(gdb) p/x *0x9fe0
$2 = 0x0
(gdb)

原来GOT的前3项,是为系统预留的(GOT[0][1][2]),其中GOT[1]中是ELF中所有动态库构成的链表的指针,GOT[2]是_dl_runtime_resolve函数指针。这个函数将具体完成函数的重定向过程,并将结果反馈到GOT表中。

因此上面静态分析时,GOT这3个表项是没有值的,它们由加载器动态填充。

以前画的x86的图,同样适应 ARM:

ARM ELF函数重定位的更多相关文章

  1. Linux pwn入门教程(10)——针对函数重定位流程的几种攻击

    作者:Tangerine@SAINTSEC 本系列的最后一篇 感谢各位看客的支持 感谢原作者的付出一直以来都有读者向笔者咨询教程系列问题,奈何该系列并非笔者所写[笔者仅为代发]且笔者功底薄弱,故无法解 ...

  2. CTF丨Linux Pwn入门教程:针对函数重定位流程的相关测试(下)

    Linux Pwn入门教程系列分享已接近尾声,本套课程是作者依据i春秋Pwn入门课程中的技术分类,并结合近几年赛事中出现的题目和文章整理出一份相对完整的Linux Pwn教程. 教程仅针对i386/a ...

  3. ELF学习--重定位文件

    add.c int data = 1;int bss;const int rodata = 1;int add(int num1, int num2){ int sum = 0; sum = num1 ...

  4. S3C2440—10.代码重定位

    文章目录 一.启动方式 1.1 NAND FLASH 启动 1.2 NOR FLASH 启动 二. 段的概念 2.1 重定位数据段 2.2 加载地址的引出 三.链接脚本 3.1 链接脚本的引入 3.2 ...

  5. 鸿蒙内核源码分析(重定位篇) | 与国际接轨的对外部发言人 | 百篇博客分析OpenHarmony源码 | v55.01

    百篇博客系列篇.本篇为: v55.xx 鸿蒙内核源码分析(重定位篇) | 与国际接轨的对外部发言人 | 51.c.h.o 加载运行相关篇为: v51.xx 鸿蒙内核源码分析(ELF格式篇) | 应用程 ...

  6. IOAPIC重定位中断处理函数思路整理

    因为小可并非硬件编程出身,汇编基础又比较差...所以刚开始理解利用IOAPIC重定位技术的时候相当困难. 何为IOAPIC? 首先,必须认识到它是一个硬件,可编程的硬件.我理解的它在整个流程中的作用如 ...

  7. ELF Format 笔记(十)—— 重定位(relocation)

    ilocker:关注 Android 安全(新手) QQ: 2597294287 重定位就是把符号引用与符号定义链接起来的过程,这也是 android linker 的主要工作之一. 当程序中调用一个 ...

  8. ELF 动态链接 - so 的 重定位表

    动态链接下,无论时可执行文件还是共享对象,一旦对其他共享对象有依赖,也就是所有导入的符号时,那么代码或数据中就会有对于导入符号的引用.而在编译时期这些导入符号的确切地址时未知的.只有在运行期才能确定真 ...

  9. 一款多功能的移动端滚动选择器,支持单选到多选、支持多级级联、提供自定义回调函数、提供update函数二次渲染、重定位函数、兼容pc端拖拽等等..

    https://github.com/onlyhom/mobileSelect.js/blob/master/docs/README-CN.md mobileSelect.js 一款多功能的移动端滚动 ...

随机推荐

  1. 微信小程序: rpx与px,rem相互转换

    官方上规定屏幕宽度为20rem,规定屏幕宽为750rpx,则1rem=750/20rpx. 微信官方建议视觉稿以iPhone 6为标准:在 iPhone6 上,屏幕宽度为375px,共有750个物理像 ...

  2. vue 添加vux

    1.命令添加vux npm install vux --save 2.在build/webpack.base.conf.js中配置 const vuxLoader = require('vux-loa ...

  3. linux系统用户和组管理

    用户和组管理 Linux是多用户多任务的网络操作系统,作为网络管理员,掌握用户的组的创建与管理至关重要. 学习要点: 了解用户和组的群的配置文件. 熟悉掌握Linux下用户的创建和维护管理. 熟悉掌握 ...

  4. css3 居中(推荐弹性盒模型方式)

    参考  http://www.zhihu.com/question/20774514 http://caibaojian.com/demo/flexbox/align-items.html 例子:ht ...

  5. C++构造函数和析构函数,以及构造函数特殊成员变量和函数的初始化

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  6. [Leetcode 104]求二叉树的深度Depth of BinaryTree

    [题目] Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the ...

  7. Toy Factory

    Factory is a design pattern in common usage. Please implement a ToyFactory which can generate proper ...

  8. MFC 中GetClientRect、ClientToScreen、GetWindow、RectScreenToClient的使用

    CWnd* pWnd = GetDlgItem(IDB_BUT_RECOGNIZE); pWnd->GetClientRect(&rect);   //指该控件自身客户区的矩形,原点为控 ...

  9. DevExpress ASP.NET v18.2新功能详解(四)

    行业领先的.NET界面控件2018年第二次重大更新——DevExpress v18.2日前正式发布,本站将以连载的形式为大家介绍新版本新功能.本文将介绍了DevExpress ASP.NET Cont ...

  10. Java Web相关概念调查