前面的文章中,我已经介绍了如何调试被加壳的ELF,这里不在叙述,直接进入正题,以某加固为例,如何DUMP和修复被加壳的ELF,使其能调试加载

我们先来看看被加壳ELF的头和Program Header

首先我要让调试器停在入口点0x3860的位置

开始DUMP修复之旅,我的第一次DUMP修复的方法,延续了PE的思路,结果失败了

失败的原因并不是思路不对,而是细节上出现问题

第一次DUMP的方法:

1.废除不影响加载的section(直接把结构体填0),只关心PT_LOAD和PT_DYNAMIC两种类型节 2.计算DUMP文件最大值 align_up(0x28ca4, 0x8000) = 0x31000 3.将offset和va变成相等值,filesize和memsize按照align对齐 4.根据PT_LOAD节数据把数据DUMP出来,把DUMP数据放进文件里

那么根据上图描述数据,应该有两块儿

PT_LOAD : 0 ----align_up(0x12044, 0x8000) = 0 ----- 0x1B000

PT_LOAD : align_down(0x28ca4,0x1000) = 0x28000 ---- align_up(0x28ca4, 0x8000) = 0x31000

因为安卓也是linux内核,内存页对齐粒度为4K(0x1000)

按照上述方法DUMP完,我们来看看IDA加载以后,JNI_ONLOAD的样子

看下红色的部分,奇怪了,本来应该有的代码去哪里了??

0x221b0这个地址竟然无效

可是动态调试器中明明可以看到这段代码:

对照Program Header, 再看0x221b0这个地址,PT_LOAD节中并没有描述这个地址 所以,失败就是在这个地方,壳的代码里一定是mmap了这段内存,将解密后的数据,放进去,并修改了内存属性

通过跟踪壳代码,发现确实如此,壳代码通过svc 0,调用了mmap,mprotect两个函数

mmap(0x3000, 0x23710, 0x3, 0x32, 0xffffffff, 0x0)

map页属性:PROT_READ | PROT_WRITE

mprotect(0x3000, 0x23710, 0x5)

修改页属性:PROT_READ | PROT_EXEC 具体参数说明请参考帮助文档

这段区域起始地址:0x3000 大小:align_up(0x23710, 0x1000) = 0x24000 结束地址:0x3000 + 0x24000 = 0x27000 0x221b0这个地址正好在0x3000-–|0x27000这个范围里

通过上述过程,重新总结DUMP方法如下

废除不影响加载的section(直接把结构体填0),只关心PT_LOAD和PT_DYNAMIC两种类型节

计算DUMP文件最大值 align_up(0x28ca4, 0x8000) = 0x31000

只保留一个PT_LOAD节,从0到0x31000 将整块儿数据DUMP下来直接写入文件,修改align为0x1000,修改flag为RWE

修改PT_DYNAMIC节的offset,和VA相等 修复完的节表如下:

最后一个注意的地方,就是干掉INIT段或者是INIT_ARRAY段

干掉INIT方法:定位INIT描述的数据偏移,将偏移+8的数据,前移8个字节

干掉INIT_ARRAY方法:定位到VA处,按照结构,将数据填充为0xffffffff或者0

看下图,INIT段已经不存在了

我们来打开IDA,加载修复的文件,看看效果:

数据完整,再看看动态加载的效果

加载成功~~~

哈哈,至此,修复完成

