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

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

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

1599658796.png!small

1599658826.png!small

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

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

1599658893.png!small

执行的代码为:

1599658914.png!small

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

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

1599658949.png!small

返回相应nameservice以及RootPOA信息

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

1599658964.png!small

序号为3的数据包:

1599658977.png!small

永久名称服务的对象引用

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

1599658996.png!small

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

执行的代码为:

1599659011.png!small

序号为5的数据包

1599659019.png!small

nameservice返回序号为6的数据包

1599659027.png!small

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

执行的代码为:

1599659036.png!small

序号为7的数据包:

1599659044.png!small

返回序号为8的数据包:

1599659052.png!small

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

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

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

1599659062.png!small

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

1599659072.png!small

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

1599659079.png!small

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

1599659088.png!small

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

1599659096.png!small

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

1599659104.png!small

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

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论