【问题标题】:How can we tell an instruction is from application code or library code on Linux x86_64我们如何判断指令来自 Linux x86_64 上的应用程序代码或库代码
【发布时间】:2020-02-27 00:52:10
【问题描述】:

我想知道一条指令是来自应用程序本身还是来自库代码。 我观察到一些应用程序代码/数据位于大约0x000055xxxx,而库和mmaped 区域默认位于0x00007fcxxxx。例如,我可以使用0x00007f00...00 作为边界来判断指令是来自应用程序本身还是来自库?

如何在 Linux 内核中配置这个边界?


已更新。

我能否阻止(或检测)从应用程序代码发出的syscall 指令(只允许它通过libc)。也许我们可以做一个二进制扫描,但是由于指令的长度可变,很难防止无意的syscall指令。

【问题讨论】:

  • 你为什么要问?你的问题缺乏动力!

标签: linux linux-kernel shared-libraries virtual-address-space


【解决方案1】:

换一种方式。你需要学习很多东西。

首先,阅读更多有关操作系统的信息。所以请阅读Operating Systems: Three Easy Pieces textbook

然后,详细了解ASLR

另请阅读 Drepper 的 How to write shared libraries 和 Levine 的 Linkers and loaders 书。

您想使用pmap(1)proc(5)

您可能想从程序内部解析/proc/self/maps 伪文件。或使用dladdr(3)

要获得一些见解,请在 Linux 终端中运行 cat /proc/$$/mapscat /proc/self/maps

【讨论】:

    【解决方案2】:

    我想知道一条指令是来自用户空间还是来自库代码。

    您很困惑: 库代码和主要可执行代码都是 用户空间。

    在 Linux x86_64 上,您可以区分内核地址和用户空间地址,因为在当前(48 位)实现中内核地址在 FFFF8000'00000000FFFFFFFF'FFFFFFFF 范围内。见规范形式地址说明here

    我观察到一些应用程序代码/数据位于大约 0x000055xxxx,而库和映射区域默认位于 0x00007fcxxxx。我可以使用例如 0x00007f00...00 作为边界来判断指令是来自应用程序本身还是来自库?

    不,一般来说你不能。可以链接应用程序以在规范地址空间内加载任何地方(尽管大多数应用程序不是)。

    正如 Basile Starynkevitch 已经回答的那样,您需要解析 /proc/$pid/maps,或者知道可执行文件链接到的加载地址(对于非 PIE 二进制文件)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-03
      • 1970-01-01
      • 2017-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多