武穆遗书(CTFshow)

发布时间:2024年01月23日

查壳看看

在这里插入图片描述
看到下面的脱壳信息
可以手动脱壳,也可以工具脱壳

UPX

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 对应的地址后,就可以开始修复了。修复的步骤通常包括以下几个步骤:

  • 将内存映像中的壳代码替换为原始程序的代码。
  • 修复 PE 文件头信息。

修复完成后,就可以获得原始程序了。

总结

UPX 脱壳原理相对简单,只要找到 OEP 并修复内存映像就可以了。以下是 UPX 脱壳的步骤总结:

  1. 找到 OEP。
  2. dump 内存文件。
  3. 修复内存映像。

通过这几个步骤,就可以获得原始程序

工具

cd到文件的根目录
然后upx -h可以查看命令
upx -d脱壳
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

IDA32打开

主函数分析
在这里插入图片描述
前面三个函数一个一个看看
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
NtCurrentPeb()->BeingDebugged; 是一个用于判断当前进程是否处于被调试状态的表达式。

在 Windows 操作系统中,每个进程都有一个 Process Environment Block (PEB) 结构。PEB 结构包含了进程的环境信息,包括进程的入口点、堆栈地址、模块列表等。

PEB 结构中的 BeingDebugged 成员是一个 UCHAR 类型的成员,其值表示进程是否处于被调试状态。如果 BeingDebugged 成员的值为 1,则表示进程处于被调试状态;如果 BeingDebugged 成员的值为 0,则表示进程不在被调试状态。

NtCurrentPeb()->BeingDebugged; 表达式就是获取当前进程的 BeingDebugged 成员的值。

这个表达式通常用于反调试。反调试是指在被调试程序中检测并防止调试器的行为。一些恶意软件会使用反调试技术来防止被逆向工程。

例如,如果一个恶意软件检测到当前进程处于被调试状态,它可能会采取以下措施:

  • 退出程序。
  • 执行其他恶意操作。

在这里插入图片描述
在这里插入图片描述
总的来说上面三个函数,都是反调试用的,防止别人调试,可以nop掉(也就是清楚掉)
所以其思路就是绕过前面三个函数,然后执行
重点在strcmp函数

在这里插入图片描述

在这里插入图片描述
但是在静态调试中又无法看见,v4的值
v4需要动调才能看见

Attach to process

ida还支持另一种调试方式,即将目标文件附加到一个正在运行的进程上,以调试某些无法独立运行的文件,如果想以这种方式进行调试,则在选好调试器后点击“Attach to process”后即可选择附加进程

在“Attach to process”窗口中,您可以使用以下方式来选择要附加的进程:

  • 输入进程 ID。
  • 选择进程名称。
  • 使用“Search”按钮搜索进程。
    选择好要附加的进程后,点击“Attach”按钮即可开始调试。
    在附加进程后,IDA 会自动加载进程的内存映像。您可以使用 IDA 的各种调试功能来调试该进程。
    例如,您可以设置断点、查看寄存器值、查看内存数据等。
    附加进程调试方式可以帮助您调试无法独立运行的文件。它是一种很有用的调试技巧。

操作

根据上述的解释,进行操作
设立断点
在这里插入图片描述
运行此程序
在这里插入图片描述
本地调试
在这里插入图片描述
在这里插入图片描述
找到运行的exe
在这里插入图片描述
随便在黑框中输入值,然后回车
在这里插入图片描述
然后F9进入我们设立的断点,F8单步到
在这里插入图片描述
点击EAX中的地址,并查看存储的值
在这里插入图片描述

这就v4就是flag
在这里插入图片描述
总结
主要学习到了动调的绕过方式
先脱壳UPX,获取flag的逻辑就是,v6与v4相同,但是程序一运行就会退出,因此需要动态调式修改程序执行逻辑,让程序逻辑流走到对v4的处理上,然后flag直接就出来了:flag{fmf_is_great!}

文章来源:https://blog.csdn.net/m0_72827793/article/details/135768690
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。