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