- 博客(132)
- 资源 (4)
- 收藏
- 关注
原创 一个基于 LKM 的 Linux 内核级 rootkit 的实现
rootkit是一种恶意软件,攻击者可以在获得 root 或管理员权限后安装它,从而隐藏入侵并保持root权限访问。rootkit可以是用户级的,也可以是内核级的。关于rootkit的详细介绍可以参考https://en.wikipedia.org/wiki/rootkit有许多技术可以实现rootkit,本项目使用的是通过编写LKM(Linux kernel module)并hook系统调用表的方式。这种方式具有诸多优点,比如rootkit作为内核模块可以动态的加载和卸载,大多数rootkit也都是通
2023-02-27 15:13:55
1993
3
原创 SEED-lab:Heartbleed Attack Lab
OpenSSL 库中的一个漏洞,受影响的 OpenSSL 版本范围从1.0.1到1.0.1 f,在一些新版本的OpenSSL中无法复现心跳协议是如何工作的。心跳协议由两种消息类型组成: HeartbeatRequest 包和 HeartbeatResponse 包。客户端向服务器发送一个 HeartbeatRequest 数据包。当服务器接收到它时,它会发回 HeartbeatResponse 数据包中接收到的消息的副本。目标是保持连接活跃心脏出血攻击是基于心跳请求的。这个请求只是向服务器发送一些数
2023-02-25 23:17:29
1948
原创 两行代码将vdi文件转换为vmdk文件,使得virtual box虚拟机在vmware中运行
两行代码将vdi文件转换为vmdk文件,使得virtual box虚拟机在vmware中运行
2023-01-15 19:44:32
2548
原创 程序的生命周期:从.c文件到二进制文件
一个.c文件是如何成为一个可执行二进制文件的?文件后缀被执行过程工具细节.c预处理预处理器(cpp,c pre-processor)宏替换、头文件展开、注释删除.i编译cclC语言程序转化为汇编语言程序(.s).s汇编编译器汇编语言程序转化可重定位目标文件(.o).o链接ld(链接器)将多个.o文件链接为一个可执行文件预处理使用cpp(C 预处理器)完成了:将.c文件转化为.i文件在这里.i文件只是一个后缀而已,本质上仍然
2022-05-28 20:28:14
836
原创 beamer制作学术slide
beamer简介LaTeX documentclass的一种适合制作学术风格PPT[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qwj1kIuo-1653640684885)(/image/Beamer-titlepageUpdated.png)]一个快速入门途径在GitHub上找一个模板做填空题即可把人名、标题等相关替换掉了解一些beamer的基本使用方法基本语法首行是\documentclass[11pt]{beamer}表示字体
2022-05-27 16:38:41
491
原创 查看Linux系统信息的几种方法
uname命令$ uname -aLinux metalts 5.4.0-84-generic #94~18.04.1-Ubuntu SMP Thu Aug 26 23:17:46 UTC 2021 x86_64 x86_64 x86_64 GNU/Linuxlsb_release$ lsb_release -aNo LSB modules are available.Distributor ID: UbuntuDescription: Ubuntu 18.04.6 LTSRelea
2022-04-21 20:25:09
592
原创 watch命令实现Linux监控
watch命令简介watch命令可以重复的执行命令,并且将其输出在命令行上,可以方便的实现一些简单的监控 watch -n 1 cat 1.txt上面的这个命令输出1.txt的内容,-n 1表示每隔一秒钟执行一次命令右侧shell执行命令,左侧是watch的输出我们可以看到先是输出了wdnmd,然后输出了nmsl,至此,我们很简单的实现了一个不断变化的文件的监控,但它是实用的——比如监控一个动态变化的log日志另一个小例子:在所有进程中查找是否有node关键字的进程,每隔三秒刷新一次 wa
2022-04-21 16:26:20
1993
原创 一文搞懂 Linux TTY
TTY的历史TTY全称TeleTYpewriter,也即是电传打字机,它通过两根电缆连接计算机,一根用于向计算机发送指令,一根用于接收计算机的输出,输出结果是打印在纸上的由于历史原因, Linux保留了TTY,上述的输入和输出两个电缆,可以简单的认为是键盘输入和显卡输出tty和stty命令tty命令返回当前的终端名字,1表示可以通过Ctrl+Alt+F3得到$ tty/dev/pts/1stty是对tty进行设置的命令,s表示set - Display all settings for
2022-04-19 18:18:54
5096
原创 shell脚本转化为二进制文件
shc简介shc,全称 shell script compiler,可以将shell脚本编译为二进制可执行文件,从而达到隐藏源代码的目的shc的工作过程分为两步:将shell脚本转化为C语言源码将C语言源码进行编译链接得到二进制文件shc网站安装方式sudo apt-get install shc使用vim hello.sh写入:#!/bin/bashecho "hello,world~"$ shc -f hello.sh$ lshello.sh hello.sh
2022-04-18 20:32:32
6179
原创 Linux句柄相关全局变量及其函数调用链分析
一切皆文件在 Linux 中,一切皆文件。许多操作,比如文件打开、进程创建、管道创建、新的网络连接创建,甚至计时器创建(timerfd _ create)和事件生成(eventfd) ,都会增加 nr_files文件描述符与inode的关系file-maxfile-max定义了系统级别的、所有进程的打开文件限制This file defines a system-wide limit on the number of open files for all process
2022-04-18 16:54:30
615
原创 Linux硬链接与软连接
硬链接不同的文件名可以指向相同的 i-node 节点,也将这些名称称为链接,有时也称之为硬链接(用来与符号链接作区别)比如下面的1、2两个文件名可以指向相同的inode结点811212支持硬链接的系统:原生 LinuxUNIX 文件系统均支持硬链接微软的 NTFS 文件系统支持硬链接不能为目录创建硬链接利用 ln 命令为一个已存在的文件创建新的硬链接zaralts@metalts:~/C$ echo wdnmd > 1zaralts@metalts:~/C$ ls -lito
2022-04-16 16:33:56
969
原创 Linux UTS namespace 的简单实现
UTS 简介UTS是Linux命名空间的一种,可以用作主机名的隔离代码实现command()函数返回*Cmd结构体,参数sh表示被 fork 出来的新进程内的初始命令为shtype Cmd struct { Path string Args []string Env []string Dir string Stdin io.Reader Stdout io.Writer Stderr io.Writer ExtraFiles []*
2022-04-15 22:49:39
958
原创 Linux namespace 原理
简介Linux使用namespace进行系统资源的隔离,比如通过PID namespace用来隔离进程号下图中,主机视角下的进程6,在他自己的namespace视角下,是进程1namespace规则进程可以分配给不同类型的不同名称空间但是对于每个类型,它只能属于一个名称空间默认情况下,进程与其父进程处于相同的名称空间中,它可以通过传递特定的标志在进程创建期间添加到新的名称空间,或者在进程运行期间通过调用 setns 系统调用添加到新的名称空间理想情况下,只有同一名称空间中的进
2022-04-15 15:49:31
1957
2
原创 vscode下载go语言插件【步骤以及报错解决】
为了配置go语言环境,需要在vscode中下载相关插件,比如: go-outline gotests gomodifytags但是我点击install之后,vscode中弹窗显示无法下载插件,于是开始问题的排查查找日志信息我是ssh连接服务器进行开发,日志目录在~/.vscode-server/data/logs/下找到最近的日志,发现:Installing github.com/ramya-rao-a/go-outline@latest FAILED{ "killed": fa
2022-04-12 17:58:44
3272
原创 文件描述符与inode的关系
文件描述符Linux中,文件描述符(File descriptor,fd),是表示指向文件的引用的抽象化概念,在形式上是一个非负整数,当进程打开现有文件或创建新文件时,内核向进程返回一个文件描述符下面open系统调用返回一个文件描述符给fdfd = open(pathname, flags, mode)常见的几个文件描述符:STDIN,文件描述符:0;标准输入,默认从键盘读取信息;STDOUT,文件描述符:1;标准输出,默认将输出结果输出至终端;STDERR,文件描述符:2;标准
2022-04-09 22:10:18
2462
原创 Linux输入输出重定向
标准输入、标准输出、标准错误STDIN,文件描述符:0;标准输入,默认从键盘读取信息;STDOUT,文件描述符:1;标准输出,默认将输出结果输出至终端;STDERR,文件描述符:2;标准错误,默认将输出结果输出至终端常用重定向命令将命令的标准输出重定向到文件中SomeCommand > SomeFile.txt 将命令的标准输出重定向、追加到文件中SomeCommand >> SomeFile.txt将命令的标准输出、标准错误重定向到文件中Some
2022-04-08 11:50:58
350
原创 fork炸弹分析
Linux系统创建进程的方式十分简单,只需写一行fork();即可。因此,很容易在Linux环境下使用fork系统调用不断复制自身从而引发拒绝服务攻击Unix环境下的fork炸弹:(){ :|: & };:: 是函数名| 是管道命令,将前者的输出作为输入给后者,在这里每次调用:函数会执行:两次Unix中&表示将函数后台运行,换句话说,解除两函数的关联,当前面的:函数被终止,并不会杀死后面的:函数;表示函数定义结束后面的:是第一次的函数调用C语言实现#include &
2022-04-08 10:45:09
2496
原创 fork 系统调用解析
fork:一次调用,两个返回值fork 函数用于在Linux中创建新进程,英文本意是叉子,fork系统调用就像是叉子一样,寓意一分为二,一次调用,两个返回值fork执行后发生了什么?fork函数执行后,后将存在两个进程,且每个进程都会从 fork()的返回处继续执行新的子进程几近于对父进程的翻版:子进程获得父进程的栈、数据段、堆和执行文本段的拷贝执行 fork()之后,每个进程均可修改各自的栈数据、以及堆段中的变量,而并不影响另一进程父进程的fork返回值为子进程的pid,子进程的fork返
2022-04-07 23:33:36
1904
原创 docker 常用命令
列出所有容器镜像docker image ls查看所有容器信息以及其状态docker ps -a以下命令与之等价: docker container ls -a停止容器实例运行只有在停止容器实例之后才能删除对应的镜像docker stop/kill/start/restart container_id删除容器镜像docker rmi image_id命令行模式进入容器中docker exec -it container_id /bin/bashi:交互的(inter
2022-04-07 13:44:26
521
原创 构建最小化的 go 语言 docker 容器
将你的go语言代码容器化如何通过引入Scratch,创建一个尽可能小的、go语言代码写的Docker容器?官方的docker仓库有个项目:https://github.com/docker-library/hello-world,可以在shell终端打印出hello world,本文只需三行Dockerfile+一个简单的.go文件即可完成功能编写go语言代码下面是一个简单的go语言程序源码,它每两秒打印出wdnmd字符package mainimport "fmt"import "time
2022-04-05 20:42:50
1381
原创 Linux 安装 go 语言并配置环境
安装go语言下载官网的源码压缩文件到本机:wget https://go.dev/dl/go1.18.linux-amd64.tar.gz解压缩:tar -C /usr/local -zxvf go1.18.linux-amd64.tar.gz配置go语言的环境变量:sudo vim /etc/profile按下G跳转到最后一行,粘贴:export GOROOT=/usr/local/goexport PATH=$PATH:$GOROOT/binexport GOPATH=$HO
2022-04-02 20:08:12
1011
原创 Ubuntu 一键安装 docker
安装https://get.docker.com/有自动安装的脚本,因此下载到本地安装即可$ curl -fsSL get.docker.com -o get-docker.sh$ sudo sh get-docker.sh --mirror Aliyun
2022-04-02 18:23:37
3135
原创 解决apt命令报错:Could not get lock /var/lib/dpkg/lock
执行apt-get指令遇到一个诡异的报错: Could not get lock /var/lib/dpkg/lock原因:有别的apt进程正在执行看一下apt有关的进程:执行命令:sudo rm /var/lib/dpkg/lock再次查看进程:发现相关进程已被kill之后,apt指令正常使用...
2022-04-02 16:16:31
382
原创 分析Linux二进制文件的常用命令:xxd readelf file objdump
本文讲解了以下基本命令的使用:xxdreadelffileobjdumpxxd该命令将二进制文件以16进制表示$ xxd a.out | lessreadelf输出 elf 文件的有关信息-a 输出全部-h 输出elf 文件头file鉴别文件类型objdupmobjdump -f filename输出文件相关信息objdump -d filename输出文件反汇编之后的结果...
2022-03-31 19:03:00
1075
1
原创 使用 strace 分析Linux系统调用
系统调用简介进程通过系统调用使用内核服务。系统调用会进入内核,让内核执行服务然后返回一些常见的系统调用:系统调用描述fork()创建进程exit()结束当前进程wait()等待子进程结束exec(filename, *argv)加载并执行一个文件open(filename, flags)打开文件,flags 指定读/写模式read(fd, buf, n)从文件中读 n 个字节到 bufwrite(fd, buf, n)从 buf 中
2022-03-31 18:31:54
726
原创 查看、管理 Linux 进程的几个常见命令
pidofpidof命令罗列出给定名字对应的进程id罗列出bash的进程id号:$ pidof bash2674500 2950 2454杀死bash相关所有进程: $ kill $(pidof name)pstreepstree 命令将正在运行的进程以树形式输出命令:pstree [option]option为-p:同时输出进程号option为user:输出特定用户的进程示例:$ pstree -p root输出root用户的进程树,同时输出其进程号ps输出所有
2022-03-27 14:44:43
1096
原创 使用SSH连接GitHub,解决报错:git@github.com: Permission denied (publickey)t
先检查ssh-agent的状态:$ Get-Service ssh-agentStatus Name DisplayNameStopped ssh-agent OpenSSH Authentication Agent这说明没有开启ssh服务,我们将ssh服务开启:$ eval $(ssh-agent)添加私钥,我在github端加入了wdnmd.pub,因此在这里将wdnmd私钥添加:$ ssh-add ~/.ssh/wdnmd下面
2022-03-26 20:49:08
1646
原创 解决 Git 报错:GitHub - failed to connect to github 443
造成这个情况的原因是,github被墙,因此为 git 设置代理地址即可解决打开Git bash,输入:git config --global http.proxy 127.0.0.1:10080其中,127.0.0.1是我的socks5代理服务器地址,10080是我的代理服务器的端口号,读者改成自己的代理配置即可...
2022-03-14 13:20:01
1424
原创 【Linux入门】tldr:man手册的极佳替代
man 手册:大而全一定是好事吗?man 手册提供了极佳的快速查询功能,当我们不熟悉某个指令的时候,可以通过在命令行输入 man + command 查询在线手册。下面是man的一个介绍:【Linux入门】一文看懂 Linux man 手册但是,对于某些命令,man 的内容实在太多,比如,我们输入 man gcc | wc -l来统计gcc的man手册行数,结果如下:zarathustra@VM-24-6-ubuntu:~$ man gcc | wc -ltroff: <standard i
2022-02-23 17:04:26
1655
原创 【C语言指针】分析C语言复杂指针
前言指针是一种保存变量地址的变量,简单指针容易分析,但是当指针稍微复杂,就很容易无从下手,比如:char *(*(**foo[][8])())[]; 下面将会由浅入深的探究指针普通指针#include <cstdio>#include <iostream>using namespace std;int main() { int a = 1; int * pa = &a; int ** ppa = &pa; prin
2022-02-08 17:11:52
1422
原创 【C语言指针】char* argv[] 、char **argv、命令行传参
命令行环境下的C语言程序不同于 ide 一键 build and run,在命令行环境下运行C语言程序,可以指定参数,argc 表示参数的个数, argv 表示参数的字符串数组下面是一个C语言程序,它将打印出参数的个数和值#include <stdio.h>int main(int argc,char **argv){ printf("argc is %d \n argc is :\n",argc); for(int i=0;i<argc;i++
2022-02-03 20:18:06
15659
4
原创 【生产力工具】Surfingkeys——网页版Vim
什么是SurfingkeysSurfingkeys 是一个Chrome/火狐浏览器的扩展,安装之后可以通过类似vim的操作来控制浏览器,比如hjkl来进行上下左右的移动,e d来完成网页的翻页,gg、G实现网页首位的快速跳转每个按键/按键组合都对应着不同的操作,记住这些快捷键可以方便的摆脱鼠标,增加生产力按下?可以快速打开它的帮助文档,按下;e可以更改每个按键对应的功能(如下图所示)但是,需求是因人而异的。为求同存异,笔者下面会在一定情境下举例说明Surfingkeys的使用方法按 f 键进
2022-01-25 15:17:03
1918
原创 【Linux常用指令】grep命令常见用法
grep命令简介Grep用来搜索文本字符串的命令行命令,有如下的常见使用情景:在文件中搜索字符串(pattern)配合管道使用,将其他Linux命令的输出通过管道传输到grepgrep的四个字母对应如下英文:G:global searchRE:regular expressionP:print out the linecut 是将一行讯息当中,取出某部分我们想要的,而 grep 则是分析一行讯息, 若当中有我们所需要的信息,就将该行拿出来命令格式 grep [OPTION...
2022-01-20 18:52:02
2185
原创 【Linux入门】使用scp和filezilla远程传输文件
scp简介很多时候我们需要在两个主机之间传送文件,比如为了完成ssh连接,需要在远程服务器上放置.pub的公钥文件。scp 命令可在本地与远程主机之间复制文件或目录,达到我们的需求scp命令格式$ scp [-r] [[user1@]hostname1:]file1 ... [[user2@]hostname2:]file2举两个实际生活中遇到的例子:当我们想从本地传输文件到远程。欲传输文件为当前目录下1.txt文件,远程服务器ip为11.22.33.44,远程用户为zara,要传输到的文件目
2022-01-17 19:17:13
1855
原创 【Linux入门】一文看懂 Linux man 手册
前言man是Linux的一个非常强的的命令,它的全称为manual(手册)当我们遇到忘记的指令,可以直接通过man指令来获得提示当我们输入man grep,就会获得以下界面,通过输入/text,可以快速的匹配到text,获得对应信息接下来,让我们对man的内容进行解析man文档的内容结构section类别上图中,我们可以看到左上角的GREP(1), 这表示,此时所显示的section类别为第1种类别:可执行的程式或是shell 指令除了第一种类别外,还有别的类别1:可执行的程式或是
2022-01-10 11:53:09
3956
原创 【大厂HOT100题】二叉树的锯齿形层序遍历
原题链接:二叉树的锯齿形层序遍历和二叉树的层序遍历不能说很像,只能说一模一样题意给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。例如:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回锯齿形层序遍历如下:[ [3], [20
2022-01-08 14:42:03
151
原创 【大厂HOT100题】有效的括号
原题链接:题意给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。示例 1:输入:s = "()"输出:true思路使用栈维护一个集合使用for循环对字符串进行遍历,将遍历到的字符与栈顶元素进行比较,如果匹配,那么就让栈顶元素出栈最终,如果栈为空,那么为TRUE,否则为FALSE代码class Solution {public: b
2022-01-07 11:25:49
228
原创 【大厂HOT100题】二叉树的层序遍历
原题链接:二叉树的层序遍历题意给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其层序遍历结果:[ [3], [9,20], [15,7]]思路:广度优先搜索代码...
2022-01-06 22:44:19
132
原创 【大厂HOT100题】合并两个有序数组
原题链接: 合并两个有序数组题意给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。示例 1:
2022-01-05 21:48:09
130
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