- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
摘要
当我的代码调用 BIO_do_connect 时,它会跳回到调用它的函数的开头,然后出现段错误。
尝试了什么
调试器,Valgrind,更改代码
// compiled with:
// gcc -g -O0 -Wall -Wextra -o sslex sslex_main.c -fstack-protector -lssl -lcrypto
#include <stdio.h>
#include <string.h>
#include <openssl/ssl.h>
#include <openssl/bio.h>
#include <openssl/err.h>
// BIO handles communication including files and sockets.
static BIO* g_bio = NULL;
// holds SSL connection information
static SSL_CTX* g_sslContext = NULL;
char* g_trustedStore = "certs/trusted.pem";
void initialize() {
SSL_load_error_strings();
ERR_load_BIO_strings();
OpenSSL_add_all_algorithms();
}
int connect(char* hostnamePort) {
SSL* sslp = NULL;
BIO* out = NULL;
printf("Connect called\n");
printf("Connecting... to %s\n", hostnamePort);
g_sslContext = SSL_CTX_new(TLS_client_method());
// load trusted certificate store
if (! SSL_CTX_load_verify_locations(g_sslContext, g_trustedStore, NULL)) {
fprintf(stderr, "Failure loading certificats from trusted store %s!\n", g_trustedStore);
fprintf(stderr, "Error: %s\n", ERR_reason_error_string(ERR_get_error()));
return -1;
}
g_bio = BIO_new_ssl_connect(g_sslContext);
if (g_bio == NULL) {
fprintf(stderr, "Error cannot get BSD Input/Output\n");
return -1;
}
// retrieve ssl pointer of the BIO
BIO_get_ssl(g_bio, &sslp);
if (sslp == NULL) {
fprintf(stderr, "Could not locate SSL pointer\n");
fprintf(stderr, "Error: %s\n", ERR_reason_error_string(ERR_get_error()));
return -1;
}
// if server wants a new handshake, handle that in the background
SSL_set_mode(sslp, SSL_MODE_AUTO_RETRY);
// attempt to connect
BIO_set_conn_hostname(g_bio, hostnamePort);
out = BIO_new_fp(stdout, BIO_NOCLOSE);
printf("Connecting to: %s\n", BIO_get_conn_hostname(g_bio));
// THIS LINE CAUSES STACK SMASH
if (BIO_do_connect(g_bio) <= 0) { // BUGGY LINE
fprintf(stderr, "Error cannot connect to %s\n", hostnamePort);
fprintf(stderr, "Error: %s\n", ERR_reason_error_string(ERR_get_error()));
BIO_free_all(g_bio);
SSL_CTX_free(g_sslContext);
return -1;
}
return -1;
}
void close_connection() {
BIO_free_all(g_bio);
SSL_CTX_free(g_sslContext);
}
int main(int argc, char* argv[]) {
char* hostnamePort = argv[1];
initialize();
if (connect(hostnamePort) != 0)
return 0;
printf("Done connecting. doing operation\n");
close_connection();
return 0;
}
预期结果:
实际输出:
./sslex 192.168.11.141
Connect called
Connecting... to 192.168.11.141
Connecting to: 192.168.11.141
Connect called
Segmentation fault (core dumped)
调试器输出和回溯:
Starting program: sslex 192.168.11.141
warning: Probes-based dynamic linker interface failed.
Reverting to original interface.
Connect called
Connecting... to 192.168.11.141
Connecting to: 192.168.11.141
Breakpoint 3, connect (hostnamePort=0x7fffffffe9db "192.168.11.141") at sslex_main.c:57
57 if (BIO_do_connect(g_bio) <= 0) { // BUGGY LINE
(gdb) bt
#0 connect (hostnamePort=0x7fffffffe9db "192.168.11.141") at sslex_main.c:57
#1 0x000055555555503a in main (argc=2, argv=0x7fffffffe698) at sslex_main.c:75
(gdb) s
Connect called
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff733d646 in ?? ()
(gdb) bt
#0 0x00007ffff733d646 in ?? ()
#1 0x00007ffff72e94d3 in ?? ()
#2 0x0000000000000000 in ?? ()
最佳答案
您的函数 connect()
隐藏了 OpenSSL 调用以建立实际 TCP 连接的同名标准网络库函数,但它不是获取库函数,而是调用您的函数。
重命名您的函数(例如,命名为 do_connect()
),这样它就不会与库中的函数发生冲突。
关于c - BIO_do_connect 导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58683986/
摘要 当我的代码调用 BIO_do_connect 时,它会跳回到调用它的函数的开头,然后出现段错误。 尝试了什么 调试器,Valgrind,更改代码 // compiled with: // gcc
我需要在以下方面提供帮助;我曾尝试寻找答案,但只剩下问了。 Inspector XE 给出了以下结果:线路上的内核资源泄漏 he=BIO_gethostbyname(str); 这一行是 OpenSS
我正在使用 Openssl-0.9.8x,如下所示: bio = BIO_new_ssl_connect(ctx); BIO_get_ssl(bio, & ssl); SSL_set_mode(ssl
我正在使用 Ubuntu 18.04/gcc 7.3/OpenSSL 1.1.0g 使 C++ 应用程序通过非阻塞 BIO API 执行 TLS/SSL 连接。 当 BIO_do_connect()
我正在尝试使用 OpenSSL 及其 BIO 创建基本服务器和客户端,但 BIO_do_connect 返回 -1。之后 ERR_get_error 返回 0。我试图通过编写//check [cond
我编写了一个类来处理用于与 Paypal 通信的 SSL 连接。 它工作了大约一年,现在马上就失败了。从我得到的错误来看,这似乎是因为他们(最终)关闭了 SSLv3 密码。然而,我认为它已经在我这边关
我正在用 C 语言编写一个小型 IRC 机器人,使用 openssl 来启动安全套接字。它不是写得最漂亮的机器人,但它主要只是为了了解 openssl API 的工作原理。目前我有以下代码: #inc
这是我尝试连接到 google.com:443 的简单 openssl 客户端测试用例。 根据手册,BIO_do_connect 应返回 1、0 或 -1。Google 没有找到我返回 0 的任何人,
我用 C++ 编写了一些软件,我正在尝试获取 GDAX /products暂时列出(此时主要作为测试。) 更新:我想补充一点,连接实际上是到 cloudflare,而不是直接到 GDAX。因此,这可能
我用 C++ 写了一些软件,我现在正在尝试获取 GDAX /products 列表(目前主要作为测试。) 更新:我想补充一点,连接实际上是连接到 cloudflare,而不是直接连接到 GDAX。所以
我是一名优秀的程序员,十分优秀!