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

问题描述 投票:0回答:1

我正在读一篇关于Buffer Overflow Attack的文章:http://www.cse.scu.edu/~tschwarz/coen152_05/Lectures/BufferOverflow.html 从理论上讲,我理解它在说什么。

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

我只是想知道,在实际案例中,黑客将如何做? 正如它说:

真正的攻击会尝试放置堆栈顶部的地址来代替返回地址,然后是一些可怕的汇编代码行,例如调用另一个工具。

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

c++ c security assembly buffer-overflow
1个回答
1
投票

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


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

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

通常你会选择像/bin/sh(Unix shell)这样的args。根据上下文,其输入可能仍然连接到用于发送漏洞利用负载的网络套接字。 (通常称为“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”)内的返回地址落地之前,可能需要进行大量的尝试。

© www.soinside.com 2019 - 2024. All rights reserved.