WINDOWS的RPC参数反序列化(应该叫散集吧?)对输入缺少检查,很容易造成缓冲区溢出
比如调用GetInfoForName,其IDL描述如下:
[helpstring("method GetInfoForName")]
HRESULT GetInfoForName
(
[in, string] const unsigned char * szVarName,
[in, out, unique, size_is(cchBuffer)] unsigned char * pchBuffer,
[in] DWORD cchBuffer,
[out] DWORD * pcchRequired
);
缓冲pchBuffer是输入和输出参数,其大小是参数cchBuffer的值,比如cchBuffer=8,RPC会传递pchBuffer的长度8还有内容,而cchBuffer是另一个参数,RPC同样会传递.
在RPC服务方,RPC的参数反序列化程序会解码出pchBuffer,检测其长度合法性,同样解码出另一个参数cchBuffer,解码出的cchBuffer和pchBuffer没有一点关联检测.
如果我们在RPC的参数序列化过程中伪造比较小的cchBuffer,而pchBuffer设置比较大,就会导致RPC服务程序得到错误的pchBuffe大小限制cchBuffer,而往里面拷贝过多的数据,造成缓冲区溢出.因为RPC是申请堆存放参数,pchBuffe在堆里面,所以会是堆溢出.
比如调用GetInfoForName,其IDL描述如下:
[helpstring("method GetInfoForName")]
HRESULT GetInfoForName
(
[in, string] const unsigned char * szVarName,
[in, out, unique, size_is(cchBuffer)] unsigned char * pchBuffer,
[in] DWORD cchBuffer,
[out] DWORD * pcchRequired
);
缓冲pchBuffer是输入和输出参数,其大小是参数cchBuffer的值,比如cchBuffer=8,RPC会传递pchBuffer的长度8还有内容,而cchBuffer是另一个参数,RPC同样会传递.
在RPC服务方,RPC的参数反序列化程序会解码出pchBuffer,检测其长度合法性,同样解码出另一个参数cchBuffer,解码出的cchBuffer和pchBuffer没有一点关联检测.
如果我们在RPC的参数序列化过程中伪造比较小的cchBuffer,而pchBuffer设置比较大,就会导致RPC服务程序得到错误的pchBuffe大小限制cchBuffer,而往里面拷贝过多的数据,造成缓冲区溢出.因为RPC是申请堆存放参数,pchBuffe在堆里面,所以会是堆溢出.
本文由站长原创或收集,不代表本站立场,如若转载,请注明出处:http://yesck.com/post/386/
本文 暂无 评论