我正在阅读一篇关于缓冲区溢出攻击的文章:http : //www.cse.scu.edu/~tschwarz/coen152_05/Lectures/BufferOverflow.html
理论上我明白它在说什么。
但是我无法想象黑客程序是如何被这种攻击执行的。
对于文章中的示例,bar
由于设计的字符串而调用该函数。但是,bar
是同一个程序的函数。换句话说,他是在故意黑自己。据我所知,程序中的任何地址都只属于它自己,这意味着您不能通过其地址调用另一个程序的函数。
我只想知道在真实情况下,黑客会怎么做?
正如它所说:
真正的攻击会尝试将栈顶地址代替返回地址,然后是一些可怕的汇编代码行,例如调用另一个工具。
什么是“一些可怕的装配线”?有简单的例子吗?
去阅读粉碎堆栈以获得乐趣和利润。它有一个针对 32 位 x86 的特定示例。
是的,程序一直在运行其他程序。例如,命令外壳接受您键入的输入并运行该程序。或者在 GUI 中,双击程序运行它。绘制文件管理器窗口并接收双击的程序本身就是一个程序(或图形外壳)。
无论如何,操作系统有一个用于启动新程序的系统调用,并且通过获得足够的控制权在您正在攻击的进程中运行少量代码,您(攻击者)可以使用 args 调用该系统调用来启动任何程序你想在远程计算机上。
通常你会选择 args 之类的/bin/sh
(Unix shell)。根据上下文,其输入可能仍连接到您用于发送漏洞利用负载的网络套接字。(通常称为“shellcode”,因为典型的漏洞利用目标是调用 shell。虽然这个术语现在更通用,适用于任何可执行的机器代码漏洞利用有效载荷,尤其是格式化为字符串时。通常这意味着避免任何0
字节机器码。)
据我所知,程序中的任何地址都只属于它自己,这意味着您不能通过其地址调用另一个程序的函数。
数据就是代码,代码就是数据。一旦您的攻击载荷(即机器代码)被您正在攻击的进程读入内存,它就会在目标进程中拥有一个地址。
最简单的缓冲区溢出类型包括覆盖函数返回地址的代码和数据,因此函数返回到漏洞利用负载而不是其调用者。这是对调用堆栈上分配的缓冲区的经典堆栈粉碎攻击,就像char buf[16]; // nobody ever types more than 16 digit numbers, right?
在函数内部一样。
从该页面,您已经知道攻击者如何通过缓冲区溢出来控制返回地址。
诸如不可执行的内存W^X
(例如写入或执行,而不是两者)和 ASLR(地址空间布局随机化)之类的东西都旨在击败这种攻击。如果堆栈地址是随机的,则可能需要多次尝试您设法使返回地址落在您的漏洞利用负载中的一堆 NOP(“nop 雪橇”)中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句