我可以理解缓冲区溢出是什么,并且它允许您在您不应该能够写入的内存位置进行写入。我还可以理解可能存在其他软件漏洞的概念,这些漏洞以不同的方式工作,允许您将想要的东西放入内存中。我还使用 metasploit 访问了我的一些旧 XP 机器,这很有趣。
但是我无法真正理解如何通过考虑(例如)缓冲区溢出漏洞来访问远程系统。
有几点我不清楚:
- 有漏洞的程序是否需要运行并监听受害机器上的特定端口(如迷你服务器或其他东西)?如果一个写得不好的程序不监听端口,它可以被远程利用吗?
- 我假设程序将从该端口读取一些输入,然后将其写入某个变量的内存中,并可能对其进行处理。为程序提供比它应该读取的更多的数据,并假设它存在漏洞,它将写入内存中的某个位置(特别是在变量之后)我们想要的任何位置。这怎么不会在 99.9% 的情况下使程序崩溃?如果恰好在内存中存储此变量的位置之后有一个指向某个函数的指针无法执行并且程序崩溃了怎么办?
- 假设程序没有崩溃,我们如何执行我们注入内存的代码?我们是否需要将我们想要的代码放在内存中我们知道它将被执行的地方?如何执行内存的一些随机部分?几乎从来没有在我的程序中执行我的某个变量,除非我想运行其他程序,这非常罕见,并且不应该与直接从内存中执行代码相同(这让我想起了 eval())。
- 如果第 2 点正确假设漏洞通常出现在易受攻击的程序从端口读取恶意输入并且执行此代码时,那么执行的代码如何能够返回给我,攻击者?我是否将恶意代码发送到我的 IP 地址中的变量或其他东西中?
- 程序通常无法读取或写入另一个程序的内存。这是否意味着当易受攻击的程序关闭时,我将失去与打开的远程 shell 的连接?还是一旦它执行并且我实际上连接到它,它是否会产生一个独立的子进程?
任何人都可以给我一个简单但现实和彻底的例子来说明整个系统是如何工作的,从程序监听某个端口到攻击者获得一个 shell?