libc 函数位置在分叉进程之间发生变化?
libc function locations change between forked processes?
在我得到的 CTF 风格练习中,有一个服务器使用 fork() 和一个 exec 函数 运行 每个客户端连接的二进制文件。
我能够在二进制文件中找到一个漏洞,该漏洞允许我调用任意地址并泄露信息。我想我会用它从进程的导入 table 中泄漏一个 libc 函数的(比如 printf)地址,然后用它来找到系统的地址和 运行。我的假设——我在网上阅读的所有内容都强化了这一假设——ASLR 只随机化了 libc 在父进程中的位置,所有子进程都应该有相同的位置。所以我应该能够在一个连接中泄露地址并在另一个连接中使用它。
但是我似乎每次都得到不同的 printf 地址。 运行 本地我也可以用GDB,每次确认地址都变了。那么这是怎么回事?
让你失望的不是叉子,而是 exec。当一个进程执行 exec 时,它会得到一个全新的地址 space,丢失它加载的所有动态库,包括 libc。动态链接器加载新程序需要的库,给它们新的地址。每位执行官都有机会再次随机化库地址。
在我得到的 CTF 风格练习中,有一个服务器使用 fork() 和一个 exec 函数 运行 每个客户端连接的二进制文件。 我能够在二进制文件中找到一个漏洞,该漏洞允许我调用任意地址并泄露信息。我想我会用它从进程的导入 table 中泄漏一个 libc 函数的(比如 printf)地址,然后用它来找到系统的地址和 运行。我的假设——我在网上阅读的所有内容都强化了这一假设——ASLR 只随机化了 libc 在父进程中的位置,所有子进程都应该有相同的位置。所以我应该能够在一个连接中泄露地址并在另一个连接中使用它。 但是我似乎每次都得到不同的 printf 地址。 运行 本地我也可以用GDB,每次确认地址都变了。那么这是怎么回事?
让你失望的不是叉子,而是 exec。当一个进程执行 exec 时,它会得到一个全新的地址 space,丢失它加载的所有动态库,包括 libc。动态链接器加载新程序需要的库,给它们新的地址。每位执行官都有机会再次随机化库地址。