WINDOWS的RPC溢出问题

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在堆里面,所以会是堆溢出.

本文由站长原创或收集,不代表本站立场,如若转载,请注明出处:http://yesck.com/post/386/

本文 暂无 评论

回复给

欢迎点评

联系我们

站长QQ:8117829

站长邮件:8117829@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code