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

时间:2017-12-15 10:11:21

标签: c++ c security assembly buffer-overflow

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

但是我无法想象这种攻击会如何执行黑客程序 对于本文中的示例,由于设计的字符串而调用函数bar。但是,bar是同一程序的功能。换句话说,他故意乱砍自己。据我所知,程序中的任何地址只属于自己,这意味着你不能调用另一个程序的函数来考虑它的地址。

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

  

真正的攻击会尝试放置堆栈顶部的地址   代替回程地址,接着是一些可怕的线条   汇编代码,例如调用另一个工具。   

什么是“一些可怕的装配线”?有一个简单的例子吗?

1 个答案:

答案 0 :(得分:1)

阅读Smashing The Stack For Fun And Profit。它有一个32位x86的具体示例。

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

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

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

  

据我所知,程序中的任何地址只属于自己,这意味着你不能调用另一个程序的函数来考虑它的地址。

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

最简单的缓冲区溢出包括覆盖函数返回地址的代码和数据,因此函数返回到exploit有效负载而不是其调用者。这是对调用堆栈上分配的缓冲区的经典堆栈粉碎攻击,如函数内的char buf[16]; // nobody ever types more than 16 digit numbers, right?

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

像非可执行内存这样的东西,例如W^X(写或执行,而不是两者),and ASLR (address-space layout randomization,都旨在打败这种攻击。如果堆栈地址是随机的,那么在你设法让你的漏洞有效载荷中的一堆NOP(一个" nop sled")内的返回地址之前,可能需要进行大量的尝试。 / p>