Skip to content
Vol. 1 · Ed. 2026
CyberGlossary
Entry № 753

one_gadget RCE

one_gadget RCE 是什么?

one_gadget RCECTF 与真实利用中常用的捷径,只要满足寄存器与栈条件,就能用一个 libc 地址直接得到 shell。


one_gadget 是 glibc 中的一段指令序列,在特定的寄存器与栈前置条件下会最终调用 execve("/bin/sh", NULL, NULL)。david942j 编写的 one_gadget 工具会扫描 libc 并列举这些地址及其约束,例如要求 rax == 0 或 rsp+0x40 == NULL。当攻击者拥有一次函数指针或返回地址的劫持机会(GOT 覆盖、FILE 流攻击、unsorted bin 等)时,即可直接获得 shell,而无须构造完整 ROP 链。条件需仔细满足,常用辅助 gadget 或 stack pivot 协助。缓解措施包括常量混淆、CFI、seccomp 沙箱,以及对 libc 做剥离或修改以移除常见 gadget。

示例

  1. 01

    在 libc-2.31 二进制上仅通过一次 GOT 覆盖即可借助 one_gadget 启动 /bin/sh。

  2. 02

    FILE 流利用通过破坏 _IO_2_1_stdout_ 的 vtable,跳转到条件满足的 one_gadget。

常见问题

one_gadget RCE 是什么?

CTF 与真实利用中常用的捷径,只要满足寄存器与栈条件,就能用一个 libc 地址直接得到 shell。 它属于网络安全的 攻击与威胁 分类。

one_gadget RCE 是什么意思?

CTF 与真实利用中常用的捷径,只要满足寄存器与栈条件,就能用一个 libc 地址直接得到 shell。

one_gadget RCE 是如何工作的?

one_gadget 是 glibc 中的一段指令序列,在特定的寄存器与栈前置条件下会最终调用 execve("/bin/sh", NULL, NULL)。david942j 编写的 one_gadget 工具会扫描 libc 并列举这些地址及其约束,例如要求 rax == 0 或 rsp+0x40 == NULL。当攻击者拥有一次函数指针或返回地址的劫持机会(GOT 覆盖、FILE 流攻击、unsorted bin 等)时,即可直接获得 shell,而无须构造完整 ROP 链。条件需仔细满足,常用辅助 gadget 或 stack pivot 协助。缓解措施包括常量混淆、CFI、seccomp 沙箱,以及对 libc 做剥离或修改以移除常见 gadget。

如何防御 one_gadget RCE?

针对 one_gadget RCE 的防御通常结合技术控制与运营实践,详见上方完整定义。

one_gadget RCE 还有哪些其他名称?

常见的别称包括: one_gadget。

相关术语