linux - libc 函数位置在 fork 进程之间发生变化?

标签 linux fork exploit aslr

在我得到的 CTF 风格练习中,有一个服务器使用 fork() 和一个 exec 函数为每个客户端连接运行二进制文件。 我能够在二进制文件中找到一个漏洞,该漏洞允许我调用任意地址并泄露信息。我想我会用它来从进程的导入表中泄露一个 libc 函数(比如 printf)的地址,然后用它来找到系统的地址并运行它。我的假设——我在网上阅读的所有内容都强化了这一假设——ASLR 只随机化了 libc 在父进程中的位置,所有子进程都应该有相同的位置。所以我应该能够在一个连接中泄露地址并在另一个连接中使用它。 但是我似乎每次都得到不同的 printf 地址。在本地运行我也可以使用 GDB 并确认地址每次都更改。那么这是怎么回事?

最佳答案

让你失望的不是 fork ,而是 exec。当进程执行 exec 时,它会获得一个全新的地址空间,从而丢失它已加载的所有动态库,包括 libc。动态链接器加载新程序需要的库,给它们新的地址。每位执行官都有机会再次随机化库地址。

关于linux - libc 函数位置在 fork 进程之间发生变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57509062/

相关文章:

python - 使用 Python 在 Raspberry Pi USB 端口上使用 uart

c - 加载 shell 脚本的函数而不执行它

c - 如何在你自己的 Linux shell 中实现管道?

shell - 使用 Golang 安全执行命令(避免远程执行)

c - 如何在我的程序中获取 _GLOBAL_OFFSET_TABLE_ 地址?

linux - 我可以配置 postgres 来监听 VIP 吗?

php - 在 Windows 上的 PHP 中 fork

c - 为什么我会得到大的收获整数?

assembly - 面向返回的编程: Why literal number used in ROP chain?

ruby - 如何在不使用空格字符的情况下运行 unix 命令,以便执行远程命令?