macOS MIG - Mach Interface Generator

从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS红队专家)

支持HackTricks的其他方式:

MIG被创建用于简化Mach IPC代码的生成过程。它基本上生成了所需的代码,以便服务器和客户端根据给定的定义进行通信。即使生成的代码看起来很丑陋,开发人员只需导入它,他的代码将比以前简单得多。

示例

创建一个定义文件,这里是一个非常简单的函数:

myipc.defs
subsystem myipc 500; // Arbitrary name and id

userprefix USERPREF;        // Prefix for created functions in the client
serverprefix SERVERPREF;    // Prefix for created functions in the server

#include <mach/mach_types.defs>
#include <mach/std_types.defs>

simpleroutine Subtract(
server_port :  mach_port_t;
n1          :  uint32_t;
n2          :  uint32_t);

现在使用 mig 生成服务器和客户端代码,这些代码将能够相互通信以调用 Subtract 函数:

在当前目录中将创建几个新文件。

在文件**myipcServer.cmyipcServer.h中,您可以找到结构SERVERPREFmyipc_subsystem**的声明和定义,该结构基本上定义了根据接收到的消息ID调用的函数(我们指定了起始编号为500):

在`myipcServer.h`文件中,我们定义了一个名为`myipcServer`的类,该类包含了处理Mach RPC请求的方法。

根据前面的结构,函数**myipc_server_routine将获取消息ID**并返回要调用的适当函数:

在这个例子中,我们只在定义中定义了一个函数,但如果我们定义了更多函数,它们将位于**SERVERPREFmyipc_subsystem**数组内,第一个函数将被分配给ID 500,第二个函数将被分配给ID 501...

实际上,可以在**myipcServer.h中的subsystem_to_name_map_myipc**结构中识别这种关系:

最后,使服务器工作的另一个重要函数将是**myipc_server,这个函数实际上会调用**与接收到的id相关联的函数:

检查前面突出显示的行,访问要通过ID调用的函数。

以下是创建一个简单服务器客户端的代码,其中客户端可以调用服务器的Subtract函数:

二进制分析

由于许多二进制文件现在使用MIG来公开mach端口,了解如何识别使用了MIG以及MIG在每个消息ID上执行的功能是很有趣的。

jtool2可以从Mach-O二进制文件中解析MIG信息,指示消息ID并识别要执行的函数:

先前提到负责根据接收到的消息ID调用正确函数的函数是myipc_server。然而,通常情况下你不会有二进制文件的符号(函数名称),因此有趣的是查看反编译后的样子,因为它总是非常相似的(此函数的代码与暴露的函数无关):

实际上,如果你转到函数**0x100004000,你会找到routine_descriptor结构体的数组。结构体的第一个元素是函数实现的地址**,结构体占用0x28字节,因此每0x28字节(从字节0开始)你可以获得8字节,这将是将被调用的函数的地址

这些数据可以通过使用此Hopper脚本提取。

最后更新于