首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用缓冲区溢出漏洞运行自己的代码

使用缓冲区溢出漏洞运行自己的代码
EN

Stack Overflow用户
提问于 2017-11-18 14:38:07
回答 1查看 843关注 0票数 0

我试图了解缓冲区溢出漏洞,更具体地说,如何使用它来运行自己的代码--例如启动我们自己的恶意应用程序或类似的东西。

虽然我理解使用get()函数(用足够长的字符串覆盖返回地址,然后跳转到所述地址)利用缓冲区溢出漏洞的想法,但在实际应用程序中,有几件事情我很难理解,它们是:

  • 我是否将自己的代码放入返回地址后面的字符串中?如果是的话,我怎么知道要跳到的地址呢?如果没有,我应该跳转到哪里,实际代码在哪里?
  • 运行代码的实际有效载荷是我自己正在运行的软件,而另一个程序只是跳入其中,还是所有的指令都提供在有效载荷中?或者更具体地说,缓冲区溢出攻击实现实际上是什么样子的?
  • 当地址(或任何指令)包含0时,我能做什么?获取()函数在读取0时停止读取,那么如何才能绕过这个问题?

作为家庭作业,我试图利用一个非常简单的程序,它只要求使用get()输入(ASLR关闭),然后打印它。虽然我可以找到调用它的函数的内存地址和返回,但我不知道如何实际实现该漏洞。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-18 15:04:46

您了解更改返回地址如何让您跳转到任意位置。

但是,由于正确标识,您不知道在哪里加载了要执行的代码。您刚刚将其复制到一个本地缓冲区(大部分是堆栈中的某个位置)。

但是有一些东西总是指向这个堆栈,它就是堆栈指针寄存器。(假设是x64,它将是%rsp)。

假设您的自定义代码位于堆栈的顶部。(它可以被抵消,但也可以类似地加以管理)。

现在我们需要一条指令: 1.允许我们跳转到esp 2。位于一个固定地址。

所以大多数二进制文件都使用某种共享库。在窗户上有kernel32.dll。在加载这个库的所有程序中,它总是映射在相同的地址上。所以你知道这个图书馆里每条指令的确切位置。

您所要做的就是拆解一个这样的库,并找到如下的指令

代码语言:javascript
复制
jmp *%rsp // or a sequence of instructions that lets you jump to an offset

然后这个指令的地址就是你要把返回地址放在什么地方。函数将返回,然后跳转到堆栈(当然,您需要一个可执行堆栈)。然后它将执行您的任意代码。

希望这能为如何运行该漏洞扫清一些困惑。

回答你的其他问题-

是的,您可以直接将代码放在缓冲区中。或者,如果您能够找到要执行的确切代码(同样是在共享库中),则只需跳到该代码即可。

是的,gets会停在\n和0。但是通常情况下,您可以通过稍微修改指令来编写根本不使用这些字节的代码。

您可以尝试不同的指令并检查组装的字节。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47367237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档