如何在openssl AES中获取表(Te0,Te1,…)的内存地址?

如何在openssl AES中获取表(Te0,Te1,…)的内存地址?,openssl,gdb,aes,symbols,aslr,Openssl,Gdb,Aes,Symbols,Aslr,目的是在AES的openssl实现中获取预计算表的地址。这些表包含在aes_core.c文件中,并命名为Te0、Te1等。我正在尝试使用gdb中的info address SYMBOL\u NAME命令来完成此操作 以下是我迄今为止遵循的步骤: 禁用ASLR(sudo sysctl内核。随机化\u va\u space=0) 使用configure-d shared编译openssl(版本101e)以保持调试符号 将一个程序链接到上面提到的openssl版本(我在gdb中使用info shar

目的是在AES的openssl实现中获取预计算表的地址。这些表包含在aes_core.c文件中,并命名为Te0、Te1等。我正在尝试使用
gdb
中的
info address SYMBOL\u NAME
命令来完成此操作

以下是我迄今为止遵循的步骤:

  • 禁用ASLR(
    sudo sysctl内核。随机化\u va\u space=0
  • 使用
    configure-d shared
    编译openssl(版本101e)以保持调试符号
  • 将一个程序链接到上面提到的openssl版本(我在gdb中使用
    info sharedlibrary
    确保了这一点)
  • 在gdb中运行程序并使用
    信息地址Te0
    (或任何其他表格)
结果
当前上下文中没有符号“Te0”。

例如,函数
private\u AES\u set\u encrypt\u key
(也在AES\u core.c中)不会发生同样的情况。实际上,在这种情况下,结果是:
符号“private_AES_set_encrypt_key”在未经调试编译的文件中位于0x7ffff7a483f0。
这正是我需要的

我的想法:这些表被声明为
静态常量
,因此我猜它们可能会以某种方式进行优化,但我还是有意编译openssl,并支持调试。那么为什么我不能在gdb中看到这些符号呢


提前感谢您的帮助

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


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

听起来这些符号似乎正在被优化。尝试使用
CFLAGS=-g3-ggdb-O0
构建库
-g3
表示可用的最大调试信息,包括
#define的
。使用GCC 5.0,您可以使用
-Og
。然而,我发现符号仍然使用
-Og
进行优化,因此我使用
-g3-O0