我试图了解缓冲区溢出漏洞,更具体地说,如何使用它来运行自己的代码--例如启动我们自己的恶意应用程序或类似的东西。
虽然我理解使用get()函数(用足够长的字符串覆盖返回地址,然后跳转到所述地址)利用缓冲区溢出漏洞的想法,但在实际应用程序中,有几件事情我很难理解,它们是:
作为家庭作业,我试图利用一个非常简单的程序,它只要求使用get()输入(ASLR关闭),然后打印它。虽然我可以找到调用它的函数的内存地址和返回,但我不知道如何实际实现该漏洞。
发布于 2017-11-18 15:04:46
您了解更改返回地址如何让您跳转到任意位置。
但是,由于正确标识,您不知道在哪里加载了要执行的代码。您刚刚将其复制到一个本地缓冲区(大部分是堆栈中的某个位置)。
但是有一些东西总是指向这个堆栈,它就是堆栈指针寄存器。(假设是x64,它将是%rsp)。
假设您的自定义代码位于堆栈的顶部。(它可以被抵消,但也可以类似地加以管理)。
现在我们需要一条指令: 1.允许我们跳转到esp 2。位于一个固定地址。
所以大多数二进制文件都使用某种共享库。在窗户上有kernel32.dll。在加载这个库的所有程序中,它总是映射在相同的地址上。所以你知道这个图书馆里每条指令的确切位置。
您所要做的就是拆解一个这样的库,并找到如下的指令
jmp *%rsp // or a sequence of instructions that lets you jump to an offset然后这个指令的地址就是你要把返回地址放在什么地方。函数将返回,然后跳转到堆栈(当然,您需要一个可执行堆栈)。然后它将执行您的任意代码。
希望这能为如何运行该漏洞扫清一些困惑。
回答你的其他问题-
是的,您可以直接将代码放在缓冲区中。或者,如果您能够找到要执行的确切代码(同样是在共享库中),则只需跳到该代码即可。
是的,gets会停在\n和0。但是通常情况下,您可以通过稍微修改指令来编写根本不使用这些字节的代码。
您可以尝试不同的指令并检查组装的字节。
https://stackoverflow.com/questions/47367237
复制相似问题