文章总结: 本文介绍了COOPgadget的搜索方法,将其分为Dispatcher和普通gadget两类。Dispatcher负责循环调用可控内存地址,普通gadget执行简单元操作。通过遍历.text段函数,依据首尾指令特征及数量限制进行筛选,Dispatcher需满足特定mov、间接调用及跳转指令组合,普通gadget需满足基于rcx的寄存器赋值条件,利用rcx指向可控block的特性实现利用。 综合评分: 85 文章分类: 二进制安全,漏洞分析,逆向分析,漏洞POC
COOP gadget搜索方法
原创
kali kali
信安学习
2026年3月8日 09:24 福建
上篇COOP(Counterfeit Object Oriented Programming)实例分析我们探讨了一个COOP的实例,本文我们研究下怎么搜索COOP gadget。
首先,COOP gadget分为Dispatcher和普通gadget两种。前者我们期望能循环从我们可控内存取出函数地址,并加以调用。后者通常是个短小的合法函数(在浏览器之类大项目里还是不少的),包含一个简单的元操作(例如给寄存器赋值、间接调用某个地址、把寄存器的值写入内存)然后就ret。
我们参考这个代码(代码本身有点小问题不能直接运行,只看思路):
https://github.com/uf0o/Counterfeit_Object_Oriented_Programming_COOP/blob/main/looper_idapython.py
可以看到无论是搜索Dispatcher还是普通gadget,它都在.text段遍历函数列表,要求函数第一条指令是mov开头,最后一条指令是ret。函数包含的指令数量也有限制,Dispatcher要求<=0x30条,普通gadget<=0xF条。
细分的搜索条件如下。
Dispatcher要求包含这3条指令:
mov rbx, [rcx±...] ; rbx想必可以换成任意regcall __guard_dispatch_icall_fptr ; 包含间接调用jnz 地址 ; 地址要求<上面那条间接调用指令的地址
普通gagdet只要求包含:
mov reg/reg32, [rcx+...] ; reg/reg32是我们指定寄存器(如rbx)或其32位形式(如ebx)
注意上面两类gadget搜索条件为啥都包含rcx呢?如上篇文章所讲,rcx指向block,而block地址是我们可控的。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:信安学习 kali kali《COOP gadget搜索方法》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论