0x00 什么是壳

壳是另外在PE文件中包含的代码,并且不影响PE文件正常的执行。而壳也分为很多种,这里从UPX壳开始介绍。

0x01 压缩壳

压缩的分类

压缩的目的就是将体积大的可执行文件缩小的过程。分为损失压缩非损失压缩两种。损失压缩是指不能100%还原的压缩,常见的有JPG,MP4等格式。非损失压缩就是可以100%还原的压缩方式,一般有ZIP,7z等格式。

压缩壳

压缩壳的目的就是将PE文件变小。压缩有UPX, ASPack等方式。

Run-Time Packing

将原本的可执行文件的代码和数据压缩之后加入解压代码。压缩后的可执行文件很难进行静态分析。
可执行文件的起始地址称为OEP
压缩后的可执行文件起始地址称为EP

Unpacking

unpacking就是将packing后的可执行文件还原的过程,一般有以下几个步骤。

  • 找出解除压缩时的地址
  • 在压缩后的可执行文件中找出OEP地址
  • 找到OEP地址中断后取得原本可执行文件的内存数据
  • 最后将内存数据以可执行文件的方式重新整合

0x02 实验需要用到的工具

UPX: 用于压缩
https://github.com/upx/upx
OllyDumpEx: 找到OEP后可以直接通过这个工具还原导入表
https://low-priority.appspot.com/ollydumpex/

0x03 开始实验

首先准备个C语言的简单程序

#include<stdio.h>int add(int a, int b) {return a + b;
}int a = 0x11;int main() {printf("Hello World!\n");add(a, 0x22);return 0;
}

找到可执行文件之后拖入DIE后看一下程序大小

然后用UPX加了压缩壳之后的文件进行对比

可以发现经过压缩之后的可执行文件大小缩小了,这里可以用HxD打开看一下。之前的data,bss段等都被UPX0,UPX1代替,只有rsrc段和压缩前相同。

0x04 ESP定律

由于在程序自解密或者自解压过程中, 不少壳会先将当前寄存器状态压栈, 如使用pushad, 在解压结束后, 会将之前的寄存器值出栈, 如使用popad. 因此在寄存器出栈时, 往往程序代码被恢复, 此时硬件断点触发. 然后在程序当前位置, 只需要少许单步操作, 就很容易到达正确的 OEP 位置.
ESP定律法 - CTF WIKI

首先打开经过upx压缩过的程序,F9来到程序起始的位置,并且F8单步执行pushad指令保存寄存器状态。观察旁边寄存器的状态可以得知,ESP的值发生了变化。

在寄存器视图中右键在ESP上设置断点。然后按下F9前往ESP所指向的地址。

跳转到00AD7FEF之后观察这里的汇编代码,我们会发现在00AD7FFC处有一个jmp指令,这是一次大跳转,极有可能是OEP所处的地址。在00AD7FFC处设置断点,F9运行至此处。

按下F8单步进入,下面这个00AD1633就是OEP的位置。

最后来恢复整个程序,在插件中使用Dump process,选择Get EIP as OEP,最后Dump文件并保存。


但是有时会出现Dump了程序却依然无法打开的情况,这是因为在Dump程序的过程中IAT表可能出现了丢失的情况。这个时候用Scylla来修复IAT表,在入OEP的位置打开Scylla,按下IAT Autosearch -> Get Imports 将 Import 中红色的部分删去最后再Fix Dump覆盖之前的程序,或者是重新生成一个Dump的程序。

如果文章中存在错误,请评论或者私信我

