查看: 79|回复: 0

[Reverse] 从做题到出题再到做题三部曲-UPX

[复制链接]

22

主题

23

帖子

0

精华

VIP

Rank: 16

学币
10
荣耀
0
rank
0
违规
0

VIP

    发表于 2020-6-15 00:58:06 | 显示全部楼层 |阅读模式

    前言  自己最近在做总结,看到之前所做的两个upx加壳的题目,于是总结一下。
    基本介绍  upx大家应该都不陌生,在做题时算是比较容易遇到的一种壳,代码开源。
      UPX(the Ultimate Packer for eXecutables)是一个免费且开源的可执行程序文件加壳器,支持许多不同操作系统下的可执行文件格式
    做题  能用upx -d直接脱壳的就不举例了。
      强网杯有一题hide,鹏城杯有一题C++ note都是无法一键脱壳的,关于hide可以参考我之前写的博客(网上也有很多资料)。
      具体的解题过程在此不做讲解
    出题Easy  首先我们写一个简单的验证过程,这里就直接拿之前写的题xxTea的代码,源代码在之前的文章里有。
      如果因为程序过小而压缩失败可以通过添加如下代码进行解决:
    int const dummy_to_make_this_compressible[10000] = {1,2,3};
      我在ubuntu下进行压缩,版本3.91如下:

    从做题到出题再到做题三部曲-UPX

    从做题到出题再到做题三部曲-UPX
      通常我们使用upx main -o main-upx命令进行压缩,对比下压缩前后的文件信息。

    从做题到出题再到做题三部曲-UPX

    从做题到出题再到做题三部曲-UPX
      压缩前

    从做题到出题再到做题三部曲-UPX

    从做题到出题再到做题三部曲-UPX
      压缩后

    从做题到出题再到做题三部曲-UPX

    从做题到出题再到做题三部曲-UPX
      使用strings查看

    从做题到出题再到做题三部曲-UPX

    从做题到出题再到做题三部曲-UPX
      尝试使用upx -d main-upx脱壳

    从做题到出题再到做题三部曲-UPX

    从做题到出题再到做题三部曲-UPX
      直接就能脱,这种题目会有,一般只是考查对upx的基本使用,并没有任何难度。
    Nornal  往往upx压缩的题目是不会让做题者直接使用工具解压的,因此这里面可以做许多文章,可以通过编译源码,隐藏UPX版本、标志等信息,这里讲一下自己遇到过的隐藏UPX版本、标志进行的混淆。
      首先要来了解一下upx加壳之后的ELF文件格式
      文件格式参考自这位大神的分析

    从做题到出题再到做题三部曲-UPX

    从做题到出题再到做题三部曲-UPX
      具体分析看分析哦,这里只说明如何隐藏标志,防止一键脱壳。
      实验过程如下:
      upx 3.95版本,mac下进行实验
      压缩

    从做题到出题再到做题三部曲-UPX

    从做题到出题再到做题三部曲-UPX
      能正常解压

    从做题到出题再到做题三部曲-UPX

    从做题到出题再到做题三部曲-UPX
      修改UPX!标志位
      修改前:

    从做题到出题再到做题三部曲-UPX

    从做题到出题再到做题三部曲-UPX
      修改后:

    从做题到出题再到做题三部曲-UPX

    从做题到出题再到做题三部曲-UPX
      尝试解压,提示l_info corrupted

    从做题到出题再到做题三部曲-UPX

    从做题到出题再到做题三部曲-UPX
      此时程序能正常运行

    从做题到出题再到做题三部曲-UPX

    从做题到出题再到做题三部曲-UPX
      除此之外我还试了下在3.91版本下修改标志位,发现upx -d仍然能直接脱(不明所以)。
    手拖upx  如果upx -d命令无法直接脱壳,那么我们可以选择手动脱壳,方法也很简单,不需要复杂的操作。(头铁的我一般直接动态逆)
      这里选取的样本为upx 3.95压缩,修改标志位。
      运行程序后,查看进程的内存信息

    从做题到出题再到做题三部曲-UPX

    从做题到出题再到做题三部曲-UPX
      脱壳的基本原理是程序在运行时会将代码释放到内存中,我们只需在运行时将内存中的可执行代码段dump出来即可。
      如下命令:
    sudo dd if=/proc/$(pidof mac-main-upx)/mem of=main_dump skip=0x400000  bs=1c count=786432

    从做题到出题再到做题三部曲-UPX

    从做题到出题再到做题三部曲-UPX
      当然使用gdb附加,使用(gdb) dump memory /root/memory.dump 0x400000 0x40c000也是一样的效果。
      这时便可以动静结合来进行调试了。
    当然如果你有能力修复的,那么把dump的程序修复下也是可以的。
    总结  upx防脱的方法还有好多,不过网上公开的源代码并不多,但我觉得没必要在混淆上做太多文章,毕竟混淆只是增加了调试的速度而已,头铁直接刚就是了,哪怕面目全非。
      一点总结,有不当之处还请指出。



    温馨提示:
    1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
    2.回复帖子不仅是对作者的最好奖励,还可以获得学币奖励,请尊重作者的劳动成果,拒绝做伸手党!
    3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
    学逆向论坛-免费的逆向学习论坛
    微信公众号
    快速回复 返回顶部 返回列表