我正在阅读一篇关于缓冲区溢出攻击的文章:http://www.cse.scu.edu/~tschwarz/coen152_05/Lectures/BufferOverflow.html
从理论上讲,我理解它在说什么。
但是我无法想象这种攻击会如何执行黑客程序
对于本文中的示例,由于设计的字符串而调用函数bar
。但是,bar
是同一程序的功能。换句话说,他故意乱砍自己。据我所知,程序中的任何地址只属于自己,这意味着你不能调用另一个程序的函数来考虑它的地址。
我只是想知道,在实际情况下,黑客将如何做?
正如它所说:
真正的攻击会尝试放置堆栈顶部的地址 代替回程地址,接着是一些可怕的线条 汇编代码,例如调用另一个工具。
什么是“一些可怕的装配线”?有一个简单的例子吗?
答案 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>