• 关于pwn题的栈平衡中ret的作用


    以nssctf里的where_is_my_shell为例

    题目提供了一个system函数,和一个buf数组。数组的栈空间如图所示,这里不讨论怎么解题,只说明payload里的ret的作用。
    假设没有ret,栈溢出到ret的时候内容如下:
    第一个八字节:

    (图示位置)存储 pop rdi;ret;的地址
    它下面的八个字节存储要pop的参数。再下面八个字节存储system函数的地址。
    这个时候我们可以知道一共存了三个八字节,第一个八字节的地址以8为起始,第二个以10为起始,第三个自然就是18为起始。问题就出在这里,
    调用system函数的时候,它里面有一个函数要求system的rsp是16字节对齐的。即rsp指向system函数并执行时,system在栈中的地址必须是以0结尾的。
    而此时是以8为结尾的。所以会产生错误。
    此时在原本函数ret的位置再加一个ret就可以解决问题。原理如下:
    根据汇编知识可知ret指令相当于把rsp所指向的栈中存储的地址赋给rip执行,然后使rsp+8(即使rsp指向栈中下一个位置).所以在所起作用的三个八字节前面加上一个ret(占八个字节)会使得这三个八字节的起始位置都往后顺延八个字节。所以此时system函数的起始地址就是以0结尾,满足16字节对齐要求。而由于ret的特殊性,在所执行操作前加上一个ret不会影响执行。
    加一个ret后的操作如下:
    原本函数的ret将我找到的ret地址赋给rip然后使rsp指向pop rdi;ret;的地址。然后rip执行ret指令,即把pop rdi;ret;的地址赋给rip然后执行后续操作。
    所以加上ret后不会影响payload的执行,只会使payload里其它操作的地址往后顺延八个字节。

  • 相关阅读:
    大龄程序员的一周#3:差点“零成长”
    带头双向循环链表的增删查改(C语言实现)
    【opencv】选择区域进行滤波处理
    独立站源码搭建,跨境独立站怎么搭建?
    Gitlab CI/CD 入门教程
    低调而无为而治,藏在超级应用背后的道家哲学
    测试理论: 一个总结和梳理
    golang学习参考记录
    POJ 2739 Sum of Consecutive Prime Numbers 尺取法
    【SQL刷题】Day2----SQL语法基础查询
  • 原文地址:https://www.cnblogs.com/loserw/p/18118156