壳小白关于压缩壳的学习心得及基础实战练习

admin 2022年2月15日04:25:27评论74 views字数 3837阅读12分47秒阅读模式

壳小白关于压缩壳的学习心得及基础实战练习

本文为看雪论坛优秀文章

看雪论坛作者ID:633



关于壳基础知识的学习已经告一段落,本帖主要目的是针对所学内容中的压缩壳知识进行一个简要归纳,并辅以一个基础脱壳练习加强应用体验。



1


壳原理


(一)壳的作用


通过对生活场景中带壳类生物的观察,程序中壳的作用可类比理解为:对可执行文件起到保护等的作用。


(二)壳的分类


压缩壳:目的是减少PE体积。使用的是数据压缩算法,常见的如zip。


加密壳:目的是防止程序被分析,被调试,被逆向。使用的是加密算法,其中涉及反调试,反dump的技术。


(三)压缩壳的设计原则


压缩壳设计必须遵守的原则:加壳之后的 PE 文件被加载到内存中之后,其内存内容和功能,必须和加壳之前的正常 PE 的内存内容一模一样。


(四)压缩壳的设计方法


在解压缩代码前开启一个空节区域,空节即没有文件大小,只有内存大小(内存大小至少大于原节总大小)的节,以便进程运行起来后,可以在内存中扩出我们所需的空间。


