【2022.1.3】手脱压缩壳练习(含练习exe)

news2025/1/14 18:37:55

【2022.1.3】手脱压缩壳练习(含练习exe)

文章目录

  • 【2022.1.3】手脱压缩壳练习(含练习exe)
    • 0、简介
    • 1、单步跟踪法
      • (#)方法介绍
      • (0)练习exe下载
      • (1)、查看源程序
      • (2)、单步跟踪法脱壳
        • 【1】单步跟踪法脱壳口诀
        • 【2】OD载入脱壳
          • [1]遇到近call
          • [2]遇到跳转指令
          • [3]似乎来到OEP
          • [4]验证该处是否为OEP
        • 【3】IDA分析主函数,缺少函数名
        • 【4】无法启动脱壳后的程序
      • (3)、还原IAT表
      • (4)、最后测试
    • 2、ESP定律
      • (#)方法介绍
      • (0)练习exe下载
      • (1)载入OD
      • (2)下硬件断点
      • (3)再f9执行来到硬件访问断点
      • (4)f8单步执行寻找OEP结构
      • (5)假设OEP,dump文件
      • (6)验证假设
      • (7)、恢复IAT表
    • 3、一步到达OEP法
      • (#)方法介绍
      • (0)练习exe下载
      • (1)脱壳记录
    • 4、脱壳机练习(upx)
      • (#)方法介绍
      • (0)练习exe下载
      • (1)脱壳记录
    • 5、总结

0、简介

记录练习手脱壳(简单的压缩壳),都有对应练习exe。(虽然都是一样的。。。)

壳简介:

image-20210908150510315

图片来源:看雪论坛

对比上图,可以理解壳的加载过程一般分为4步:

  1. 保存入口参数

    (通常用 pushad / popad、pushfd / popfd 指令对来保存和恢复现场环境)

  2. 获取所需函数 API

    一般是LoadLibrary+GetProAddress

  3. 解密各区块数据

  4. (恢复入口参数,比如通过popad)跳转回原程序入口点AddressOfEntryPoint

而我们脱壳要做的就是,在有壳程序执行完步骤4之后,把程序dump出来,此时dump出来的程序虽然不能启动,但是已经可以被IDA反编译出正常的自身函数了,不过还是有些导入的函数看不见名字,一般是IAT表出现问题,所以还要通过ImportREC.exe进行IAT重建,之后即可正常启动,

常规的脱壳方法一般有几种:单步跟踪法、ESP定律法、一步到达OEP法等等。

下面就是脱壳练习记录~

1、单步跟踪法

(#)方法介绍

总的来说:就是一步步调试,直到程序自动自动解壳

**概述:**单步跟踪法的原理就是通过 Ollydbg 的步过 (F8), 步入(F7) 和运行到 (F4) 功能, 完整走过程序的自脱壳过程, 跳过一些循环恢复代码的片段, 并用单步进入确保程序不会略过 OEP. 这样可以在软件自动脱壳模块运行完毕后, 到达 OEP, 并 dump 程序。

技巧:

1、打开程序按 F8 单步向下, 尽量实现向下的 jmp 跳转

2、会经常遇到大的循环, 这时要多用 F4 来跳过循环

3、如果函数载入时不远处就是一个 call( call), 那么我们尽量不要直接跳过, 而是进入这个 call

4、一般跳转幅度大的 jmp 指令, 都极有可能是跳转到了原程序入口点 (OEP)

(0)练习exe下载

链接:https://pan.baidu.com/s/1Gf99jnR1XESBseoNp5n57w
提取码:mjeu

单步跟踪法 脱壳练习

(1)、查看源程序

检测有无壳

image-20210722011731523

Aspack的压缩壳

IDA打开,看看IDA分析有壳的程序是什么样

image-20210722011933795

(2)、单步跟踪法脱壳

【1】单步跟踪法脱壳口诀

  1. 打开程序按 F8 单步向下, 尽量实现向下的 jmp 跳转
  2. 会经常遇到大的循环, 这时要多用 F4 来跳过循环
  3. 如果函数载入时不远处就是一个 call(近 call), 那么我们尽量不要直接跳过, 而是进入这个 call
  4. 一般跳转幅度大的 jmp 指令, 都极有可能是跳转到了原程序入口点 (OEP)

【2】OD载入脱壳

[1]遇到近call

进来后直接遇到近call

image-20210722012328897

f7步入之后,f8执行

image-20210722012356985

f8执行到近call,f7步入

image-20210722012444128

步入之后是这样,没有发现近call,放心f8

image-20210722012558057

[2]遇到跳转指令

f8的过程中一定要注意跳转指令(jmp,je,jne,jz,jb等待)

跳转指令 尽量是向下跳转的,

如果遇到向上跳转,则选中下一行代码,按f4执行到指针处,

下面遇到了一个向上跳转的指令,(技巧

image-20210722013105761

又遇到向上跳转,和上面一样的方法

image-20210722013201119

然后就是一直f8,遇到向上跳转则重复上面的方式。

题外话:遇到一个popad

image-20210722013410990

又继续f8…………

[3]似乎来到OEP

直到到这里,下面的结构就很像程序真正的入口函数,猜测这里就是OEP

image-20210722013729037

[4]验证该处是否为OEP

先假设上述地址0x4010cc就是程序OEP,所以在那里dump出来

右键->dump

image-20210722014154479

先获取当前EIP作为OEP,再dump文件出来

文件名默认为原名_dump.exe

image-20210722014444288

验证猜测

用IDA打开我们dump出来的文件

image-20210722014637496

根据以上两点,则猜测验证完毕

单步脱壳法完成

【3】IDA分析主函数,缺少函数名

image-20210722014921982

对比上一张IDA打开的图

【4】无法启动脱壳后的程序

image-20210722015327030

综上所述,还要还原IAT表

(3)、还原IAT表

ImportREC1.7下载链接

链接:https://pan.baidu.com/s/1ztQybt9saucXHk22-majgQ
提取码:2k6v

打开ImportREC.exe ,

image-20210722015213369

运行原程序,(未脱壳的版本能运行)。

在ImportREC.exe里附加活动进程为原程序。

image-20210722015458388

更改OEP为我们新找到的OEP(主要要减去ImageBase(基值)400000)

然后点击自动搜索

image-20210722015716330

image-20210722015725752

然后点击获取输入表

image-20210722015944493

再点击修复转存文件

image-20210722020011763

选取先前dump出来的文件,完成后,会生成一个新的文件原名_dump_.exe

image-20210722020247324

(4)、最后测试

点击运行NotePad_dump_.exe,发现能正常运行了

image-20210722020313742

然后用IDA分析这个文件,API函数名也能正常显现了

image-20210722020357994


完成单步跟踪法脱壳+IAT修复

2、ESP定律

(#)方法介绍

ESP 定律法是脱壳的利器, 是应用频率最高的脱壳方法之一。

由于在程序自解密或者自解压过程中, 不少壳会先将当前寄存器状态压栈,如使用pushad, 在解压结束后, 会将之前的寄存器值出栈,如使用popad

因此在寄存器出栈时, 往往程序代码被恢复, 此时硬件断点触发. 然后在程序当前位置, 只需要少许单步操作, 就很容易到达正确的 OEP 位置。

  1. 程序刚载入开始 pushad/pushfd
  2. 将全部寄存器压栈后就设对 ESP
  3. 寄存器设硬件断点
  4. 运行程序, 触发断点
  5. 删除硬件断点开始分析
  6. 找到OEP,dump程序

(0)练习exe下载

链接:https://pan.baidu.com/s/10F7z2L_ne4MD59o9bHfjVA
提取码:xs9d

ESP定律脱壳练习

由于是一样的程序,前面单步跟踪法已经讲了完整脱壳过程,我这里就直接记录重点。

开头结尾略去。

(1)载入OD

看见第一条指令便是pushad指令。

image-20210722021642684

(2)下硬件断点

f8执行一步,发现esp发生变化,右键点击esp,选择数据窗口中跟随

image-20210722021913096

下硬件访问断点

image-20210722022253491

(3)再f9执行来到硬件访问断点

f9之后,来到这里

image-20210722022423751

查看前一行代码,很显然是popad

image-20210722022508212

(4)f8单步执行寻找OEP结构

下来之后,f8单步执行,仔细看,注意跳转

几步之后,就跳到了这里

image-20210722022703043

所以也是猜测地址0x4010CC是OEP

(5)假设OEP,dump文件

假设地址0x4010CC是OEP

同样的方式dump文件,主要要先点击Get EIP as OEP

image-20210722023013323

(6)验证假设

IDA打开dump文件
image-20210722023142501

假设验证成功

但很显然,dump程序也不能执行,

所以是没有恢复IAT表

(7)、恢复IAT表

一样的程序,前面单步脱壳法已经记录了,这里就不再赘述!

3、一步到达OEP法

(#)方法介绍

**简介:**所谓的一步到达 OEP 的脱壳方法, 是根据所脱壳的特征, 寻找其距离 OEP 最近的一处汇编指令, 然后下 int3 断点, 在程序走到 OEP 的时候 dump 程序.(比如常见脱壳特征:popad

如一些压缩壳往往 popad 指令距离 OEP 或者大 jmp 特别近, 因此使用 Ollydbg 的搜索功能, 可以搜索壳的特征汇编代码, 达到一步断点到达 OEP 的效果。

以OD调试为例

  1. ctrl+f 查找 popad
  2. ctrl+l 跳转到下一个匹配处
  3. 找到匹配处, 确认是壳解压完毕即将跳转到 OEP 部分, 则设下断点运行到该处

不过这只适用于极少数压缩壳

(0)练习exe下载

链接:https://pan.baidu.com/s/1mEoJwJKUJxUp4HErF4NTSA
提取码:p465

(1)脱壳记录

OllyDbg载入Notepad.exe

直接按Ctrl+F搜索popad

我们需要找的popad需要满足,是在程序最后返回时,壳程序希望恢复现场环境的地方

也就是靠近jmp,或retn的地方

直接搜索popad,显示出的几个结果,都不太符合标准
我们按Ctrl+L,查看下一个搜索目标。

在0040D3AF位置处我们发现这样一个popad

0040D3AF 61 popad
0040D3B0 75 08 jnz short NotePad.0040D3BA
0040D3B2 B8 01000000 mov eax,0x1
0040D3B7 C2 0C00 retn 0xC
0040D3BA 68 00000000 push 0x0
0040D3BF C3 retn

image-20210722031512984

离跳转和retn很接近,我们变可以尝试这个popad,按F4运行到此处,继续F8单步向下

在retn后返回到OEP,使用Ollydump脱壳,然后一样的重建IAT即可

image-20210722031549949

但是你要注意,这个方法只能用于极小部分情况。很多壳是不会直接使用popad这样的指令的

4、脱壳机练习(upx)

(#)方法介绍

就是直接傻瓜式一键操作

(0)练习exe下载

链接:https://pan.baidu.com/s/1s319A3-XPCnmqJ-ffTg7fA
提取码:vn4w

(1)脱壳记录

脱壳机安装

https://upx.github.io/

脱壳指令:

upx -d “脱壳程序”

5、总结

多动手操作,印象跟深刻!

参考文章:ctf-wick:脱壳技术

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

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

相关文章

精确率与召回率,ROC曲线与PR曲线

精确率与召回率,ROC曲线与PR曲线 在机器学习的算法评估中,尤其是分类算法评估中,我们经常听到精确率(precision)与召回率(recall),ROC曲线与PR曲线这些概念,那这些概念到底有什么用处呢? 首先&#xff0c…

Linux系统GPIO应用编程

目录应用层如何操控GPIOGPIO 应用编程之输出GPIO 应用编程之输入GPIO 应用编程之中断在开发板上测试GPIO 输出测试GPIO 输入测试GPIO 中断测试本章介绍应用层如何控制GPIO,譬如控制GPIO 输出高电平、或输出低电平。应用层如何操控GPIO 与LED 设备一样,G…

【办公类05-03】Python批量修改文件名前面的序号(已有的序号错了,需要改成正确的号码)

背景需求下载教程,手动输入编号,有一个编号错误,导致后面所有编号都错了。30实际是29,以此类推怎样才能快速修改编号数字?前期考虑到可能要改编号,所以在每个编号后面加“ ”(空格)&…

python版协同过滤算法图书管理系统

基于协同过滤算法的图书管理系统 一、简介(v信:1257309054) ​ 本系统基于推荐算法给用户实现精准推荐图书。 ​ 根据用户对物品或者信息的偏好,发现物品或者内容本身的相关性,或者是发现用户的相关性,然…

Typora上传文档图片链接失效的问题+PicGo布置图床在Github

文章目录typora图片链接失效原因PicGO开源图床布置先配置Github2.1先创建新仓库、用于存放图片2.2生成一个token,用picGo访问github3.下载picGo,并进行配置3.1 配置v4.1typora图片链接失效原因 因为你是保存在本地的,因此图片是不能访问,可以…

laravel 邮件发送

配置 Laravel 的邮件服务可以通过 config/mail.php 配置文件进行配置。 邮件中的每一项都在配置文件中有单独的配置项,甚至是独有的「传输方式」,允许你的应用使用不同的邮件服务发送邮件 mailers > [smtp > [transport > smtp,host > env(M…

【超级猜图案例上半部分的实现 Objective-C语言】

一、超级猜图这么一个案例: 1.实现之后的效果是这样的: 1)中间有一个图片,点一下,能放大,背景变半透明的黑色: 2)再点一下图片,或者点周围黑色的阴影,图片回归原状, 3)右边有一个“大图”按钮,点一下,实现跟点图片一样的效果, 4)左边有一个“提示”按钮,点…

【Java学习笔记】4.Java 对象和类

前言 本章介绍Java的对象和类。 Java 对象和类 Java作为一种面向对象语言。支持以下基本概念: 多态继承封装抽象类对象实例方法重载 本节我们重点研究对象和类的概念。 对象:对象是类的一个实例(对象不是找个女朋友)&#x…

为什么人们宁可用Lombok,也不把成员设为public?

目录专栏导读一、从零了解JavaBean1、基本概念2、JavaBean的特征3、JavaBean的优点二、定义最简单的JavaBean三、思考一个问题,为何属性是private,然后用get/set方法?四、下面系统的分析以下,why?五、不和谐的声音,禁…

MySQL实战解析底层---行锁功过:怎么减少行锁对性能的影响

目录 前言 从两阶段锁说起 死锁和死锁检测 前言 MySQL 的行锁是在引擎层由各个引擎自己实现的但并不是所有的引擎都支持行锁,比如MyISAM 引擎就不支持行锁不支持行锁意味着并发控制只能使用表锁,对于这种引擎的表,同一张表上任何时刻只能有…

[深入理解SSD系列综述 1.5] SSD固态硬盘参数图文解析_选购固态硬盘就像买衣服?

版权声明:付费作品,未经许可,不可转载前言SSD (Solid State Drive),即固态硬盘,通常是一种以半导体闪存(NAND Flash)作为介质的存储设备。SSD 以半导体作为介质存储数据&…

Python进阶-----面对对象4.0(面对对象三大特征之--继承)

目录 前言: Python的继承简介 1.什么是继承 2.继承的好处 3.object类 继承的相关用法 1.继承的定义与法则 2.对继承的重写 3.(单继承)多层继承 4.多继承 5.多继承重写时调用父类方法 前言: 在讲之前,我想说说中…

servlet注解开发

文章目录servlet注解开发内容回顾响应对象 HttpServletResponse重定向与请求转发ServletConfig简介案例ServletContext简介案例Servlet 注解开发简介注解使用案例WebServlet 注解详细参数综合的增删改查案例登录注册功能servlet注解开发 内容回顾 响应对象 HttpServletRespon…

推荐一个日历转换开源工具库,支持C#、Java、PHP等主流的语言

更多开源项目请查看:一个专注推荐.Net开源项目的榜单 日历对我们来说,最熟悉的就是阳历和农历,在中国每年都有固定的节日、节气、中国特有传统节日,有些节日是固定的,但是节气这些都需要我们经过一定规则换算出来。 所…

【JavaSE】数组的定义和使用(上)

数组的定义和使用(上)6-数组的定义与使用1. 数组的基本概念1.1 为什么要使用数组1.2 什么是数组1.3 数组的创建及初始化1.3.1 数组的创建1.3.2 数组的初始化1.4 数组的使用1.4.1 数组中元素的访问1.4.2 遍历数组2. 数组是引用类型2.1 初始JVM的内存分布2…

【Python - Matplotlib】P1 Matplotlib2D 快速入门

Matplotlib 2D什么是,为什么选择快速上手三层结构图像层结构一览图画图三步法补充画布设置设定图像的长宽以及清晰度代码将图片保存前言 本节为 Matplotlib 简单专题第一节,简单介绍 Matplotlib 的结构,画图三步法,以及介绍一个简…

认识Spring(上)

作者:~小明学编程 文章专栏:Spring框架 格言:热爱编程的,终将被编程所厚爱。 目录 什么是spring 什么是IOC 传统开发 IOC DI spring的创建使用 pom.xml spring.xml 取出bean对象 ApplicationContext BeanFactory App…

【NLP相关】PyTorch多GPU并行训练(DataParallel和DistributedDataParallel介绍、单机多卡和多机多卡案例展示)

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

@Transactional详解

一、事务的概念 百度百科: 事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执 行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL&#x…

第十四届蓝桥杯三月真题刷题训练——第 1 天

目录 题目1:数列求值 代码: 题目2:质数 代码: 题目3:饮料换购 代码: 题目1:数列求值 题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出…