CTF逆向-Upx脱壳攻防世界simple unpack

CTF逆向-Upx脱壳攻防世界simple unpack文章目录前言UPX技术原理应用范围软件使用CTF实战程序查壳UPX脱壳总结前言加壳软件分两类:压缩壳:压缩的目的是减少程序体积,如ASPack、UPX、PECompact等;加密壳:加密是为了防止程序被反编译(反汇编)、跟踪和调试,如ASProtect、Armadillo、EXECryptor、Themida、VMProtect。壳的存在会让我们找不到程序的真实入口点,从而不能正确的分析反汇编程序,也就对程序起到了一定的保护作用。加密壳的基本思路:将原本程序的PE相关代码复制

大家好,又见面了,我是你们的朋友全栈君。

前言

加壳软件分两类:

  1. 压缩壳:压缩的目的是减少程序体积,如 ASPack、UPX、PECompact 等;
  2. 加密壳:加密是为了防止程序被反编译(反汇编)、跟踪和调试,如 ASProtect、Armadillo、 EXECryptor、Themida、VMProtect。

壳的存在会让我们找不到程序的真实入口点,从而不能正确的分析反汇编程序,也就对程序起到了一定的保护作用。

加密壳的基本思路:

  1. 将原本程序的 PE 相关代码复制到补丁(壳)中;
  2. 加密程序;
  3. 修改程序入口点,使得程序启动后会先运行补丁程序;
  4. 补丁程序会根据先前复制的相关代码对程序进行解密和还原,使得程序能够正常运行;
  5. 还原后再返回执行原本的入口点。

本文不讨论加密壳,而是通过攻防世界一道 CTF 逆向题目 simple-unpack 来学习下基于 UPX 的压缩壳的特征和脱壳。

UPX

UPX (the Ultimate Packer for eXecutables) 是一款先进的可执行程序文件压缩器, 也是一个著名的压缩壳,主要功能是压缩 PE 文件(比如 exe、dll 等文件),有时候也可能被病毒用于免杀。

UPX 壳是一种保护程序(一般是 EXE 文件的一种外保护措施),其主要用途 :

  • 让正规文件被保护起来,不容易被修改和激活成功教程;
  • 使文件压缩变小;
  • 保护杀毒软件安装程序,使之不受病毒侵害;
  • 木马,病毒的保护外壳,使之难以为攻破。

技术原理

UPX 对于可执行程序资源压缩,是保护文件的常用手段。俗称加壳,加壳过的程序可以直接运行,但是不能查看源代码。要经过脱壳才可以查看源代码。

UPX 加壳其实是利用特殊的算法,对 EXE、DLL文件里的资源进行压缩。类似WINZIP 的效果,只不过这个压缩之后的文件,可以独立运行,解压过程完全隐蔽,都在内存中完成。解压原理,是加壳工具在文件头里加了一段指令,告诉 CPU,怎么才能解压自己。当加壳时,其实就是给可执行的文件加上个外衣。用户执行的只是这个外壳程序。当执行这个程序的时候这个壳就会把原来的程序在内存中解开,解开后,以后的就交给真正的程序。

应用范围

压缩文件

用 UPX 压缩过的可执行文件体积缩小 50%-70% ,这样减少了磁盘占用空间、网络上传下载的时间和其它分布以及存储费用。 通过 UPX 压缩过的程序和程序库完全没有功能损失和压缩之前一样可正常地运行,支持的大多数格式程序,没有运行时间或内存的不利后果。

加壳脱壳

程序为了反跟踪、被人跟踪调试、防止算法程序被别人静态分析就需要加壳。使用加壳软件加密代码和数据,就可以保护你程序数据的完整性,防止被程序修改和被窥视内幕。

软件使用

UPX 软件的 Github下载地址,拿来即可食用:
在这里插入图片描述
在 cmder 中打开,使用 -h 参数可以查看使用方法:
在这里插入图片描述核心的用法如下:

upx sample.exe upx -d sample.exe
压缩可执行文件 解压缩可执行文件

CTF实战

了解完关于 UPX 加壳的基础知识后,回归正题,返回到 simple-unpack 题目中来(附件下载地址),题目如下:
在这里插入图片描述

程序查壳

既然题目都已经提示是 “一个被加壳的二进制文件” 了,那么下载后当然是查看下加壳情况了,可以看到是 64 位的文件,做了 UPX 加壳保护:

在这里插入图片描述

