当前位置: 首页 > 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由多个工具组成,其中最常用的…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...