Stack Pivoting

Uncategorized
537 words

为什么需要stack pivoting

  • 当stack overflow的空间不足时

怎么实现stack pivoting

通过将ebp覆盖成构造的fake_ebp,然后利用leave_ret这个gadget将esp劫持到fake_ebp的地址上,从而实现栈的迁移

为什么是leave ret

  • leave:

    • mov esp , ebp;
    • pop ebp;
  • ret:

    • pop eip

实现过程

首先程序有stack overflow漏洞,我们将栈覆盖成下面的样子

执行完mov esp , ebp

接着就是pop ebp,执行完后如图

由于esp是栈顶指针,当pop ebp后,栈顶的元素被弹给了ebp,所以esp应当向下移4个字节,也就是一个单位

下一步通过read()函数的ret来把内容输入到fake_ebp1地址上,这里主要是要将fake_ebp2的地址给到fake_ebp1的地址上

下一步就来到了leave_ret,也就是重复上方的mov esp,ebp pop ebppop eip

mov esp,ebp

接着pop ebp,由于fake_ebp1中放的是fake_ebp2的地址,所以ebp会指到fake_ebp2处去

此时再执行ret命令,他就会执行我们构造在bss段或者data段上的内容了

到这里stack pivoting就完成了