【How2RE】 UPX壳及脱壳方式相关推荐

  1. Android 加壳与脱壳方式总结

    介绍 说到加壳,之前接触的主要都是pc端的壳,当时的脱壳就是用的esp脱壳法,大概意思就是程序运行到将当前环境保存之后,在当前的esp指向的地址下硬件断点,然后再次运行到该点时,进行dump内存,即可 ...

  2. 简单脱壳教程笔记(3)---手脱UPX壳(2)

    我们接着上一篇   "简单脱壳教程笔记(2)---手脱UPX壳(1)"继续.我们说了UPX我们可以使用四种方式,上一篇已经详细的讲解了单步跟踪法,接下来,我们讲解其他方式. 方法2 ...

  3. RE入门之脱壳——手脱UPX壳

    很多加了壳的软件是很难逆向分析的,需要手脱.下面以UPX壳为例简单介绍一下如何手动脱壳 需要工具:x64dbg. 以buuctf中re的新年快乐为例 拿到程序以后使用x64dbg打开. F9运行到程序 ...

  4. 简单脱壳教程笔记(2)---手脱UPX壳(1)

    本笔记是针对ximo早期发的脱壳基础视频教程,整理的笔记. ximo早期发的脱壳基础视频教程 下载地址如下: http://down.52pojie.cn/%E5%90%BE%E7%88%B1%E7% ...

  5. 实验四:使用UPX加壳与脱壳

    一.实验目的 了解程序加壳.脱壳原理 掌握PE文件结构 学习利用UPX Shell.LoardPE.IDA等工具完成软件的加.脱壳操作 二.实验题目 UPX加壳:对crackme加上UPX壳,用 Lo ...

  6. HZNUCTF REVERSE Signin题解——upx壳区段改名修复,动态调试脱壳

    目录 一.查壳 二.修复upx区段名脱壳 三.动态调试脱壳 四.注意事项 题目附件:https://pan.baidu.com/s/1KXNvwOd7WObU-LiikiOd8A?pwd=4l31  ...

  7. 普通壳的脱壳方法和脱壳技巧

    转自:http://www.bllll.com/thread-43439-1-1.html 普通壳的脱壳方法和脱壳技巧 这篇文章,是我在之前在自学脱壳的时候,在笔记本是所做的脱壳总结:里面包括了各种壳 ...

  8. 什么是加壳和脱壳技术?加壳和脱壳技术是什么意思?

    什么是加壳和脱壳技术?加壳和脱壳技术是什么意思? 加壳,是一种通过一系列数学运算,将可执行程序文件或动态链接库文件的编码进行改变(目前还有一些加壳软件可以压缩.加密驱动程序),以达到缩小文件体积或加密 ...

  9. BUUCTF-Reverse:新年快乐 + 加壳与脱壳

    题目地址:https://buuoj.cn/challenges#%E6%96%B0%E5%B9%B4%E5%BF%AB%E4%B9%90 用IDA打开文件: 怎么可能才两个函数,猜测加了壳,直接查: ...

最新文章

  1. R中的概率分布函数及可视化
  2. 一步一步学Ruby(七):数学表达式
  3. mysql看表关联视图_MySQL数据库 : 自关联,视图,事物,索引
  4. 【声辐射】——不同坐标系下的格林函数
  5. c#仿照qq登录界面编辑框内容操作
  6. 测试工程师,必须掌握的shell变量知识
  7. 拓端tecdat|sas文本挖掘案例:如何使用SAS计算Word Mover的距离
  8. linux pack文件镜像,使用buildpack-deps 构建自己的入容器镜像
  9. HTML页面中显示时间
  10. 写代码python用什么笔记本好_求推荐适合程序员用的笔记本电脑
  11. DBeaver解决连接Oracle之后出现库名为数字问题
  12. 使用a标签下载文件而不是直接打开
  13. UVA12304直线,圆,点的综合应用
  14. 计算机考研就业率,21考研同学需谨慎,三个专业就业率持续走低,包括热门计算机专业...
  15. 直播回顾 | 云原生混部系统 Koordinator 架构详解(附完整PPT)
  16. Error: Your CLT does not support macOS 11.0. 1.00
  17. 《网络媒体教程》后记
  18. 台州学院c语言期末试题,台州学院 高等数学上册 期末试题3
  19. wiki php markdown,一款支持Markdown语法的Wiki知识管理系统:Wikitten搭建教程
  20. 矩阵计算器的c语言代码大全,用C语言实现矩阵计算器

热门文章

  1. amd显卡测试大风车软件md,肉眼可见的撕裂 AMD将推出FreeSync2 HDR测试工具
  2. 抖音常见的违规封号行为;怎么避免抖音违规;丨国仁网络资讯
  3. centos7 glibc2.17升级到glibc2.28
  4. 谷歌等大型科技公司对你了解多深,你想知道吗?
  5. 排列序列(第k个排列)
  6. 8个LED灯分别以不同频率闪烁
  7. Mac Docker配置阿里云镜像(最新)
  8. 统一用户认证和单点登录和授权的原理与流程
  9. 【常用工具类】EasyExcel
  10. 计算机常考的快捷键,电脑常见快捷键大全