3

目的是获取 AES 的 openssl 实现中预计算表的地址。这些表包含在aes_core.cinfo address SYMBOL_NAME文件中,并命名为Te0 、Te1 等。我正在尝试使用gdb.

所以这些是我到目前为止所遵循的步骤:

  • 禁用 ASLR ( sudo sysctl kernel.randomize_va_space=0)
  • 编译 openssl (version 101e)configure -d shared以保持调试符号
  • 将程序链接到上面提到的 openssl 版本(我确保info sharedlibrary在 gdb 中使用)
  • 在 gdb 中运行程序并使用info address Te0(或任何其他表)

结果No symbol "Te0" in current context.

private_AES_set_encrypt_key例如,函数(也在aes_core.c中)不会发生同样的情况。事实上,在这种情况下,结果是:Symbol "private_AES_set_encrypt_key" is at 0x7ffff7a483f0 in a file compiled without debugging.这正是我所需要的。

我的想法:这些表是这样声明的,static const所以我猜它们可能会以某种方式进行优化,但是我再次有意编译 openssl 以支持调试。那么为什么我在 gdb 中看不到这些符号呢?

预先感谢您的帮助!

4

1 回答 1

1

事实证明,许多现代处理器(例如 Intel Core i3+)在硬件中实现了 AES,这使得aes_core.c(以及任何其他与 AES 相关的 C 文件)无法编译。要解决这个问题,openssl 必须使用./configure标志no-hw进行编译。标志no-asm也可能有用(尽管我认为这些表仍会加载到内存中)。

这样我终于可以使用 gdb 看到地址了。:)

于 2014-11-16T21:35:27.020 回答