2014-10-30 52 views
3

目標是在AES的openssl實現中獲取預計算表的地址。這些表包含在aes_core.c文件中,並命名爲Te0,Te1等。我試圖使用info address SYMBOL_NAME命令在gdb中執行此操作。如何在openssl AES中獲取表(Te0,Te1,...)的內存地址?

因此,這些都是我跟着至今步驟:

  • 禁用ASLR(sudo sysctl kernel.randomize_va_space=0
  • 編譯OpenSSL的(版本101E)與configure -d shared保留調試符號
  • 鏈接程序的上面提到的openssl版本(我確信在gdb中使用info sharedlibrary
  • 在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中看到這些符號?

非常感謝您的幫助!

+0

這聽起來像符號正在優化。嘗試用'CFLAGS = -g3 -ggdb -O0'構建庫。 '-g3'表示最大的調試信息可用,包括'#definition's'。使用GCC 5.0,你可以使用'-Og'。但是,我發現符號仍然使用'-Og'優化,所以我使用'-g3 -O0'。 – jww 2016-04-16 20:37:02

回答

1

事實證明,許多現代處理器(例如Intel Core i3 +)在硬件中實現了AES,使得編譯中不包含aes_core.c(以及任何其他與AES相關的C文件)。爲了解決這個問題,openssl必須編譯爲./configure標誌no-hw。國旗no-asm可能是有用的(雖然我認爲這些表仍然會加載到內存中)。

這樣我終於可以看到使用gdb的地址。 :)