Corba DEMO流量分析 – 作者:水木逸轩con

18次阅读
没有评论

首先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 完整数据流程分析

按照简书大佬的代码步骤,把一次完整的对象请求的数据包抓取下来进行分析。

Corba DEMO流量分析 - 作者:水木逸轩con

Corba DEMO流量分析 - 作者:水木逸轩con

首先看第一个op=get,两个IP地址都为127.0.0.1

服务端初始化,得到NameService信息

Corba DEMO流量分析 - 作者:水木逸轩con

执行的代码为:

Corba DEMO流量分析 - 作者:水木逸轩con

此行代码返回的是暂时名称服务的对象引用。对象引用objRef是个通用CORBA对象,为了要能把它作为NamingContextExt对象使用,必须要将它转换成合适的类型。在CORBA中需使用方法narrow来实现这个转换。

看序号为2的返回数据包:

Corba DEMO流量分析 - 作者:水木逸轩con

返回相应nameservice以及RootPOA信息

看序号为3的数据包执行的代码:

Corba DEMO流量分析 - 作者:水木逸轩con

序号为3的数据包:

Corba DEMO流量分析 - 作者:水木逸轩con

永久名称服务的对象引用

序号为4的数据包返回永久名称服务的对象引用信息

Corba DEMO流量分析 - 作者:水木逸轩con

序号为5的数据包,发送一个需要绑定的对象的名称:

执行的代码为:

Corba DEMO流量分析 - 作者:水木逸轩con

序号为5的数据包

Corba DEMO流量分析 - 作者:水木逸轩con

nameservice返回序号为6的数据包

Corba DEMO流量分析 - 作者:水木逸轩con

序号为7的数据包,绑定一个特定的对象到特定的nameservice特定的名称下:

执行的代码为:

Corba DEMO流量分析 - 作者:水木逸轩con

序号为7的数据包:

Corba DEMO流量分析 - 作者:水木逸轩con

返回序号为8的数据包:

Corba DEMO流量分析 - 作者:水木逸轩con

客户端从序号9到序号12重复的都是服务端获取nameservice,将其转化为永久名称服务引用信息。

唯一不同的就是服务端对nameservice是to_name与rebind,客户端对nameservice是resolver_str与引用对象方法的调用。

这里贴一下客户端的代码:

Corba DEMO流量分析 - 作者:水木逸轩con

直接到数据包13,客户端对nameservice的resolver_str

Corba DEMO流量分析 - 作者:水木逸轩con

nameservice返回数据包14,其中包括具体的对象引用信息

Corba DEMO流量分析 - 作者:水木逸轩con

客户端调用sayHello方法,向服务端发送数据包15

Corba DEMO流量分析 - 作者:水木逸轩con

服务端返回具体调用的方法信息,返回数据包16

Corba DEMO流量分析 - 作者:水木逸轩con

最后客户端发送shutdown信息,结束方法的调用,关闭与服务端的通信

Corba DEMO流量分析 - 作者:水木逸轩con

来源:freebuf.com 2020-09-09 21:49:34 by: 水木逸轩con

正文完
 0
评论(没有评论)