【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。(虽然都是一样的。。。)
壳简介:
图片来源:看雪论坛
对比上图,可以理解壳的加载过程一般分为4步:
-
保存入口参数
(通常用 pushad / popad、pushfd / popfd 指令对来保存和恢复现场环境)
-
获取所需函数 API
一般是
LoadLibrary
+GetProAddress
-
解密各区块数据
-
(恢复入口参数,比如通过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)、查看源程序
检测有无壳
Aspack的压缩壳
IDA打开,看看IDA分析有壳的程序是什么样
(2)、单步跟踪法脱壳
【1】单步跟踪法脱壳口诀
- 打开程序按 F8 单步向下, 尽量实现向下的 jmp 跳转
- 会经常遇到大的循环, 这时要多用 F4 来跳过循环
- 如果函数载入时不远处就是一个 call(近 call), 那么我们尽量不要直接跳过, 而是进入这个 call
- 一般跳转幅度大的 jmp 指令, 都极有可能是跳转到了原程序入口点 (OEP)
【2】OD载入脱壳
[1]遇到近call
进来后直接遇到近call
f7步入之后,f8执行
f8执行到近call,f7步入
步入之后是这样,没有发现近call,放心f8
[2]遇到跳转指令
f8的过程中一定要注意跳转指令(jmp,je,jne,jz,jb等待)
跳转指令 尽量是向下跳转的,
如果遇到向上跳转,则选中下一行代码,按f4执行到指针处,
下面遇到了一个向上跳转的指令,(技巧)
又遇到向上跳转,和上面一样的方法
然后就是一直f8,遇到向上跳转则重复上面的方式。
题外话:遇到一个popad
又继续f8…………
[3]似乎来到OEP
直到到这里,下面的结构就很像程序真正的入口函数,猜测这里就是OEP
[4]验证该处是否为OEP
先假设上述地址0x4010cc
就是程序OEP,所以在那里dump出来
右键->dump
先获取当前EIP作为OEP,再dump文件出来
文件名默认为原名_dump.exe
验证猜测
用IDA打开我们dump出来的文件
根据以上两点,则猜测验证完毕,
单步脱壳法完成
【3】IDA分析主函数,缺少函数名
对比上一张IDA打开的图
【4】无法启动脱壳后的程序
综上所述,还要还原IAT表
(3)、还原IAT表
ImportREC1.7下载链接
链接:https://pan.baidu.com/s/1ztQybt9saucXHk22-majgQ
提取码:2k6v
打开ImportREC.exe ,
运行原程序,(未脱壳的版本能运行)。
在ImportREC.exe里附加活动进程为原程序。
更改OEP为我们新找到的OEP(主要要减去ImageBase(基值)400000)
然后点击自动搜索
然后点击获取输入表
再点击修复转存文件
选取先前dump出来的文件,完成后,会生成一个新的文件原名_dump_.exe
(4)、最后测试
点击运行NotePad_dump_.exe
,发现能正常运行了
然后用IDA分析这个文件,API函数名也能正常显现了
完成单步跟踪法脱壳+IAT修复
2、ESP定律
(#)方法介绍
ESP 定律法是脱壳的利器, 是应用频率最高的脱壳方法之一。
由于在程序自解密或者自解压过程中, 不少壳会先将当前寄存器状态压栈,如使用pushad, 在解压结束后, 会将之前的寄存器值出栈,如使用popad。
因此在寄存器出栈时, 往往程序代码被恢复, 此时硬件断点触发. 然后在程序当前位置, 只需要少许单步操作, 就很容易到达正确的 OEP 位置。
- 程序刚载入开始 pushad/pushfd
- 将全部寄存器压栈后就设对 ESP
- 寄存器设硬件断点
- 运行程序, 触发断点
- 删除硬件断点开始分析
- 找到OEP,dump程序
(0)练习exe下载
链接:https://pan.baidu.com/s/10F7z2L_ne4MD59o9bHfjVA
提取码:xs9d
ESP定律脱壳练习
由于是一样的程序,前面单步跟踪法
已经讲了完整脱壳过程,我这里就直接记录重点。
开头结尾略去。
(1)载入OD
看见第一条指令便是pushad指令。
(2)下硬件断点
f8执行一步,发现esp发生变化,右键点击esp,选择数据窗口中跟随
下硬件访问断点
(3)再f9执行来到硬件访问断点
f9之后,来到这里
查看前一行代码,很显然是popad
(4)f8单步执行寻找OEP结构
下来之后,f8单步执行,仔细看,注意跳转
几步之后,就跳到了这里
所以也是猜测地址0x4010CC
是OEP
(5)假设OEP,dump文件
假设地址0x4010CC
是OEP
同样的方式dump文件,主要要先点击Get EIP as OEP
(6)验证假设
IDA打开dump文件
假设验证成功
但很显然,dump程序也不能执行,
所以是没有恢复IAT表
(7)、恢复IAT表
一样的程序,前面单步脱壳法
已经记录了,这里就不再赘述!
3、一步到达OEP法
(#)方法介绍
**简介:**所谓的一步到达 OEP 的脱壳方法, 是根据所脱壳的特征, 寻找其距离 OEP 最近的一处汇编指令, 然后下 int3 断点, 在程序走到 OEP 的时候 dump 程序.(比如常见脱壳特征:popad)
如一些压缩壳往往 popad 指令距离 OEP 或者大 jmp 特别近, 因此使用 Ollydbg 的搜索功能, 可以搜索壳的特征汇编代码, 达到一步断点到达 OEP 的效果。
以OD调试为例
- ctrl+f 查找 popad
- ctrl+l 跳转到下一个匹配处
- 找到匹配处, 确认是壳解压完毕即将跳转到 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
离跳转和retn很接近,我们变可以尝试这个popad,按F4运行到此处,继续F8单步向下
在retn后返回到OEP,使用Ollydump脱壳,然后一样的重建IAT即可
但是你要注意,这个方法只能用于极小部分情况。很多壳是不会直接使用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曲线这些概念,那这些概念到底有什么用处呢? 首先,…...

现代操作系统——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由多个工具组成,其中最常用的…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
Spring Security 认证流程——补充
一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...