看到下面的脱壳信息
可以手动脱壳,也可以工具脱壳
UPX壳是UPX压缩工具生成的一种可执行文件壳。UPX压缩工具可以将可执行文件的大小压缩 50%-70%,但会在可执行文件的头部插入一段壳代码。这段壳代码负责解压原始程序的代码,然后跳转到原始程序的入口点。
因此,在 UPX 压缩的可执行文件运行时,程序会先从壳代码开始执行,然后在壳代码执行完毕后跳转到原始程序的入口点。
UPX壳可以用来保护可执行文件免受逆向工程。因为要想对 UPX 壳的可执行文件进行逆向工程,需要先脱掉壳。脱壳是一个复杂的过程,需要一定的逆向工程技术。
UPX壳也被一些软件开发者用于保护软件免受盗版。因为 UPX 壳的可执行文件无法直接运行,需要使用 UPX 解压工具才能解压。这样可以防止盗版者直接将可执行文件复制到其他计算机上运行。
UPX 壳是一种常见的可执行文件壳。它可以用来保护可执行文件免受逆向工程和盗版。
1. 找到 OEP
UPX 加壳程序会在程序的头部插入一段壳代码,这段壳代码负责解密或解压原始程序的代码,然后跳转到原始程序的入口点。因此,在 UPX 加壳程序运行时,程序会先从壳代码开始执行,然后在壳代码执行完毕后跳转到原始程序的入口点。
OEP 是 Original Entry Point 的缩写,意思是原始入口点。在 UPX 加壳程序中,OEP 指的是原始程序的入口点,也就是程序开始执行的代码地址。
OEP 的地址通常会在 UPX 加壳程序的头部,可以通过反汇编工具来查找。以下是一些常见的 OEP 查找方法:
使用反汇编工具查找:例如,使用 IDA 或 OD 等反汇编工具,可以直接在反汇编窗口中查看 OEP 的地址。
使用 PE 文件头信息:PE 文件头中包含了程序的入口点地址,可以通过查看 PE 文件头信息来获取 OEP 的地址。
[Image of 使用 PE 文件头信息查找 OEP]
使用壳信息:一些壳会在程序的头部写入壳信息,其中可能会包含 OEP 的地址。
[Image of 使用壳信息查找 OEP]
2. dump 内存文件
找到 OEP 后,就可以开始脱壳程序了。脱壳程序的第一步就是要将加壳程序的内存映像 dump 下来。
dump 内存映像可以使用 od 或 windbg 等工具来完成。以下是使用 od 工具 dump 内存映像的示例:
od -axf 加壳程序.exe > 加壳程序.bin
此命令将会将加壳程序的所有内存映像 dump 到文件 加壳程序.bin
中。
3. 修复
dump 下内存映像后,就可以开始修复了。修复的第一步就是要找到 OEP 对应的地址。
OEP 对应的地址通常会在 dump 下来的内存映像中,可以使用反汇编工具来查找。
找到 OEP 对应的地址后,就可以开始修复了。修复的步骤通常包括以下几个步骤:
修复完成后,就可以获得原始程序了。
总结
UPX 脱壳原理相对简单,只要找到 OEP 并修复内存映像就可以了。以下是 UPX 脱壳的步骤总结:
通过这几个步骤,就可以获得原始程序
cd到文件的根目录
然后upx -h可以查看命令
upx -d脱壳
主函数分析
前面三个函数一个一个看看
NtCurrentPeb()->BeingDebugged; 是一个用于判断当前进程是否处于被调试状态的表达式。
在 Windows 操作系统中,每个进程都有一个 Process Environment Block (PEB) 结构。PEB 结构包含了进程的环境信息,包括进程的入口点、堆栈地址、模块列表等。
PEB 结构中的 BeingDebugged 成员是一个 UCHAR 类型的成员,其值表示进程是否处于被调试状态。如果 BeingDebugged 成员的值为 1,则表示进程处于被调试状态;如果 BeingDebugged 成员的值为 0,则表示进程不在被调试状态。
NtCurrentPeb()->BeingDebugged; 表达式就是获取当前进程的 BeingDebugged 成员的值。
这个表达式通常用于反调试。反调试是指在被调试程序中检测并防止调试器的行为。一些恶意软件会使用反调试技术来防止被逆向工程。
例如,如果一个恶意软件检测到当前进程处于被调试状态,它可能会采取以下措施:
总的来说上面三个函数,都是反调试用的,防止别人调试,可以nop掉(也就是清楚掉)
所以其思路就是绕过前面三个函数,然后执行
重点在strcmp函数
但是在静态调试中又无法看见,v4的值
v4需要动调才能看见
ida还支持另一种调试方式,即将目标文件附加到一个正在运行的进程上,以调试某些无法独立运行的文件,如果想以这种方式进行调试,则在选好调试器后点击“Attach to process”后即可选择附加进程
在“Attach to process”窗口中,您可以使用以下方式来选择要附加的进程:
根据上述的解释,进行操作
设立断点
运行此程序
本地调试
找到运行的exe
随便在黑框中输入值,然后回车
然后F9进入我们设立的断点,F8单步到
点击EAX中的地址,并查看存储的值
这就v4就是flag
总结
主要学习到了动调的绕过方式
先脱壳UPX,获取flag的逻辑就是,v6与v4相同,但是程序一运行就会退出,因此需要动态调式修改程序执行逻辑,让程序逻辑流走到对v4的处理上,然后flag直接就出来了:flag{fmf_is_great!}