gcc heartbleed.c-o heartbleed-lssl-lssl3-lcrypto
это выглядит нормально. -lssl
- это процедуры SSL/TLS OpenSSL. -lcrypto
- это криптографические процедуры OpenSSL.
но я не уверен, о -lssl3
. Что это за библиотека такая?
heartbleed.с.(:text+0x47d): неопределенная ссылка на `SSL_CTX_SRP_CTX_init'
похоже, ваша версия OpenSSL не поддерживает Thomas Wu безопасный удаленный пароль (SRP). Или он был скомпилирован без поддержка.
по словам OpenSSL список изменений, SRP был добавлен в OpenSSL 1.0.1:
*) Add SRP support.
[Tom Wu <tjw@cs.stanford.edu> and Ben Laurie]
вы можете проверить библиотеку OpenSSL был построен без ПСП со следующим.
сначала найдите библиотеку OpenSSL SSL/TLS:
$ find /usr/ -iname libssl.*
/usr/lib/libssl.0.9.7.dylib
/usr/lib/libssl.0.9.8.dylib
/usr/lib/libssl.dylib
/usr/local/ssl/android-14/lib/libssl.a
/usr/local/ssl/android-14/lib/libssl.so
/usr/local/ssl/android-14/lib/libssl.so.1.0.0
/usr/local/ssl/android-18/lib/libssl.a
/usr/local/ssl/android-18/lib/libssl.so
/usr/local/ssl/android-18/lib/libssl.so.1.0.0
...
во-вторых, посмотреть, если символ экспортируется:
$ nm /usr/lib/libssl.0.9.7.dylib | grep SSL_CTX_SRP_CTX_init
$
In мой случай, SRP недоступен, потому что библиотека Apple по умолчанию так вниз (версия 0.9.7).
у меня есть еще одна копия библиотеки (версия 1.0.1 i):
$ nm /usr/local/ssl/macosx-x64/lib/libssl.dylib | grep SSL_CTX_SRP_CTX_init
0000000000034920 T _SSL_CTX_SRP_CTX_init
моя версия 1.0.1 i имеет подпрограмму.
иногда, вы можете построить без SRP. Чтобы проверить, настроен ли OpenSSL без SRP:
$ cat /usr/local/ssl/macosx-x64/include/openssl/opensslconf.h | grep -A 1 SRP
$
в случае выше, я настроил для SRP.
вот как это выглядит, когда OpenSSL настроен без функцию (настройки без SSLv2):
$ cat /usr//local/ssl/macosx-x64/include/openssl/opensslconf.h | grep -A 1 SSL2
#ifndef OPENSSL_NO_SSL2
# define OPENSSL_NO_SSL2
#endif
--
# if defined(OPENSSL_NO_SSL2) && !defined(NO_SSL2)
# define NO_SSL2
# endif
SSL_CTX_SRP_CTX_init
используется в двух местах. Чтобы исправить это, просто прокомментируйте его.
первая строка 355:
/* SSL_CTX_SRP_CTX_init(c->sslContext); */
во-вторых, строка 499:
/* SSL_CTX_SRP_CTX_init(c->sslContext); */
Related, авторы эксплойта, вероятно, могли бы охранять номер версии OpenSSL. Тот библиотека предоставляет OPENSSL_VERSION_NUMBER (3) как раз для такого рода вещей. Что-то вроде:
#if (OPENSSL_VERSION_NUMBER >= 0x10001000L) && !defined(OPENSSL_NO_SRP)
SSL_CTX_SRP_CTX_init(c->sslContext);
#endif