推测一个压缩壳的工作原理,可以从被压缩后的 PE 文件的节表的信息(节的名称;通过节的 VirtualSize 和节的 SizeOfRawData 的大小对比来判断是否为占坑节(SizeOfRawData 不一定是 0,也有可能是比 VirtualSize 小很多的一个值)来入手。

壳小白关于压缩壳的学习心得及基础实战练习壳小白关于压缩壳的学习心得及基础实战练习
图1-1 压缩壳的设计方法


(五)压缩壳的实现思路图

壳小白关于压缩壳的学习心得及基础实战练习
图1-2 压缩壳的实现思路


2


观察压缩壳之upx壳


(一)upx壳概述


upx 壳是一个开源的、跨平台的压缩壳,它的压缩率可达到 25%以下。


(二)upx壳使用


目录下cmd运行upx命令查看命令,常用命令:


压缩选项['-1' - '-9'] :-1:compress faster,压缩速度更快; -9:compress better,压缩率更高。


upx脱壳:-d     decompress。

壳小白关于压缩壳的学习心得及基础实战练习图2-1 upx常用命令


语法:upx [-一般为默认] [-一般为默认] [输出文件] 文件..


示例:upx [-123456789dlthVL] [-qvfk] [-o file] file..


使用:


upx -o dbgview_upx.exe Dbgview.exe

壳小白关于压缩壳的学习心得及基础实战练习


upx -9 -o dbgview_upx.exe Dbgview.exe

壳小白关于压缩壳的学习心得及基础实战练习


压缩前后PE节对比:

壳小白关于压缩壳的学习心得及基础实战练习
图2-2 压缩前后PE节对比

压缩后空节内存:

壳小白关于压缩壳的学习心得及基础实战练习
图2-3 压缩后空节内存

(三)脱壳


1、脱壳目的


与加壳概念相反,目的是把带壳PE还原为原始PE,以便使用IDA对源码进行静态分析。

2、脱壳方法


静态脱壳(不推荐);

Dump脱壳(推荐):

(1)查找OEP,OEP的识别:

OEP:EP(Entry Point),即程序的入口点。而OEP是程序的原始入口点,一个正常的程序只有EP,只有入口点被修改的程序(加壳等),才会拥有OEP。

a.经验:汇编生成的程序没有OEP特征,不同的编译器生成的程序的 OEP 处有不同的特征。常见特征:

使用 VC6 编译的程序,会在 OEP 处看到以 GetVersion()为开头的多个函数的连续调用。往下找,看到 push 了 3 个或者 4 个(Windows 窗口程序)的一个函数调用,那就是 main()函数。 
壳小白关于压缩壳的学习心得及基础实战练习
图2-4 VC6编译程序的OEP特征

使用 VS 2013系列后 release 版本编译的程序,会在 OEP 处看到连续的一个 call,一个 jmp(和 Debug 版本相比,第二个 call 变为 jmp 是编译器的优化),分别是 call _security_init_cookie 和 jmp_scrt_common_main_seh。第二个 jmp 跟进去找到其中的call再进去,往下走就能找到对一组函数的调用(下图3,其中QueryPerformanceCounter为主要API特征)。 
壳小白关于压缩壳的学习心得及基础实战练习

壳小白关于压缩壳的学习心得及基础实战练习图2-5  VS 2013系列后编译程序的OEP特征

一个有效的观察特征的方法是:下载并使用这些编译器的 IDE,写一个简单的程序,断在 main() 函数的第一句代码处,然后观察栈回溯,看看从进入主模块开始一路走来的函数调用过程。

b.手法:

① esp定律:esp 定律对压缩壳oep的识别非常有效,因为压缩壳的 shell(用于解压缩数据的代码),为了让自己看上去没有被执行过,在运行之前和运行结束的时候一定会保存和恢复寄存器环境。

② API:使用 API 查找 OEP,就是在明确了目标程序使用的哪款编译器之后(如何知道程序是哪款编译器编译出来的?根据上面说过的经验,以 VC6为例,.text 节的开始部分会有以 GetVersion()为开头的多个函数的连续调用;这其实是一个悖论:既然已经定位到 GetVersion()了,那么无需再多进行操作,直接往前找一下就是 OEP 了),在 OEP 入口的特征函数处下断点。例如,对于 VC6 编译器所生成的程序,我们可以在函数GetVersion()下断点,断下来之后 GetVersion()函数的 call 调用之前不远处,就是 OEP。在 GetVersion()函数的 call 调用之前不远处,找到了 OEP,在此下断点的时候,注意要下硬件断点,而不能是软件断点,因为软件断点写入的 0xCC 指令会被之后解压缩出来的数据所覆盖,从而造成断点失效,甚至会导致 OD 的断点管理混乱。

③ 单步跟踪查找 OEP:一般是在前两种方法都无效的情况下,我们才会手工单步跟踪。在遇到 jmp,call 或者push+ret 的时候,只有方向是向下的时候才跟着跳转,否则就直接运行程序至下一行汇编代码处,方法:鼠标点击向上跳转的指令(例如jnz short xxxxx,机器码 75 EE)的下一行指令,按快捷键:F4。

(2)dump:dump:作为动词理解,指在特定时刻,把动态易变的数据,转储为静态持久的数据。作为名词理解,一般就是指dump(动词)的结果文件。

(3)修复PE:具体情况具体分析。


3


脱壳实战基础篇


关于旧版本pcf.exe频繁请求无效输入的BUG分析及修复


(一)概述

作者:633

时间:2021-12

样本来源:科锐样本库

本文档讲述关于pcf.exe程序频繁请求无效输入的BUG分析及其修复过程。


(二)相关文件及工具

pcf.exe:样本程序

PEiD.exe:查壳工具

X32dbg.exe:Dump工具

OD.exe:动态调试工具

LIBC.LIB:辅助测试库


(三)行为预览

样本名称:pcf.exe

样本类型:应用程序

样本大小:61KB

样本具体行为:自动提取特征码

样本BUG描述:在执行过程中,频繁请求无效输入。


(四)样本分析


1、查壳


使用PEID工具查验,发现样本已加ASPack壳(ASPack是一款常见的Win32可执行程序压缩工具)。
壳小白关于压缩壳的学习心得及基础实战练习
图3-1 PEiD查壳


2、脱壳


(1)查找OEP(X32dbg)


esp定律:见pushad/pushfd即可初步确定使用esp定律识别OEP。所谓ESP定律就是利用了pushad的设计原理,在一开始的时候,去栈上数据进行硬件读处理,当壳执行完毕要恢复PE前,即可快速锁定OEP定位。esp 定律对压缩壳oep的识别非常有效,因为压缩壳的 shell(用于解压缩数据的代码),为了让自己看上去没有被执行过,在运行之前和运行结束的时候一定会保存和恢复寄存器环境。

步骤1:F8单步过pushad入栈,跟踪ESP,以DWORD类型,下硬件访问断点至第二组或第三组(经验)。

壳小白关于压缩壳的学习心得及基础实战练习图3-2 查找OEP步骤1

步骤2:F9运行,断下来的即为popad处,jmp指令即为跳转至OEP地址。
壳小白关于压缩壳的学习心得及基础实战练习
图3-3 查找OEP步骤2

步骤3:F8至OEP行。
壳小白关于压缩壳的学习心得及基础实战练习图3-4 查找OEP步骤3

(2)dump(X32dbg)


dump流程:X32dbg插件 → Scylla→ dump 转储(xxx.exe→xxx_dump.exe)。
备注:调试机需与样本程序保持同位环境。本样本为32位程序,故需在32位环境下进行Dump。
壳小白关于压缩壳的学习心得及基础实战练习
图3-5 Dump 流程

壳小白关于压缩壳的学习心得及基础实战练习
图3-6 Dump 结果

3、调试分析并修复BUG


(1)样本BUG描述:使用pcf.exe提取特征时,在执行过程中的频繁等待输入时,控制台提示字符串为"press enter to exit"。其原因是该.obj是16位的,发展到32位时没有换掉基本库的16位函数,此函数目前已没有了,且16位的obj格式与32位的不一样,所以导致出错。 
壳小白关于压缩壳的学习心得及基础实战练习
图3-7 BUG特征提取

(2)OD附加样本,反汇编窗口中右键→查找字符串"press enter to exit",双击进入相关代码区域。
壳小白关于压缩壳的学习心得及基础实战练习壳小白关于压缩壳的学习心得及基础实战练习
图3-8 查找指定字符串,并双击进入相关代码行

(3)经过分析,发现此字符串之后的两个调用函数功能分别是:输出字符串printf()和等待用户输入scanf()。为了修复频繁请求无效输入的功能BUG,将Scanf()作nop处理即可。
壳小白关于压缩壳的学习心得及基础实战练习
图3-9 将Scanf()作nop处理

(4)拉取修改代码区域,并右键  "复制到可执行文件" →  "所有修改" →  "全部复制"。

(5)在反汇编窗口中右键  "保存文件"即可。



壳小白关于压缩壳的学习心得及基础实战练习 


看雪ID:633

https://bbs.pediy.com/user-home-919233.htm

*本文由看雪论坛 633 原创,转载请注明来自看雪社区


壳小白关于压缩壳的学习心得及基础实战练习


# 往期推荐

1.Windows平台下栈溢出漏洞学习笔记

2.GKCTF2021 KillerAid

3.内核、容器与eBPF攻防初探

4.CVE-2019-10999复现学习

5.内核漏洞学习-HEVD-UninitializedStackVariable

6.记录一次vmp2.xdemo的分析



壳小白关于压缩壳的学习心得及基础实战练习



壳小白关于压缩壳的学习心得及基础实战练习

球分享

壳小白关于压缩壳的学习心得及基础实战练习

球点赞

壳小白关于压缩壳的学习心得及基础实战练习

球在看



壳小白关于压缩壳的学习心得及基础实战练习

点击“阅读原文”,了解更多!

原文始发于微信公众号(看雪学苑):壳小白关于压缩壳的学习心得及基础实战练习

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年2月15日04:25:27
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   壳小白关于压缩壳的学习心得及基础实战练习http://cn-sec.com/archives/777821.html

发表评论

匿名网友 填写信息