首先Corba DEMO的原文链接,代码后面就不贴了,有兴趣的大佬可以跟着走一遍。
这篇文章的分析,其实是为之后的IIOP反序列化打个基础。
0x00 指导思想
1、启动orbd作为naming service,会创建name service服务。
2、corba server向orbd发送请求获取name service,协商好通信格式。
4、orbd返回保存的name service。
4、corba server拿到name service后将具体的实现类绑定到name service上,这个时候orbd会拿到注册后的信息,这个信息就是IOR。
5、corba client向orbd发起请求获取name service。
6、orbd返回保存的name service。
7、orba client在name service中查找已经注册的信息获取到“引用”的信息(corba server的地址等),通过orb的连接功能将远程方法调用的请求转发到corba server。
8、corba server通过orb接收请求,并利用POA拦截请求,将请求中所指定的类封装好,同样通过orb的连接功能返回给corba client。
摘自:https://cert.360.cn/report/detail?id=d3f6666d6558f02a6204dd51cb749558
0x01 引入概念
ORBA通用对象服务(或称COS名称服务)提供了对象引用的树型目录,就像文件系统提供的文件目录一样。在JDK的早期版本中由tnameserv提供类似服务。tnameserv是暂时名称服务,只有在运行时才能维持名称上下文。如果关闭名称服务,那么所有的名称索引都会消失。J2SE1.4中为了保持和先前版本的通用性仍然保留了tnameserv。
如果使用J2SE1.4之前的tnameserv提供暂时名称服务,上面代码首行返回对暂时名称服务的对象引用。对象引用objRef是个通用CORBA对象,为了要能把它作为NamingContextExt对象使用,必须要将它转换成合适的类型。在CORBA中需使用方法narrow来实现这个转换。另外,如果你在J2SE1.4中使用orbd,那么以上代码返回的就是对永久名称服务的对象引用。如果你想要在orbd中指明使用暂时名称服务,那么就要使用参数TNameService而不是NameService:
摘自:https://blog.csdn.net/freewind88/article/details/19017
0x02 完整数据流程分析
按照简书大佬的代码步骤,把一次完整的对象请求的数据包抓取下来进行分析。
首先看第一个op=get,两个IP地址都为127.0.0.1
服务端初始化,得到NameService信息
执行的代码为:
此行代码返回的是暂时名称服务的对象引用。对象引用objRef是个通用CORBA对象,为了要能把它作为NamingContextExt对象使用,必须要将它转换成合适的类型。在CORBA中需使用方法narrow来实现这个转换。
看序号为2的返回数据包:
返回相应nameservice以及RootPOA信息
看序号为3的数据包执行的代码:
序号为3的数据包:
永久名称服务的对象引用
序号为4的数据包返回永久名称服务的对象引用信息
序号为5的数据包,发送一个需要绑定的对象的名称:
执行的代码为:
序号为5的数据包
nameservice返回序号为6的数据包
序号为7的数据包,绑定一个特定的对象到特定的nameservice特定的名称下:
执行的代码为:
序号为7的数据包:
返回序号为8的数据包:
客户端从序号9到序号12重复的都是服务端获取nameservice,将其转化为永久名称服务引用信息。
唯一不同的就是服务端对nameservice是to_name与rebind,客户端对nameservice是resolver_str与引用对象方法的调用。
这里贴一下客户端的代码:
直接到数据包13,客户端对nameservice的resolver_str
nameservice返回数据包14,其中包括具体的对象引用信息
客户端调用sayHello方法,向服务端发送数据包15
服务端返回具体调用的方法信息,返回数据包16
最后客户端发送shutdown信息,结束方法的调用,关闭与服务端的通信
来源:freebuf.com 2020-09-09 21:49:34 by: 水木逸轩con
请登录后发表评论
注册