是否可以通过另一个程序调用程序

Is it possible to invoke a program through another program

本文关键字:程序 调用 另一个 可以通过 是否      更新时间:2023-10-16

我正在阅读一篇有关缓冲溢出攻击的文章:http://www.cse.scu.edu/~tschwarz/coen152_05/lectures/bufferover.html
从理论上讲,我了解它在说什么。

但我无法想象这种攻击如何可以执行黑客程序。
对于文章中的示例,由于设计的字符串而被称为bar。但是,bar是同一程序的函数。换句话说,他是故意攻击自己的。众所周知,程序中的任何地址仅属于自己,这意味着您无法调用另一个程序的函数。

我只想知道,在实际情况下,黑客将如何做?
正如它所说:

真正的攻击将试图放置堆栈顶部的地址 代替返回地址,然后是一些可怕的线 装配代码,例如调用另一个工具。

什么是"一些可怕的组装线"?有一个简单的例子吗?

去阅读以获取乐趣和利润来粉碎堆栈。它具有32位x86的特定示例。


是的,程序一直在运行其他程序。例如命令壳采用您输入并运行该程序的输入。或在GUI中,双击程序会运行它。绘制文件管理器窗口并接收您的双击的程序本身就是一个程序(或图形外壳)。

无论如何, OS有一个系统调用,用于启动新程序,并且通过获得足够的控制来在您正在攻击的过程中运行少量代码,您(攻击者)可以调用该系统调用ARGS,以启动您在远程计算机上想要的任何程序。

通常,您会选择像 /bin/sh(Unix shell)这样的args。根据上下文的不同,其输入可能仍连接到您用于发送利用有效载荷的网络套接字。(通常称为" shellcode",因为典型的利用目标是调用外壳。尽管该术语现在更通用,并且适用于任何可执行的机器代码利用有效载荷,尤其是在格式化为字符串时。通常这意味着避免任何0字节在机器代码中。)


我知道,程序中的任何地址仅属于自己,这意味着您无法调用另一个程序的函数。

数据是代码,代码是数据。一旦您的攻击过程通过您的攻击过程读取内存中的利用有效载荷(即机器代码),它就会在目标过程中具有一个地址。

最简单的缓冲区溢出包括覆盖函数返回地址的代码和数据,因此该功能返回到利用有效载荷而不是其呼叫者。这是用于在呼叫堆栈上分配的缓冲区的经典堆栈弹性攻击,例如函数中的char buf[16]; // nobody ever types more than 16 digit numbers, right?

从该页面中,您已经知道攻击者如何使用缓冲区溢出来控制返回地址。

诸如不可执行的内存之类的东西,例如W^X(写或执行,不是两者)和ASLR(地址空间布局随机化,均旨在打败这种攻击。如果堆栈地址是随机的,则可能需要很多尝试,然后才能获得返回之前在您的利用有效载荷中降落在一堆nop中的地址(一个" nop雪橇")。