CatBro's Blog
https://catbro666.github.io/icon.png
Volar con el viento
2022-05-10T09:41:37.444Z
https://catbro666.github.io/
猫猫哥
Hexo
记录一个IPsec VPN检测时ESP包解密失败问题的定位过程
https://catbro666.github.io/posts/4921760e/
2022-05-09T14:35:51.000Z
2022-05-10T09:41:37.444Z
<div class="note primary">
<p>本文记录一次IPsec VPN检测时ESP解密失败问题的定位过程。涉及到IPsec VPN协议、加密算法、内核xfrm框架等知识。</p>
</div>
systemtap与bpftrace使用评估及对比
https://catbro666.github.io/posts/46dd3f4b/
2022-05-09T12:57:29.000Z
2022-05-10T09:41:31.490Z
<div class="note primary">
<p>eBPF和systemtap这两个非常强大的工具,它们弥补了静态调试工具的不足,可以完成很多静态调试工具无法完成的事情。例如很多跟时序相关的问题、概率性偶发的问题、压力测试下才能出现的问题、以及像云上这种不方便调试的环境,可能只能通过<strong>动态调试</strong>的手段来定位分析问题。</p><p>它们将进程本身当作是一个数据库,从中获取所关心的信息进行活体分析。当然前提是你得对这个数据库本身有足够的了解,知道去哪里获取信息,以及获取什么信息。对于内核态就是对内核本身的理解,在用户态则是对用户程序的理解。</p><p>本文只是浅浅地试用评估了一下两者,并做了简单对比。要想熟练使用,功夫在诗外!</p>
</div>
OpenSSL的async异步框架/OpenSSL协程
https://catbro666.github.io/posts/6d5be1a5/
2022-04-26T14:37:45.000Z
2022-04-27T12:27:30.408Z
<div class="note primary">
<p>OpenSSL异步框架是在OpenSSL-1.1.0上引入的一个新特性。它理论上可以应用于任何的异步操作,但当前主要是用于在引擎框架中执行的加密学操作。本文首先介绍其底层原理,接着介绍OpenSSL的异步基础设施,最后着重分析ASYNC_JOB(OpenSSL中的协程)的处理流程(dispatcher和job之间是如何切换的)。</p>
</div>
Linux内核中隐藏的兵法—以逸待劳
https://catbro666.github.io/posts/5d011708/
2022-04-15T14:21:30.000Z
2022-04-16T10:16:22.008Z
<div class="note primary">
<p>在本系列之前的两篇文章<a href="../68dbb05c/">无中生有</a>与<a href="../7be938f8/">移花接木</a>中,我们探究了Linux中的进程创建,它可以说是进程管理中最重要的内容之一(另一个是进程调度)。本文我们将介绍的内容则更多地属于是内存管理范畴。(当然这也是相对而言的,作为Linux内核中最核心的部分,进程管理、内存管理、中断管理相互之间都是紧密联系的。)</p><p>也许你已经注意到了,无论是fork还是execve都没有主动去分配内存执行拷贝或读取的动作。fork时只是拷贝了页表并设置为用户只读,而execve时则只是准备了新的LDT局部表以及堆栈中的参数和环境表,而并没有实际读程序到内存中。</p><p>这就是本文将讨论的页异常中断:<strong>写保护异常/写时复制机制</strong>和<strong>缺页异常</strong>。</p>
</div>
Linux内核中隐藏的兵法—移花接木
https://catbro666.github.io/posts/7be938f8/
2022-04-13T13:32:29.000Z
2022-04-13T15:13:28.562Z
<div class="note primary">
<p>之前在<a href="https://catbro666.github.io/posts/68dbb05c/">Linux内核中隐藏的兵法—无中生有</a>一文中,我们探究了Linux中的进程创建,着重介绍了进程0和fork系统调用。本文我们将继续探究,另一个与进程创建相关的重要系统调用:<strong>execve</strong>。看看它又是葫芦里卖的什么药。</p>
</div>
Nginx的SSL性能测试
https://catbro666.github.io/posts/d5d52392/
2022-04-05T13:25:03.000Z
2022-05-09T15:49:49.849Z
<div class="note primary">
<p>虽说标题写的是SSL性能测试,但其实是不是SSL都无关紧要,只是测试的配置有所不同罢了。相比具体某个指标的测试方法,我们更应该关注的是性能测试的一般原则。具体的测试指标可能随着测试业务、测试环境而千差万别,但是核心的测试方法论是不变的。</p><p>因为笔者对SSL的性能测试比较熟悉,所以将以SSL性能测试主要关注的3个指标为例进行分享:每秒新建连接数、最大吞吐量、最大连接数。</p>
</div>
Linux内核中隐藏的兵法—无中生有
https://catbro666.github.io/posts/68dbb05c/
2022-03-26T04:47:23.000Z
2022-04-13T14:58:09.366Z
<div class="note primary">
<p>不管是什么领域,建造往往比销毁困难得多。建造一个大楼可能需要几年的时间,而销毁它也许就是几秒钟的事情。究其根本,因为建造是个熵减的过程,必须有来自系统外的能量输入。而创建中有一类问题显得更为特殊,那就是起源的问题。第一个生命如何诞生?人类又是如何起源的?诸如此类的问题,人类从未停止探究。。。</p><p>而今天我们要探究的主题是Linux中的进程创建。大部分的人可能都知道fork,都知道进程就是像细胞分裂一样分出来的。那么你是否清楚下面这些:为了分裂它需要准备什么?所谓分裂到底分了什么,又遗传了什么?遗传物质是如何传递的?第一个进程又是怎么来的?</p><p>接下来就让我们一起来探索这些问题吧!</p>
</div>
OpenSSL CVE-2022-0778漏洞问题复现与非法证书构造
https://catbro666.github.io/posts/83951100/
2022-03-19T14:53:34.000Z
2022-05-09T15:06:15.087Z
<div class="note primary">
<p>本文介绍CVE-2022 0778漏洞及其复现方法,并精心构造了具有一个非法椭圆曲线参数的证书可以触发该漏洞。</p>
</div>
Linux内核是如何启动的
https://catbro666.github.io/posts/615fc0b5/
2022-03-12T11:01:39.000Z
2022-03-13T13:31:33.474Z
<div class="note primary">
<p>本文介绍Linux内核的引导启动以及初始化流程,从你按下电源开始到你最终进行终端登录,这期间到底发生了什么?</p>
</div>
Nginx的共享内存管理--slab算法
https://catbro666.github.io/posts/2dc32e47/
2022-03-05T08:50:42.000Z
2022-03-10T11:27:29.774Z
<div class="note primary">
<p>初次了解到slab算法,是在学习Linux内核时。内核中采用了伙伴系统(Buddy System)算法对内存页面进行管理。但是对于小对象,还用页面分配器就显得有些浪费了,于是slab就应运而生了,内核的kmalloc()就是使用slab进行管理的。nginx中的共享内存管理使用了相同的思想,当然它没有Linux内核中的slab那么复杂。</p>
</div>
C语言中的函数调用约定
https://catbro666.github.io/posts/657c24ad/
2022-01-23T12:09:28.000Z
2022-03-05T10:36:03.300Z
<div class="note primary">
<p>本文主要介绍C语言中的函数调用约定,通过汇编代码结合实时观察栈的变化情况,直观地了解函数调用的过程。本文只讨论x86/64架构、Linux/GCC环境下的情况,不过其他环境在整体思想上应该是类似的,都需要处理这些问题。</p>
</div>
如何在裸机上直接运行程序—王爽《汇编语言》课程设计2
https://catbro666.github.io/posts/8054db72/
2022-01-17T12:42:17.000Z
2022-03-05T10:43:30.687Z
<div class="note primary">
<p>平常我们的程序基本都是运行在操作系统之上,很少有机会直接在裸机上运行程序。现代操作系统需要支持多任务环境的工作方式,这要求CPU在硬件上提供支持。以Intel处理器为例,从80286/80386开始,CPU开始支持工作在保护模式,为多任务环境提供保护机制。</p><p>操作系统为我们提供了保护和抽象,这方便了开发和使用,但是同时也对学习者了解计算机底层工作原理造成了一定的障碍。本文通过编码实践王爽老师《汇编语言》中的课程设计2,与寄存器、内存、显存、中断、外设等进行了近距离的亲密接触,通过这次实践也算是入门汇编了吧。</p>
</div>
VIM常用快捷键和插件整理
https://catbro666.github.io/posts/d6ca5270/
2021-12-12T10:25:29.000Z
2022-03-05T10:44:58.143Z
<div class="note primary">
<p>本文不会介绍基本的VIM使用方法,如果你对VIM的几种模式、基本的编辑、移动和选取等还不了解,推荐你先看一下这篇<a href="https://coolshell.cn/articles/5426.html">简明 VIM 练级攻略</a>,写得还是不错的,基本上最常用的命令都有了。如果你不是vim重度用户的话,知道这些命令已经足够。只能说vim的水太深,根据自身情况在编辑效率和学习成本之间做个平衡吧。</p>
</div>
深入理解mmap--内核代码分析及驱动demo示例
https://catbro666.github.io/posts/5ec4fb12/
2021-12-11T13:06:53.000Z
2022-03-05T10:36:54.048Z
<div class="note primary">
<p>mmap是一个用户空间很常用的系统调用,无论是分配内存、读写大文件、链接动态库文件,还是多进程间共享内存,都可以看到其身影。本文首先介绍了进程地址空间和mmap,然后分析了内核代码以了解其实现,最后通过一个简单的demo驱动示例,加深对mmap的理解。</p>
</div>
Lua中如何实现类似gdb的断点调试—09支持动态添加和删除断点
https://catbro666.github.io/posts/1fdd30ce/
2021-11-11T16:51:24.000Z
2022-03-05T10:39:18.100Z
<div class="note primary">
<p>前面已经支持了几种不同的方式添加断点,但是必须事先在代码中添加断点,在使用上不是那么灵活方便。本文将支持动态增删断点,只需要开一开始引入调试库即可,后续可以在调试过程中动态的添加和删除断点。事不宜迟,我们直接进入正题。</p>
</div>
从压测碰到的诡异断连问题聊聊Nginx的连接管理
https://catbro666.github.io/posts/4198933e/
2021-11-07T09:52:11.000Z
2022-04-16T10:37:36.542Z
<div class="note primary">
<p>本文主要分享一个在压测Nginx反向代理服务过程中碰到的连接异常断开问题,包括问题的定位与复现,最后由这个实际问题引申聊一下Nginx的连接管理。</p>
</div>
SSL及GMVPN握手协议详解
https://catbro666.github.io/posts/59c71edb/
2021-11-01T13:01:32.000Z
2022-03-05T10:44:06.163Z
<div class="note primary">
<p>之前写过一篇关于<a href="../e92ef4b4">SSL协议的文章</a>,主要介绍了加密学的基础,并从整体上对SSL协议做了介绍。由于篇幅原因,SSL握手的详细流程没有深入介绍。本文将拆解握手流程,在消息级别对握手进行详细地介绍。还没有加密学基本概念的、或者不清楚SSL协议的基本情况的建议先看一下前面一篇的内容。另外,本文主要是针对TLSv1.2和GMVPN的情况,对于TLSv1.3暂不涉及。</p>
</div>
Linux TC 流量控制介绍
https://catbro666.github.io/posts/357ad3ec/
2021-10-17T08:10:15.000Z
2022-03-05T10:37:27.191Z
<div class="note primary">
<p>前段时间在做一些测试的时候接触到了Linux tc,因为需要对数据包添加延迟,用到了tc中的netem。添加简单的延迟非常简单,像这样一条命令就搞定了:<code>$ tc qdisc add dev eth0 root netem delay 1s</code>,你甚至不需要完全理解命令中参数的含义。但是当你想做一些更加特殊的限制的时候,(比如只对某个特定的ip端口添加延迟、或者只对入站的流量添加延迟),事情就变得有些棘手了,简单的百度貌似已经满足不了要求了。你不得不了解TC中的一些基本概念,以及tc[2]命令中相关参数的含义。</p><p>本文正是带你了解这些TC中的基本概念,并通过一个实际例子,将这些概念与tc命令联系起来。</p>
</div>
Lua中如何实现类似gdb的断点调试—08支持通过包名称添加断点
https://catbro666.github.io/posts/5c25711/
2021-09-12T10:38:31.000Z
2022-03-05T10:39:11.569Z
<div class="note primary">
<p>在前一篇中我们支持了通过函数名称来添加断点,我们同时也提到了在Lua中一个函数的名称的并不是确定的。准确的说,Lua中的函数并没有名称,所谓名称其实是保存这个函数值的变量的名称。</p><p>于是通过函数名称添加断点就造成了一定的不确定性,因为函数被调用时并不一定是以这个名字被调用的。另外,多个不同的函数也可能以相同的名字进行调用。</p><p>所以为了解决这个问题,本篇我们将继续扩展断点的设置接口,支持通过包名来添加断点。因为包名相对更具确定性,配合行号可以进行精确定位。</p>
</div>
Lua中如何实现类似gdb的断点调试—07支持通过函数名称添加断点
https://catbro666.github.io/posts/acdf52b7/
2021-08-26T16:09:50.000Z
2022-03-05T10:38:56.644Z
<div class="note primary">
<p>我们之前已经支持了通过函数来添加断点,并且已经支持了行号的检查和自动修正。但是通过函数来添加断点有一些限制,如果在当前的位置无法访问目标函数,那我们就无法对其添加断点。</p><p>于是,本篇我们将扩展断点设置的接口,支持通过函数名称添加断点,以突破这个限制。</p>