linux srelf 加壳代码,浅谈被加壳ELF文件的DUMP修复相关推荐

  1. php项目css加载失败,浅谈CSS加载失败的6个原因

    在页面布局时,都主张结构与样式分离,但是有些时候,css样式不能成功加载,这是为什么呢?这篇文章主要讲了CSS加载失败的6个原因,有需要的朋友可以参考一下,希望对你有用. 有很多刚刚接触css的新手有 ...

  2. linux系统pkl,(网摘)Linux新手必看:浅谈如何学习linux

    地址:http://www.eimhe.com/bbs/viewthread.php?tid=53256&extra=page=1> Linux新手必看:浅谈如何教习linux 一.起步 ...

  3. python打开方式错误_浅谈python 调用open()打开文件时路径出错的原因

    昨晚搞鼓了一下python的open()打开文件 代码如下 def main(): infile =open("C:\Users\Spirit\Desktop\bc.txt",'r ...

  4. python open找不到文件的原因_浅谈python 调用open()打开文件时路径出错的原因

    昨晚搞鼓了一下python的open()打开文件 代码如下 def main(): infile =open("C:\Users\Spirit\Desktop\bc.txt",'r ...

  5. linux分区mapper,Linux系统/dev/mapper目录浅谈

    Linux系统的一般的文件系统名称类似于/dev/sda1或/dev/hda1,但是今天在进行系统维护的时候,利用df -h 命令敲出了/dev/mapper/VolGroup-lv_root和/de ...

  6. Linux系统分区和挂载浅谈

    好久没有写BLOG了,之前出差了2个月,都没怎么看书,也没有太多时间写.回来后一个月人也有点放松.现在开始还是得继续努力啊.不废话了,下面就介绍下Linux系统的分区和挂载 一 Linux的安装 Li ...

  7. Linux先发送条件变量,浅谈Linux条件变量的使用

    Linux线程同步之间存在多种机制,条件变量是一种类似操作系统里提到的生产者-消费者算法的同步机制,允许线程以无竞争的方式等待特定条件的发生. 示例伪代码: void* Thread1(void){ ...

  8. 嵌入式AI —— 6. 为糖葫芦加糖,浅谈深度学习中的数据增广

    没有读过本系列前几期文章的朋友,需要先回顾下已发表的文章: 开篇大吉 集成AI模块到系统中 模型的部署 CMSIS-NN介绍 从穿糖葫芦到织深度神经网络 又和大家见面了,上次本程序猿介绍了CMSIS- ...

  9. linux中initrd的含义,浅谈linux启动的那些事(initrd.img)

    本文记录下linux系统的启动过程,分析下每一步都作了什么.linux 1.linux系统的启动过程小程序 1.加载BIOS,上电自检.由于BIOS中包含了CPU的相关信息.设备启动顺序信息.硬盘信息 ...

最新文章

  1. 8天后,有份独家小程序数据分析报告重磅来袭
  2. 跳转控制语句 break || continue || goto
  3. sql 删除用户失败
  4. TiDB 官方设计文档翻译(三)
  5. hust1341(模拟)
  6. HTML知识点总结之ul,ol,li标签
  7. C++ setw和setfill
  8. C#链接mysql 新手容易出错的问题
  9. Vue 自定义组件 —— slot插槽
  10. 使用Python将字符串转换为格式化的日期时间字符串
  11. win7打开chm文件问题解决之道
  12. Linux常用基本命令( rmdir, rm, mv )
  13. Linux gcc编译时强制链接并依赖一个库(即使未使用)
  14. python xps_XPS 15 9560 安装 Ubuntu 18.04
  15. 修改mysql.sock路径_mysql错误-修改mysql.sock位置
  16. Python基础(8)字符串及常用操作
  17. 使用pyautogui库实现简单的微信朋友圈自动点赞
  18. STM32定时器的定时时间设置
  19. 直播回顾 | BPM平台与微服务架构天生契合(附资料下载)_Nebulogy_纳比云
  20. 华米Amazfit GTS 2e用续航和高性价比征服外媒

热门文章

  1. JavaScript学习总结(3)——JavaScript函数(function)
  2. 定量库存控制模型_供应链分析:关于库存管理的预测功能(1)
  3. mysql 连接字符集_MySQL字符集详解
  4. 检查eth是否到账_税务检查视角:高新技术企业核查要点
  5. VMware workstation9 Virtual Machine Network
  6. php程序设计经典300例,第16-20例
  7. IOS解惑(1)之@property(nonatomic,getter=isOn) BOOL on;中的getter解惑
  8. VTP冲突的排查与解决
  9. 使用FileZilla连接Linux
  10. collections 模块:更多数据结构