为什么/如何允许 GDB 附加到进程并读/写附加进程的地址空间?

逆向工程 数据库 操作系统 过程
2021-07-02 08:11:10

GDB 可以在没有 su 权限的情况下附加到任何进程的事实对我来说是可怕的。例如,是什么阻止我编写恶意软件/病毒(/无论正确的术语是什么),它使用与 GDB 相同的系统调用来附加到任何进程、发送中断、动态更改指令、向分支指令添加断点以更改 ZF等等。?

有了这个能力,你显然可以做很多有害的事情。例如,我正在使用一些 GDB Python 脚本进行一些小技巧,但我看不出是什么阻止了我编写一些非常危险/恶意的东西。

所以我有一些与这如何可能以及这如何安全相关的问题:

(我假设是操作系统允许进程以某种方式向其他进程发送中断,并访问它的地址空间并更改内存。如果我错了,请纠正我)

1)是什么让这个安全?是什么阻止我编写一个程序来改变系统中运行的每个进程的行为?

2) 涉及哪些系统调用?操作系统如何让我访问其他进程的地址空间,同时不从我这里获取我自己的地址空间。(例如 GDB 有它自己的地址空间,但它也可以读取附加进程的地址空间)

3)在我的用户级程序中,是否可以检测到这种“附加”?比如,如果另一个进程附加到我的程序,我可以打印一条消息并终止吗?我如何检测到这一点?

(我使用“附加”作为“开始写入/读取我的地址空间”)

谢谢。

1个回答

2) 系统调用是ptrace该调用具有许多功能,包括“将被跟踪者的内存的一部分复制到我的地址空间中的本地缓冲区”和相反的“将我的缓冲区复制到被跟踪者的内存”。这些与 windowsReadProcessMemoryWriteProcessMemory. 跟踪程序需要使用这些来访问被跟踪程序中的内存。

1) 事实上,你不能附加到不属于你的进程,除非你有root访问权限或(在 Linux 上)CAP_SYS_PTRACE能力。在一些较新的 Linux 中,您甚至没有对ptrace自己所有进程的权限,这取决于yama设置以及被跟踪进程是否是跟踪进程的(孙)子进程。维基百科页面更详细地解释了这一点。

3)不,你不能。至少不可靠。您想使用的任何技巧都可以被跟踪器拦截。此外,您通常不想这样做,因为您需要ptrace调试您的程序,而任何对ptrace拥有权利的人也可以通过其他各种方式来欺骗您。但是,一个进程一次不能附加多个跟踪器,因此您可以拥有一个主进程来生成和ptraces 工作程序,因此没有其他人可以附加到工作程序来跟踪它。当然,worker 仍然需要一种方法来检查它的父级是否还活着(getppid()例如与 1 进行比较),并且跟踪器没有拦截您的getppid()调用并修补它们以返回旧的父级 ID。