直接尝试拖入 IDA Pro 64bit 查看程序结构,会看到压缩壳处理后的程序的函数极少:
在这里插入图片描述然而发现在 16 进制查看区域点击“Alt+T”快捷键进行 flag 关键词搜索,即可看到 flag(惊不惊喜,意不意外…):
在这里插入图片描述这大概就是压缩壳的弊端了,没有对源程序进行加密,压缩后还是可泄露源程序的数据。

UPX脱壳

虽然上面已经拿到了 flag 值,但是本文重点还是要学习下 UPX 的脱壳、以及对比 UPX 加壳、脱壳后的文件结构,所以下面继续对目标文件进行脱壳。

不废话,直接上 upx 软件进行脱壳(解压缩):
在这里插入图片描述
随后将脱壳后的文件直接拖入 IDA Pro 进行反汇编,可以看到源程序的代码结构了,并在 main 函数中成功找到 flag,如下图所示:
在这里插入图片描述在这里插入图片描述最终 flag 值:flag{Upx_1s_n0t_a_d3liv3r_c0mp4ny},over!

总结

本文学习记录了 UPX 软件加壳、脱壳(压缩与解压缩)的方法,并直观比较了其加壳后、脱壳后的文件结构,总的来说压缩壳的作用有限,UPX 已经被应用很久了,脱壳技术成熟,使用于防止反编译、病毒免杀的作用十分有限,杀毒引擎基本能直接识别出做了 UPX 加壳的病毒程序。所以要想让加壳达到防止反编译、反调试跟踪的目的,还是得采用加密壳而非压缩壳。对于加密壳的激活成功教程分析练习,等待下一步的学习!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/161703.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • HashMap扩容全过程

    HashMap扩容全过程 1.如果HashMap的大小超过了负载因子(loadfactor)定义的容量,怎么办?默认的负载因子大小为0.75,也就是说,当一个map填满了75%的bucket时候,和其它集合类(如ArrayList等)一样,将会创建原来HashMap大小的两倍的bucket数组,来重新调整map的大小,并将原来的对象放入新的bucket数组中。这个过程叫作rehashing,因为它调用hash方…

    2025年11月19日
    7
  • vscode设置字体大小和字体(vscode窗口字体大小设置)

    VScode如何设置字体大小第一步:首先打开vscode,在vscode的左下角有一个设置按钮,单机打开,选择settings选项第二步:在设置中查找font(字体)选项,并打开第三步:在font选项内,选择fontsize,就可以设置字体的大小了还有一些其他的关于字体的设置也可以进行修改…

    2022年4月18日
    4.0K
  • fastjson把map转json_fastjson转list对象

    fastjson把map转json_fastjson转list对象Stringtest=”jdkalkjda|||djkdla|||djlak”;Stringstr[]=test.split(“\\|\\|\\|”);System.out.println(str.length);HashMapt=newHashMap();HashMapt1=newHashMap();t1.put(“k”,”3″);Objects1=JSONObj…

    2022年10月4日
    3
  • int和int32的区别_int float double char区别

    int和int32的区别_int float double char区别Java中没有Int32,Int64,,只有int,short,longJava中int就代表Int32,short就代表Int16,long就代表Int64首先,几个基本的关键字:Int16=short,占2个字节.-32768~32767Int32=int,占4个字节.-2147483648~2147483647Int64=long,占8个字…

    2022年8月15日
    4
  • 基于HL-1开发板开发RFID(RC522模块)射频电路基础

    基于HL-1开发板开发RFID(RC522模块)射频电路基础基于HL-1学习版开发RFID射频首先先看学习版的原理图和RC522模块的原理图:图片中重点写出引脚的相应接口名称。—————————————————————手动分割线———————————————————–连线部分详解:关于淘宝上面买的射频模块差不多都是RC522模块:如何连线我认为连线部分是自由的,在P口充足的情况下,想这么连这

    2022年7月14日
    16
  • java与c语言哪个好学_Java编程和C语言哪个好学「建议收藏」

    java与c语言哪个好学_Java编程和C语言哪个好学「建议收藏」原标题:Java编程和C语言哪个好学学哪种编程语言好?计算机编程语言非常多,诸如Java、C、C++、PHP等,很多人在选择的时候都会觉得头大。到底学哪种编程语言好?很多人都拿Java和c相比较,那么今天小编就来先说说我的个人理解吧,学习Java很简单上手很容易,只需要会拼音就可以,简直而且没有门槛,而c语言学习成本高,要想学会需要投入较大的精力,才能有一个相对不错的回报。下面是Java和c的市…

    2022年7月8日
    20

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号