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

Is it possible to invoke a program through another program

我正在阅读一篇关于缓冲区溢出攻击的文章:http://www.cse.scu.edu/~tschwarz/coen152_05/Lectures/BufferOverflow.html
理论上我明白它在说什么。

但是我无法想象黑客程序是如何被这种攻击执行的。
文章中的例子,因为设计了字符串,调用了函数bar。但是,bar 是同一程序的函数。换句话说,他是在故意黑自己。据我所知,程序中的任何地址都只属于它自己,这意味着你不能调用另一个程序的函数来调用它的地址。

我只想知道在真实案例中,黑客会怎么做?
正如它所说:

A real attack would try to place the address of the top of the stack in lieu of the return address, followed by some horrible lines of assembly code, such as a call to another tool.

什么是"some horrible lines of assembly"?有没有简单的例子?

去读 Smashing The Stack For Fun And Profit。它有一个针对 32 位 x86 的特定示例。


是的,一直在运行 运行 其他程序。例如命令 shell 接收您键入的输入,然后 运行 接收该程序。或者在 GUI 中,双击一个程序 运行s 它。绘制文件管理器 window 并接收您的双击的程序本身就是一个程序(或图形 shell)。

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

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


As I know, any address in a program only belongs itself, meaning that you can't invoke a function of another program thought its address.

数据即代码,代码即数据。一旦您的攻击负载(即机器代码)被您正在攻击的进程读入内存,它就会在目标进程中有一个地址。

最简单的缓冲区溢出类型包括覆盖函数 return 地址的代码和数据,因此函数 return 会发送到漏洞利用负载而不是其调用者。这是针对调用堆栈上分配的缓冲区的经典堆栈粉碎攻击,例如函数内部的 char buf[16]; // nobody ever types more than 16 digit numbers, right?

从该页面,您已经知道攻击者如何通过缓冲区溢出来控制 return 地址。

诸如不可执行内存之类的东西,例如W^X(write 或 exec,不能两者兼而有之),and ASLR (address-space layout randomization,都是为了打败这种攻击而设计的。如果堆栈地址是随机的,则可能需要多次尝试才能使 return 地址落入漏洞利用负载中的一堆 NOP("nop sled")中。