当前位置: 首页 > news >正文

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

【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:脱壳技术

相关文章:

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

【2022.1.3】手脱压缩壳练习(含练习exe) 文章目录【2022.1.3】手脱压缩壳练习(含练习exe)0、简介1、单步跟踪法(#)方法介绍(0)练习exe下载(1)、查看源程序&am…...

【异或哈希】CF855 div3 F

感觉这道题跟之前有一题特别像,都是异或哈希感觉这种题应该很典,记录一下(66条消息) Codeforces Round #841 (Div. 2) and Divide by Zero【异或差分动态map维护】 2022 C. Even Subarrays_lamentropetion的博客-CSDN博客Problem - F - Codeforces题意&a…...

深度学习|改进两阶段鲁棒优化算法i-ccg

目录 1 主要内容 2 改进算法 2.1 CC&G算法的优势 2.2 i-CCG算法简介 3 结果对比 1 主要内容 自从2013年的求解两阶段鲁棒优化模型的列和约束生成算法(CC&G)被提出之后,基本没有实质性的创新,都是围绕该算法在各个领…...

C++11轻松打印本地时间

C11之前,想要获取时间并对其打印是有些困难的,因为C并没有标准时间库。想要对时间进行统计就需要调用C库,并且我们要考虑这样的调用是否能很好的封装到我们的类中。 C11之后,STL提供了 chrono 库,其让对时间的操作更加…...

Eureka - 总览

文章目录前言架构注册中心 Eureka Server服务提供者 Eureka Client服务消费者 Eureka Client总结资源前言 微服务(Microservices,一种软件架构风格)核心的组件包括注册中心,随着微服务的发展,出现了很多注册中心的解决…...

【算法设计-枚举、分治】素数、约数、质因数分解

文章目录1. 素数判定2. 素数筛选法3. 质因数分解4. 求一个数的约数5. 求两个数的最大公约数(GCD)6. 求两个数的最小公倍数(LCM)1. 素数判定 判定从 2 到sqrt(n)依次能否把 n 整除,若存在可以整除的数则说明 n 不是素数…...

【第十四届蓝桥杯】第三期模拟赛B组C++题解(待修正+持续更新-ing)

文章目录写在前面一、找最小数题目描述解题报告1、大体思路2、代码详解二、求列名题目描述解题报告1、大体思路2、代码详解三、求日期数题目描述解题报告1、大体思路2、代码详解四、取数题目描述解题报告1、大体思路2、代码详解五、最大连通分块题目描述解题报告1、大体思路2、…...

线程池和ThreadLocal详解

线程池和ThreadLocal详解线程池池化模式:线程池里的线程数量设定为多少比较合适?添加线程规则:实现原理:线程池实现任务复用的原理线程池状态:Executors 创线程池工具类手动创建(更推荐):自动创…...

[深入理解SSD系列综述 1.7] SSD固态存储市场发展分析与预测_固态存储技术发展方向(2022to2023)

前言 自2020年疫情爆发以来,远程办公、网上教育、流媒体等等应用引爆对消费电子及云服务的需求增长,全球数字化转型加速,带来了两年的闪存风光时刻。然而,进入2022年,在俄乌冲突、疫情重燃、通胀上升等一系列事件冲击下,全球经济下行风险加剧,对智能手机、PC等科技产品的…...

【2021.12.25】ctf逆向中常见加密算法和编码识别

【2021.12.25】ctf逆向中常见加密算法和编码识别(含exe及wp) 文章目录【2021.12.25】ctf逆向中常见加密算法和编码识别(含exe及wp)0、前言1、基础加密手法2、base64(1)原理:(2&#…...

【数据结构初阶】堆排序

目录 前言 概念 堆排序的实现 1.建堆 (1)堆向上调整算法 (2)堆的向下调整算法 2. 利用堆删除思想来进行排序 3.堆排序的时间复杂度 4.源码 总结 前言 前边我们学习了堆的实现,对堆的每个接口都进行了详细的讲…...

Day5: platformDriver-1

Platform Driver (1) Linux kernel中大部分设备可以归结为平台设备,因此大部分的驱动是平台驱动(patform driver) 什么是平台设备 平台设备是linux的设备模型中一类设备的抽象。 内核中的描述: Platform devices are devices t…...

开发手册——一、编程规约_7.控制语句

这篇文章主要梳理了在java的实际开发过程中的编程规范问题。本篇文章主要借鉴于《阿里巴巴java开发手册终极版》 下面我们一起来看一下吧。 1. 【强制】在一个 switch 块内,每个 case 要么通过 break / return 等来终止,要么注释说明程序将继续执行到哪…...

python每日学9 : windows上配置gitee的远程仓库,git的初步使用

在开发中,如果遇到复杂的项目,使用版本控制是非常有必要的,如果涉及到多端开发,那么还需要使用远程仓库。本文作个简单记录,记录下git初步使用。 1 下载与安装 git还有几个ui版本,但是开始使用的话&#…...

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

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

现代操作系统——Linux架构与学习

小白的疑惑 在我决定从事嵌入式(应用层)方面的工作时,我查询了大量资料该如何学习,几乎所有观点不约而同的都指向了学习好Linux,大部分工作都是在Linux环境下来进行工作的。于是我雄心勃勃的去下载Linux,可…...

中文代码82

PK 嘚釦 docProps/PK 嘚釦羸 r docProps/app.xml潙蚽?勶曻Q顗濔S? 錞礖剅D柍珘m?鳞?ぷ辷f硌?2?upc厭Y樐8 rU y搪m眾&a?珪?紓 玺鶋瑣襚? ?i嘲rN?布倖儇?攊橌??嚗猝)芻矂2吟腊K湞?CK臶>鸘\?ΔF滋齢q旮T?桀?;偉 A軥v蕯朾偤佷3?е…...

顺序表(一篇带你掌握顺序表)

目录 一、顺序表是什么 1.1 概念 1.2 分类 1.3 结构 二、顺序表的基本操作 2.1 前绪准备 2.2 初始化 2.3 扩容 2.5 尾插 2.6 打印 2.7 尾删 2.8 头插 2.9 头删 2.10 在pos位置插入 2.11 删除pos位置的数据 2.12 查找 三、完整代码 3.1 Test.c文件 3.2 SeqList.h…...

【SpringCloud】SpringCloud教程之Feign实战

目录前言SpringCloud Feign远程服务调用一.需求二.两个服务的yml配置和访问路径三.使用RestTemplate远程调用(order服务内编写)四.构建Feign(order服务内配置)五.自定义Feign配置(order服务内配置)六.Feign配置日志(oder服务内配置)七.Feign调优(order服务内配置)八.抽离Feign前…...

嵌入式linux必备内存泄露检测神器

Valgrind介绍 Valgrind是一个可移植的动态二进制分析工具集,主要用于发现程序中的内存泄漏、不合法内存访问、使用未初始化的内存、不正确的内存释放以及性能问题等,可在Linux和Mac OS X等平台上使用。 Valgrind由多个工具组成,其中最常用的…...

设计模式之行为型模式

四、行为型模式 行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。 行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在…...

解密 三岁的三岁到底为什么叫做三岁?

机缘 那一年,一次奇奇怪怪的挫折与一次奇奇怪怪的成长。 在学习Python的路上总觉得少了点什么,是心情?是机遇?还是力量? 都不是又都是! 缺少一个实践和记忆的平台 记性不好是硬伤 前一天学的下一秒就忘记了…...

id选择器

id选择器可以为特定的id的标签进行css美化 使用方法: 标签内设好 id值, CSS的id选择器以“#id名”来调用 注意 所有标签都有id值id属性值类似于身份证号码,在一个页面中是唯一的值,不可重复一个标签上只能有一个id属性值一个id属性…...

《科技之巅3》读书笔记

文章目录书籍信息人工智能,“吃一堑长一智”的机器人机交互,为解决“交流障碍”问题而生硬件与算法,好马还需好鞍模式创新,赋予技术新的定义云与数据共享,灵活应对信息的爆发式增长“机器人”,从电影和小说…...

18.用于大型程序的工具

文章目录用于大型程序的工具18.1异常处理18.1.1抛出异常栈展开栈展开过程中对象被自动销毁析构函数与异常异常对象18.1.2捕获异常查找匹配的处理代码重新抛出捕获所有异常的处理代码18.1.3函数try语句块与构造函数18.1.4noexcept异常说明违反异常说明异常说明的实参noexcept运算…...

mysql一主键uuid和自增的选择

文章目录 1.自增ID的优缺点1.1 优点1.2 缺点1.3 不适合以自增ID主键作为主键的情况2.UUID作为主键2.1 介绍2.2 优点2.3 缺点3.有序UUID作为主键3.1 介绍3.2 演示使用3.2.1 前提知识3.2.1.1 数据类型 - binary3.2.1.2 函数 - hex()3.2.1.3 函数 - unhex()3.2.2 数据库层3.2.3 JA…...

【EDA工具使用】——VCS和Verdi的联合仿真的简单使用

目录 1.芯片开发所需的工具环境 2.编译仿真工具 3.三步式混合编译仿真(最常用)​编辑 4.两步式混合编译仿真​编辑 5.VCS的使用 ​6.verdi的使用 1.产生fsdb文件的两种方法​编辑 1.芯片开发所需的工具环境 2.编译仿真工具 3.三步式混合编译仿真…...

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

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

39. 实战:基于api接口实现视频解析播放(32接口,窗口化操作,可导出exe,附源码)

目录 前言 目的 思路 代码实现 需要导入的模块 1. 导入解析网站列表,实现解析过程 2. 设计UI界面 3. 设置窗口居中和循环执行 4. 注意事项 完整源码 运行效果 总结 前言 本节将类似34. 实战:基于某api实现歌曲检索与下载(附完整…...

基于灵动 MM32 微控制器的便携式血氧仪方案

基于灵动 MM32 微控制器的便携式血氧仪: - Cortex-M0() 最高主频 72MHz 可实现血氧饱和度信号采集、算法操作和 LED 显示操作 - 高性能的 1Msps 12b ADC 能对光电采样结果进行大数据量的暂存和处理,提高采样的效率并有助于对结果做高精度的计算 - 100…...