是否可以通过另一个程序调用程序
Is it possible to invoke a program through another program
我正在阅读一篇有关缓冲溢出攻击的文章:http://www.cse.scu.edu/~tschwarz/coen152_05/lectures/bufferover.html
从理论上讲,我了解它在说什么。
但我无法想象这种攻击如何可以执行黑客程序。
对于文章中的示例,由于设计的字符串而被称为bar
。但是,bar
是同一程序的函数。换句话说,他是故意攻击自己的。众所周知,程序中的任何地址仅属于自己,这意味着您无法调用另一个程序的函数。
我只想知道,在实际情况下,黑客将如何做?
正如它所说:
真正的攻击将试图放置堆栈顶部的地址 代替返回地址,然后是一些可怕的线 装配代码,例如调用另一个工具。
什么是"一些可怕的组装线"?有一个简单的例子吗?
去阅读以获取乐趣和利润来粉碎堆栈。它具有32位x86的特定示例。
是的,程序一直在运行其他程序。例如命令壳采用您输入并运行该程序的输入。或在GUI中,双击程序会运行它。绘制文件管理器窗口并接收您的双击的程序本身就是一个程序(或图形外壳)。
无论如何, OS有一个系统调用,用于启动新程序,并且通过获得足够的控制来在您正在攻击的过程中运行少量代码,您(攻击者)可以调用该系统调用ARGS,以启动您在远程计算机上想要的任何程序。
通常,您会选择像 /bin/sh
(Unix shell)这样的args。根据上下文的不同,其输入可能仍连接到您用于发送利用有效载荷的网络套接字。(通常称为" shellcode",因为典型的利用目标是调用外壳。尽管该术语现在更通用,并且适用于任何可执行的机器代码利用有效载荷,尤其是在格式化为字符串时。通常这意味着避免任何0
字节在机器代码中。)
我知道,程序中的任何地址仅属于自己,这意味着您无法调用另一个程序的函数。
数据是代码,代码是数据。一旦您的攻击过程通过您的攻击过程读取内存中的利用有效载荷(即机器代码),它就会在目标过程中具有一个地址。
最简单的缓冲区溢出包括覆盖函数返回地址的代码和数据,因此该功能返回到利用有效载荷而不是其呼叫者。这是用于在呼叫堆栈上分配的缓冲区的经典堆栈弹性攻击,例如函数中的char buf[16]; // nobody ever types more than 16 digit numbers, right?
。
从该页面中,您已经知道攻击者如何使用缓冲区溢出来控制返回地址。
诸如不可执行的内存之类的东西,例如W^X
(写或执行,不是两者)和ASLR(地址空间布局随机化,均旨在打败这种攻击。如果堆栈地址是随机的,则可能需要很多尝试,然后才能获得返回之前在您的利用有效载荷中降落在一堆nop中的地址(一个" nop雪橇")。
- C# DLL 从C++应用程序调用 SOAP Web 服务
- 从C++程序调用 git 克隆
- 使用另一个程序调用正在运行的 C++ 程序中的函数
- C++控制台应用程序调用C++/CLI静态库
- 从 C# Windows 应用程序调用 C dll 会导致 svchost.exe 崩溃
- LoadLibray FileNotFound 取决于哪个应用程序调用
- 为什么无法在 Cocoa 应用程序调用的 C++ func 中嵌入自定义 Python 模块
- 使用模拟器C++从RISC-V裸机程序调用printf系统调用时失败
- C++程序调用 C 函数 在 g++ 链接期间获取未定义的引用
- 使用 gtest 和 gmock 验证程序调用
- 从 Qt 小部件应用程序调用 pyqt widget
- 如何使用Mono / C#程序调用Linux / C ++函数?
- 是否可以通过另一个程序调用程序
- 从应用程序调用静态库时,QT创建者什么都不会发生
- 如何知道库的哪些功能是由程序调用的
- OpenCV 函数在由C++线程程序调用的 Python 脚本本身调用时锁定
- numpy.core.multiarray在通过Xcode中开发的C 应用程序调用Python模块时未能导入
- 如何使用 lamba 作为连接处理程序调用 boost async_connect 作为成员函数
- 如何调试由另一个程序调用的程序
- 从C 程序调用FFMPEG