ELF Hook原理


首先写一段C代码,用arm-linux-androideabi-gcc 编译成可执行文件:



图1. C代码Demo

arm-linux-androideabi-objdump -D 反汇编出所有的段,下面的截图,只截取我们感兴趣的几个段:


     .text 的<main>
     .plt 的 <strlen@plt>
     .got
     .rodata
     .data

1. int b = strlen(helloworld); 函数重定位:

     <main>:0x384 中的指令 bl 294   对应C代码中的strlen(helloworld);
     bl 294 的机器码是 eb ff ff ff c2, 其中 高8位 eb 是条件跳转指令,低24位是相对于当前PC的偏移地址,   偏移地址 = (目的地址 - 当前PC) >> 2 
     当前PC 等于当前指令的地址 + 8 所以:offset = (0x294 - (0x384+0x8)) >> 2

    (0x294 - ( 0x384 +  0x8) ) = 0xF8,  用24位补码表示就是FFFF08, 算术右移2位就是FFFFC2

    然后<strlen@plt>:294 位置 三条汇编指令,等价于 ip = pc + 0 ,  ip = ip + 0x1000, pc = [ip + 0xd60]
    也就是 将 (0x294 + 0x8) + 0x1000 + 0xd60 = 0x1FFC 指向的内存区的值取出来 赋给PC

    我们来看0x1FFC 是在 <_GLOABLE_OFFSET_TABLE>中的表项,内容是0x268, <__libc_init@plt-0x14>的地址,这个应该就是作lazy load用。
    再来看0x1FFC地址,图三中 .rel.plt 表 strlen函数对应的offset值。
    
2. int a = g_strlen(helloworld); 全局函数变量的重定位:
    对应的汇编代码在  <main>:0x368-0x378, 写成伪代码如下:

    0x368: r3 = [0x3a0] = 0x1c8c
    0x36c: r3 = pc + 0x1c8c =  0x36c + 0x08+ 0x1c8c = 0x2000
    0x370: r3 = [r3] = [0x2000]
    0x378: call r3 

    图三.rel.dyn 表中 offset = 0x2000 对应的sym name 为strlen. 
    图二中最后一行也可以看到对应0x2000 的值是0, 当linker链接后会置为符号strlen的实际地址.



图2. 反汇编代码



图3. ELF Header


[libElfHook Demo :  https://github.com/wadahana/ElfHook]

[ref : http://blog.csdn.net/l173864930/article/details/40507359]

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Elf_inject是一种恶意软件注入技术。它提供了一种将恶意代码注入到ELF(Executable and Linkable Format,可执行和可链接格式)文件中的方法,以实现对目标系统的攻击或控制。Elf_inject主要用于对Linux系统进行攻击,但在某些情况下也可用于其他操作系统。 Elf_inject的工作原理是通过修改目标ELF文件的代码段或数据段来实现注入恶意代码的目的。具体而言,它会将恶意代码插入到目标文件中的某个已存在的段或新创建的段中。恶意代码可以用来实现各种攻击行为,例如窃取敏感信息、植入后门、修改系统配置等。 为了实现注入,恶意软件通常会先寻找目标ELF文件中的一个合适的段,然后在该段中插入恶意代码。注入完成后,恶意代码就会融入到目标ELF文件中,并在被执行时被加载到内存中。注入后,恶意代码就可以在目标系统中进行活动,并可能对系统造成各种危害。 为了保护系统免受Elf_inject的攻击,可以采取一系列防御措施。首先,加强系统的安全性,包括及时更新和修补操作系统和软件漏洞,使用防火墙和入侵检测系统等。其次,限制可执行文件的访问权限,只允许可信的应用程序执行。此外,定期进行系统检查和杀毒扫描,以便及时发现和清除任何潜在的感染。 总之,Elf_inject是一种注入恶意代码的技术,用于对目标系统进行攻击或控制。为了保护系统免受此类攻击,用户应加强系统的安全性,并采取相应的防御措施。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值