openssl s_server源码剥离

初级代码游戏的专栏介绍与文章目录-CSDN博客

我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。

这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。

源码指引:github源码指引_初级代码游戏的博客-CSDN博客


        网上找SSL/TLS服务端代码,怎么试都不成功(我好像记得很多年以前成功过的)。怀疑证书文件有问题,用openssl自带的“openssl s_server”命令来测试,正常的,所以彻底没招了,于是就想把s_server的代码弄出来,折腾了两天,不难。

目录

关于版本

openssl命令

剥离代码

代码解读


关于版本

        我代码用的openssl版本是1.1.1k,与我用的Ubuntu18.04自带的不一致,手贱升了一下级,把系统搞垮了,登录不进去,SSH服务启动失败。最后重装了虚拟机。

        不同版本的openssl头文件不太一样,所以会编译不过去,单独提供一套头文件就可以了(1.1.x都行)。只要主版本号和次版本号一致,so提供的接口就是相同的,x只代表BUG修复。

        openssl已经到3点几了为什么我还在用1.1呢?因为旧代码都是1.1的,没有特别需要是不会升级的。

openssl命令

        openssl除了两个库还有一个程序openssl(以前没怎么关心过openssl程序,就生成一下证书),包含很多功能,输入“openssl help”可以显示这些命令:

$ openssl help
Standard commands
asn1parse         ca                ciphers           cms
crl               crl2pkcs7         dgst              dhparam
dsa               dsaparam          ec                ecparam
enc               engine            errstr            gendsa
genpkey           genrsa            help              list
nseq              ocsp              passwd            pkcs12
pkcs7             pkcs8             pkey              pkeyparam
pkeyutl           prime             rand              rehash
req               rsa               rsautl            s_client
s_server          s_time            sess_id           smime
speed             spkac             srp               storeutl
ts                verify            version           x509Message Digest commands (see the `dgst' command for more details)
blake2b512        blake2s256        gost              md4
md5               rmd160            sha1              sha224
sha256            sha3-224          sha3-256          sha3-384
sha3-512          sha384            sha512            sha512-224
sha512-256        shake128          shake256          sm3Cipher commands (see the `enc' command for more details)
aes-128-cbc       aes-128-ecb       aes-192-cbc       aes-192-ecb
aes-256-cbc       aes-256-ecb       aria-128-cbc      aria-128-cfb
aria-128-cfb1     aria-128-cfb8     aria-128-ctr      aria-128-ecb
aria-128-ofb      aria-192-cbc      aria-192-cfb      aria-192-cfb1
aria-192-cfb8     aria-192-ctr      aria-192-ecb      aria-192-ofb
aria-256-cbc      aria-256-cfb      aria-256-cfb1     aria-256-cfb8
aria-256-ctr      aria-256-ecb      aria-256-ofb      base64
bf                bf-cbc            bf-cfb            bf-ecb
bf-ofb            camellia-128-cbc  camellia-128-ecb  camellia-192-cbc
camellia-192-ecb  camellia-256-cbc  camellia-256-ecb  cast
cast-cbc          cast5-cbc         cast5-cfb         cast5-ecb
cast5-ofb         des               des-cbc           des-cfb
des-ecb           des-ede           des-ede-cbc       des-ede-cfb
des-ede-ofb       des-ede3          des-ede3-cbc      des-ede3-cfb
des-ede3-ofb      des-ofb           des3              desx
rc2               rc2-40-cbc        rc2-64-cbc        rc2-cbc
rc2-cfb           rc2-ecb           rc2-ofb           rc4
rc4-40            seed              seed-cbc          seed-cfb
seed-ecb          seed-ofb          sm4-cbc           sm4-cfb
sm4-ctr           sm4-ecb           sm4-ofb

       命令s_server和s_client功能的源码位于apps目录下:

        s_server.c和s_client.c就是命令s_server和s_client的源码入口。每个里面有个对应的入口点,例如s_server.c的入口点:

int s_server_main(int argc, char *argv[])

        openssl程序会调用这些入口点。我只要从这个入口点开始剥离代码就可以了。

剥离代码

        apps目录下的文件除了依赖标准的openssl头文件之外还依赖include\internal目录下的头文件,为了方便可以把internal目录复制到apps下面。

        编译整个apps目录很容易,只要编译所有的c文件即可,编译参数为“-std=gnu90”,用C89/C90不行,会报错。

        为了单独编译s_server,首先我们要把入口点改成main,这样才能编译出可执行程序,才能验证是否包含了所有必须的代码。只需要把s_server_main改成main即可。

        然后就是从编译s_server.c开始寻找所需的最少的文件。因为头文件都在,所以编译不会出问题,而链接的时候会发生找不到符号入口点,逐个搜索,找到符号的c文件,添加进来。最后会发现有几个全局变量在s_client.c里面,因为我们不需要客户端,所以把那几个定义挪过来就可以了:

BIO* bio_in = NULL;
BIO* bio_out = NULL;
BIO* bio_err = NULL;
char* default_config_file = NULL;
const unsigned char tls13_aes128gcmsha256_id[] = { 0x13, 0x01 };

        上面的代码放在s_server.c里面。

        最后总结下来,所需的文件是这些:

        (如果发现有文件不存在,那就openssl编译的时候生成的,搜索一下,复制过来即可)。

        现在代码就可以编译了,用法和去掉openssl的命令完全相同。

        但是一运行就挂?不奇怪,openssl的main函数执行了一些初始化,复制过来放在新的main函数入口处即可:

int main(int argc, char *argv[])
{/* Set up some of the environment. */default_config_file = "";bio_in = dup_bio_in(FORMAT_TEXT);bio_out = dup_bio_out(FORMAT_TEXT);bio_err = dup_bio_err(FORMAT_TEXT);

        然后就可以运行了:

s_server.exe -CAfile ca.cer -cert server.cer -key server.key -WWW -accept 443

        (不要奇怪后缀名是.exe,谁规定linux可执行程序不可以有后缀名?)

        你可以用浏览器访问,可以获取当前目录下的文件。请求“/”会返回内部状态。

        当然因为浏览器可能认为服务器证书有问题,提示不安全,不过这不影响我们所需的功能。

代码解读

        main函数首先解析了参数,然后启动一个服务(do_server),参数包含服务处理函数指针,s_server.c文件里面实现了三个处理函数:rev_body,sv_body,www_body,根据参数不同调用不同的处理函数,我关心的是www_body。

        www_body不复杂,但是写得有BUG,按照说明参数-HTTP对应www=3,处理方式为带头标,不过实际上连请求头都没有输出(所以浏览器报告错误的应答)。

        我们只需要修改www_body里面的处理循环,使用输入输出对象即可实现所需要的功能。上面图示的“test”就是下面的代码输出的:

        剩下的就是自己的事了。


(这里是文档结束) 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/2636.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法库里的heap算法,仿函数和模版进阶(续)

文章目录 算法库里面的heap仿函数模版非类型模版参数array特化函数模版的特化类模版的特化 分离编译 算法库里面的heap sort_heap是算法库里的函数,前提要求是堆才能排序is_heap判断是否是堆make_heap建堆算法 int main() {int a[5] { 10,19,27,39,19 };std::vec…

具身导航如何利用取之不尽的网络视频资源!RoomTour3D:基于几何感知的视频-指令训练调优

作者:Mingfei Han, Liang Ma, Kamila Zhumakhanova, Ekaterina Radionova, Jingyi Zhang, Xiaojun Chang, Xiaodan Liang, Ivan Laptev 单位:穆罕默德本扎耶德人工智能大学计算机视觉系,中山大学深圳校区,悉尼科技大学ReLER实验室…

解决报错:未定义标识符 “M_PI“

问题&#xff1a; 使用C编译&#xff0c;已经用#include <cmath>包含了头文件&#xff0c;但是在使用M_PI时依旧报错说未定义 原因&#xff1a; 在某些编译器中&#xff0c;<cmath> 库中的 M_PI 是一个条件宏&#xff0c;需要 _USE_MATH_DEFINES 宏被定义才能使用。…

TensorFlow深度学习实战(5)——神经网络性能优化技术详解

TensorFlow深度学习实战&#xff08;5&#xff09;——神经网络性能优化技术详解 0. 前言1. 识别 MNIST 手写数字1.1 MNIST 数据集1.2 独热编码1.3 定义神经网络1.4 训练神经网络 2. 构建深度神经网络3. 添加 Dropout 提高模型泛化能力4. 不同优化器对模型性能的影响5. 训练 ep…

代码随想录算法训练营day31

代码随想录算法训练营 —day31 文章目录 代码随想录算法训练营前言一、 56. 合并区间二、738. 单调递增的数字三、968.监控二叉树总结 前言 今天是算法营的第31天&#xff0c;希望自己能够坚持下来&#xff01; 今日任务&#xff1a; ● 56. 合并区间 ● 738.单调递增的数字 …

通过maven命令上传jar包至nexus v3.7.1

1 nexus和maven的简介 1.1 nexus ‌Nexus‌是由Sonatype公司开发的一款强大的制品仓库管理软件&#xff0c;主要用于搭建和管理各种类型的仓库&#xff0c;包括Maven、NuGet、npm等。Nexus支持多种仓库类型&#xff0c;如代理仓库&#xff08;代理互联网中的中央仓库&#xf…

level(三) filterblock

filterblock用于确定某个key是否存在于某个datablock中&#xff0c;在插入一个key到datablock中时也会插入一个key到filterblock中&#xff0c;filterblock中会记录所有的key&#xff0c;并通过布隆过滤器来确定一个key是否存于这个datablock中。下面来看下filterblock的代码&a…

优化 Vue项目中 app.js 文件过大,初始化加载过慢、带宽占用过大等问题

已亲测&#xff0c;绝对有效&#xff0c;底部有改善前后对比图证明。 1.服务器 nginx 增加配置 #开启gzip压缩 gzip on; #设置gzip压缩级别&#xff0c;2级是性价比最高的 gzip_comp_level 2; #设置动态gzip压缩的文件类型 gzip_types text/plain text/css text/javascript a…

浅谈云计算16 | 存储虚拟化技术

存储虚拟化技术 一、块级存储虚拟化基础2.1 LUN 解析2.1.1 LUN 概念阐释2.1.2 LUN 功能特性 2.2 Thick LUN与Thin LUN2.2.1 Thick LUN特性剖析2.2.2 Thin LUN特性剖析 三、块级存储虚拟化技术实现3.1 基于主机的实现方式3.1.1 原理阐述3.1.2 优缺点评估 3.2 基于存储设备的实现…

手摸手实战前端项目CI CD

由于图片和格式解析问题&#xff0c;为了更好阅读体验可前往 阅读原文 CI/CD 是 持续集成&#xff08;Continuous Integration&#xff09; 和 持续交付/部署&#xff08;Continuous Delivery/Continuous Deployment&#xff09; 的缩写&#xff0c;是现代软件开发中的一种自动…

【EI 会议征稿通知】第七届机器人与智能制造技术国际会议 (ISRIMT 2025)

第七届机器人与智能制造技术国际会议 (ISRIMT 2025) 2025 7th International Symposium on Robotics & Intelligent Manufacturing Technology 会议主要围绕“机器人”、“智能制造技术” 等研究领域展开讨论&#xff0c;旨在为机器人与智能制造技术等领域的专家学者、工…

【Linux】信号

目录 一、信号的概念二、信号的产生2.1 通过键盘进行信号的产生2.2 通过系统调用进行信号的产生2.2.1 kill函数2.2.2 raise函数2.2.3 abort函数 2.3 通过异常的方式进行信号的产生2.4 通过软件条件的方式进行信号的产生2.4.1 关闭管道读端2.4.2 alarm函数 2.5 Core Dump&#x…

基于go语言的驾考系统设计与实现

在Internet时代&#xff0c;Internet信息技术已广泛应用于各个领域。 对人们的生活以及学习产生了较大的影响。通过信息技术建立的驾照考试管理系统&#xff0c;利用系统对驾照考试进行统一的管理&#xff0c;能够提驾照考试管理的工作效率&#xff0c;具有重要的现实意义。 本…

鸿蒙打包发布

HarmonyOS应用/元服务发布&#xff08;打包发布&#xff09; https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/ide-publish-app-V13?catalogVersionV13 密钥&#xff1a;包含非对称加密中使用的公钥和私钥&#xff0c;存储在密钥库文件中&#xff0c;格式…

基于Linux系统指令使用详细解析

一 Linux系统常用操作命令编辑快捷 1.1终端快捷键&#xff1a; Ctrl a/Home 切换到命令行开始 Ctrl e/End 切换到命令行末尾 Ctrl l 清除屏幕内容&#xff0c;效果等同于 clear Ctrl u 清除剪切光标之前的内容 Ctrl k 剪切清除光标之后的内容 Ctrl y 粘贴刚才所删…

深度学习-87-大模型训练之预训练和微调所用的数据样式

文章目录 1 大模型训练的阶段1.1 预训练1.1.1 全量预训练1.1.2 二次预训练1.2 微调2 预训练需要的数据2.1 清洗成的文本文档2.2 如何从文本文档学习2.3 常见预训练中文语料库3 微调需要的数据3.1 微调例子一:电商客服场景3.2 微调例子二:行政咨询场景3.3 微调数据长什么样3.3…

基于 STM32 的多功能时间管理器项目

引言 在快节奏的生活中&#xff0c;时间管理显得尤为重要。本项目旨在通过 STM32 开发一个多功能时间管理器&#xff0c;功能包括计时器、闹钟和日历。用户可以方便地设置不同的提醒和计时任务&#xff0c;以更好地管理日常生活和工作。 项目名称 多功能时间管理器 环境准备 …

麦田物语学习笔记:代码链接UI实现时间日期对应转换

基本流程 时间系统UI如下 本篇文章将UI和TimeManager里的数据联系在一起, 1.代码思路 (1)新建TimeUI.cs挂载在GameTime物体上,然后获取它的子物体这些组件来改变里面的数值,所以需要获得Day & Night的子物体Image中的Rect Transform,用于旋转季节的图标;获得Clock每个子物…

HTML文章翻页功能

效果展示&#xff1a; 效果原理&#xff1a; 1、引入CDN 2、绘制文章翻页样式&#xff0c;以及自动分段 3、获取窗口宽高&#xff0c;计算出当前文章总分段&#xff0c;并实现分页 4、完整代码 <!DOCTYPE html> <html><head><meta charset"utf-8&qu…

深度学习电影推荐-CNN算法

文章目录 前言视频演示效果1.数据集环境配置安装教程与资源说明1.1 ML-1M 数据集概述1.1.1数据集内容1.1.2. 数据集规模1.1.3. 数据特点1.1.4. 文件格式1.1.5. 应用场景 2.模型架构3.推荐实现3.1 用户数据3.2 电影数据3.3 评分数据3.4 数据预处理3.5实现数据预处理3.6 加载数据…