OneGadget

libc中存在的execve("/bin/sh", rsp+$offset, environ)

在栈环境符合[rsp+$offset]=NULL的约束下即可getshell,

在64位寄存器传参方式下较为常用

https://github.com/david942j/one_gadget

https://xz.aliyun.com/t/2720

one_gadget的一些用法

one_gadget的约束在于栈上的参数,因此只要调整栈帧至合适的状态即可

0x01 更多one_gadget

one_gadgets 默认的输出等级为l0,仅输出最少的one_gadgets,带上-l2参数可以找到更多的one_gadget,工具本身更提供了自动尝试所有one_gadgets的功能

0x02 向前调整one_gadget

可以试试往one_gadget前面的语句跳转来避免一些过滤

0x03 malloc_printerr触发

malloc_hook打入onegadget后

利用触发double free等方式通过malloc_printerr触发malloc_hook成功率极高

0x04 函数中转调整栈帧

realloc_hook同malloc_hook相邻,可以一起写入

例如malloc_hook写成realloc函数开头某个push的位置,

realloc_hook写入onegadget

这样在malloc_hook时首先会进入relloac中压低堆栈然后运行realloc_hook中的ogg