upx手动脱壳
一些upx的魔改壳
首先来说一下比赛中遇到的一些关于upx的魔改壳
一、ELF程序
1.overlay_offset被修改

将最后的4F000000改成F4000000即可用工具正常脱壳
二、EXE程序
1.upx标志位被修改

四处小写的upx为错误标志,改UPX即可用工具正常脱壳
手工脱壳
本文借助x64dbg与其插件Scylla进行手工脱壳
这里就拿BaseCTF的UPX PRO MAX来叙述,同时我是利用ESP定律来进行脱壳
首先介绍一下下文提到的一些常见概念:
pushad: 将所有的32位通用寄存器压入堆栈 ESP-32 。
popad: 将所有的32位通用寄存器出栈 ESP+32。
1.寻找入口点
首先要先在加壳后的程序中定位到原程序的入口点
因此,打开程序后我们先F9运行

发现此处停在了四处push处,把4个push压入栈中,相当于pushad。为了使栈平衡,应该还会有4个pop或者一个popad。所以我们只要跟踪到这部分栈被弹出,就意味着解压完成。之后的代码就是原始代码。那么如何跟踪这部分栈呢?我们只需要在pushad执行完成后对当前栈顶的内存地址下一个硬件断点即可。

然后我们F9运行后肯定是会看到pop或者popad的

果不其然,这里其实就是解压完成、进入原始OEP的地方
往下找大跳,跳到的地方就是原始OEP了

此处的jmp就是我们要找的入口点,跟踪jmp将转到oep,然后使用Scylla插件进行脱壳即可

2. dump内存到文件,修复文件
进程已经填好,OEP也填好了,我们只需点击Dump,然后保存好文件,
再点击IAT Autosearch,看到IAT已找到,再点击Get Imports

最后点击Fix Dump,选择我们刚才Dump下来的文件就可以了。
最后我在这里介绍一下IAT
IAT: 导入地址表,windows下可执行文件中文件格式中的一个字段,描述的是导入信息函数地址,在文件中是一个RVA数组,在内存中是一个函数地址数组。
修复IAT:在脱壳后,不管是加密壳还是压缩壳,都有一个从内存dump到本地存储并保存为文件,而IAT在文件中是一个RVA数组,在内存中是一个函数地址数组,我们就需要将从内存dump出来的IAT从函数地址数组转换成RVA数组,这样程序才能修复。
同时介绍一篇upx手动脱壳的好文章:https://www.anquanke.com/post/id/272639

浙公网安备 33010602011771号