- 发布于
栈对齐
- 作者
- Name
- CuB3y0nd
- GitHub
- @CuB3y0nd
在进行 64-bit 系统上的攻击时,你可能会遇到一个小问题,即你的攻击脚本在本地运行完美,在远程环境中却失败了。甚至在尝试使用提供的 libc 版本而不是本地版本时也会失败。这一问题的根源在于栈对齐。
本质上,x86-64 ABI(应用程序二进制接口)保证了在调用指令上的 16-bits 对齐。libc 利用了这一点,并使用 SSE 数据传输指令来优化执行;特别是在 system
中会使用诸如 movaps
等指令。
这意味着如果栈不是 16-bits 对齐的(即 RSP
不是 16 的倍数),那么 ROP 链在执行 system
时会失败。
修复方法很简单,在你的 ROP 链中调用 system
之前,插入一个单独的 ret
gadget:
ret = elf.address + 0x2439
[...]
rop.raw(POP_RDI)
rop.raw(0x4) # first parameter
rop.raw(ret) # align the stack
rop.raw(system)
这样做会使 RSP
出栈,向前移动 8-bits,从而实现对齐。