自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(131)
  • 收藏
  • 关注

转载 ubuntu22.04开启root用户登陆并开启远程ssh连接

注意:当没有执行第一步“设置root用户密码”时,/root/.profile文件是不存在的所以对于新安装的系统来说,第一步是非常重要的。文件2、 sudo vim /etc/pam.d/gdm-autologin。文件1、 sudo vim /etc/pam.d/gdm-password。命令:sudo vim /etc/ssh/sshd_config。文件:sudo vim /root/.profile。修改配置文件/etc/ssh/sshd_config。

2024-05-11 15:23:22 126

转载 C/C++ errno用法

include string.h后可用strerror(errno)将errno这个整形变量转化为对应的可读的字符串,具体对应关系见 /usr/include/asm/errno.h中定义如下。errno是全局变量,表示上一个调用的错误代码,如果成功就为0.include errno.h后可直接使用errno,

2024-03-26 17:14:09 48

原创 undefined symbol问题的查找、定位与解决方法

最近发现一个程序执行中报错,报错内容如下,这里对排查和修复方法做一个记录。先说结论,比方说你编译时只加入了头文件*.h,而函数实现部分.c,文件未编译进去,这时候就会出现undefined symbol。还有一种情况是,在C++代码调用C语言代码也会导致出现,原因是,这就会导致*.h文件中定义的函数,找不到对应.c文件中的实现。解决办法是在*.h文件中添加将C语言的函数声明括起来即可。

2024-03-25 11:15:04 1809

原创 Linux hook系统调用使你文件无法删除

hook技术在Linux系统安全领域有着广泛的应用,例如通过hook技术可以劫持删除文件的系统调用,从而使用户无法删除特定文件,也可以实现对系统网络,文件,进程等的监控。hook技术即钩子函数,钩子的本质是一段用以处理系统消息的程序,。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息(如屏幕取词,监视日志,截获键盘/鼠标输入等),也可以不作处理而继续传递该消息,还可以强制结束消息的传递。

2024-03-19 15:18:56 1031 1

原创 Linux C/C++编程 --潦草笔记

记录工作学习中遇到一些C/C++编程技巧,目前还在不断完善中。。#运算符用在预编译时期,用于将宏参数转换为字符串,即是加上双引号。##运算符用于在预编译期粘连两个符号,增大了宏的使用灵活性!C语言宏定义中#符号和##的妙用。

2024-03-07 16:36:09 412

原创 Intel SGX 概述 --潦草笔记

SGX是Intel开发的新的处理器技术,可以在计算平台上提供一个可信的空间,保障用户关键代码和数据的机密性和完整性。SGX全称Intel Software Guard Extensions,顾名思义,其是对因特尔体系(IA)的一个扩展,用于增强软件的安全性。SGX是Intel开发的新的处理器技术,可以在计算平台上提供一个可信的空间,保障用户关键代码和数据的机密性和完整性。

2024-02-26 14:42:05 1082

原创 快速搭建ARM64实验平台(QEMU虚拟机+Debian)

最近翻阅笨叔的《奔跑吧Linux内核》卷2,发现了一个非常好用的ARM64的实验平台,这里对部署流程做一个记录。使用“O0"来编译内核。在主机中编译内核。使用QEMU来加载系统。使用GDB单步调试内核和Debian系统。使用ARM64版本的Debian系统的根文件系统。在线安装Debian软件包。支持在虚拟机里动态编译内核模块。支持主机和虚拟机共享文件。

2024-02-22 20:47:14 1307

原创 socket通信 && smallchat简介

本文介绍了socket通信的相关API,以及Redis 创始人 antirez 用纯 C 语言代码写了一个聊天服务器的最小编程示例,Smallchat。

2024-02-19 17:07:39 1079

原创 物理内存和虚拟内存区别

我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概念。物理内存就是系统硬件提供的内存大小,是真正的内存,相对于物理内存,在linux下还有一个虚拟内存的概念,虚拟内存就是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换空间(SwapSpace)。

2024-02-01 17:27:27 958

原创 vmstat 监控虚拟内存,进程,CPU

slab:由于内核会有许多小对象,这些对象构造销毁十分频繁,比如i-node,dentry,这些对象如果每次构建的时候就向内存要一个页(4kb),而其实只有几个字节,这样就会非常浪费,为了解决这个问题,就引入了一种新的机制来处理在同一个页框中如何分配小存储区,而slab可以对小对象进行分配,这样就不用为每一个对象分配页框,从而节省了空间,内核对一些小对象创建析构很频繁,slab对这些小对象进行缓冲,可以重复利用,减少内存分配次数。这个数据是从/proc/stat中的processes字段里取得的。

2024-02-01 17:27:05 1022

原创 C++ 内存占用分析(内存泄漏)

在实际的 C++ 开发中,我们经常会遇到诸如程序运行中突然崩溃、程序运行所用内存越来越多最终不得不重启等问题,这些问题往往都是内存资源管理不当导致的。有些内存资源已经被释放,但指向它的指针并没有改变指向(成为了野指针),并且后续还在使用;有些内存资源已经被释放,后期又试图再释放一次(重复释放同一块内存会导致程序运行崩溃);没有及时释放不再使用的内存资源,造成内存泄漏,程序占用的内存资源越来越多。C/C++什么是内存泄露,内存泄露如何避免?

2024-01-25 16:40:08 598

原创 gtest 单元测试

Google Test(简称gtest)是一个开源的C++单元测试框架。和常见的测试工具一样,gtest提供了单体测试常见的工具和组件。比如判断各种类型的值相等,大于,小于等,管理多个测试的测试组如testsuit下辖testcase,为了方便处理初始化数据减少重复代码,提供了setup和teardown函数等。在文件夹中里面存放了10个官方提供的示例代码,默认是不编译的,这里我们修改,将第20行的OFF改为ON。

2024-01-23 20:40:32 1427

原创 Meltdown复现及原理分析

操作系统最核心的一个特性是内存隔离,即操作系统要确保用户程序不能访问彼此的内存。而CPU熔断漏洞巧妙地利用了现代处理器中乱序执行的副作用进行侧信道攻击,破坏了机遇地址空间隔离的安全机制,使得用户态程序可以读出内核空间的数据,包括个人私有数据和密码等。

2024-01-21 16:42:13 933

原创 Linux 内核指令动态替换

Linux Kernel可以在运行时动态的(即不需要重启)替换内核指令,主要有以下三种方式。

2024-01-15 16:35:09 446

原创 Linux 更换内核

默认情况下,如果不做任何选择,五秒之后系统在默认的开机启动项上开机启动,如果进行了上述任何一个操作则必须按下确认键才能启动操作系统。是 grub2 在开机启动过程中读取的配置文件包含了引导菜单配置,内核参数,模块加载配置等信息。如果你经常需要使用某个内核环境,可以将它设置为grub2的默认版本。正常开机启动后,我们就会看到一个类似上图的grub2 开机启动菜单界面。reboot之后系统内核就变成了我们设置的默认内核。或者,使用1.2中命令输出的内核编号进行设置。

2024-01-15 16:24:12 1314

原创 Linux Kdump分析宕机问题案例

上述案例中发生崩溃的原因是"BUG: unable to handle kernel NULL pointer dereference at 0000000000000050",即内核发生了不能处理的空指针引用。为堆栈信息中RIP所指地址。在输出信息中我们可以看到触发宕机的代码在oops_test.c文件的第16行。堆栈中RDI,RSI分别指向了传入的第一个,第二个参数。结合代码我们可以看到,传入的两个参数类型分别是。参数的地址由堆栈中的。

2024-01-11 15:23:51 566

原创 Linux 内核线程

先说kernel_thread接口,使用该接口创建的线程,必须在该线程中调用daemonize()函数,这是因为只有当线程的父进程指向”Kthreadd”时,该线程才算是内核线程,而恰好daemonize()函数主要工作便是将该线程的父进程改成“kthreadd”内核线程;但是内核线程总要访问内核空间的其他内核啊,没有mm域毕竟是不行的。所以内核线程被调用时, 内核会将其task_strcut的active_mm指向前一个被调度出的进程的mm域, 在需要的时候,内核线程可以使用前一个进程的内存描述符。

2024-01-11 14:45:28 1013

原创 Vim 粘贴内容时全变成注释的问题

在使用vim粘贴代码时,会出现注释代码后面的代码全被注释的情况。在paste模式下进行复制粘贴就变得很正常了。

2024-01-09 15:31:10 952

原创 Netlink 通信机制

Netlink套接字是用以实现用户进程与内核进程通信的一种特殊的进程间通信(IPC) ,也是网络应用程序与内核通信的最常用的接口。在Linux 内核中,使用netlink 进行应用与内核通信的应用有很多,如路由 daemon(NETLINK_ROUTE)用户态 socket 协议(NETLINK_USERSOCK)防火墙(NETLINK_FIREWALL)netfilter 子系统(NETLINK_NETFILTER)内核事件向用户态通知(NETLINK_KOBJECT_UEVENT)

2024-01-08 20:14:24 1109

原创 在win10和Linux上配置SSH 无密码登录

检查方式:键入win+r输入cmd,打开windows powershell,输入ssh命令。已安装则会显示ssh命令提示。可以看到该目录下已生成id-rsa(私钥)和id-rsa.pub(公钥)两个文件。输入命令ssh-keygen (过程与Linux生成过程一样)在本地终端执行命令 ssh-keygen,然后一路回车。否则先在本地安装openssh。命令将公钥复制到远程机器。将步骤二中生成的公钥()内容复制到远程主机。Linu主机可以使用。

2024-01-08 15:03:17 836

原创 Linux Kdump和Crash工具

Kdump是一种基于kexec的Linux内核崩溃捕获机制,简单来说系统启动时会预留一块内存,当系统崩溃调用命令kexec(kdump kernel)在预留的内存中启动kdump内核,该内核会将此时内存中的所有运行状态和数据信息收集到一个coredump文件中以便后续分析调试。

2024-01-04 18:03:40 730

原创 Linux kernel 学习笔记

几个推荐的网站或邮件列表:

2024-01-04 17:38:16 421

原创 Linux Perf 介绍

perf是一款Linux性能分析工具,内置在Linux内核的一个Linux性能分析框架中,利用CPU、性能检测单元(Performance Monitoring Unit,PMU)和软件计数(如软件计数器和跟踪点)等进行性能分析。快速定位和解决系统性能问题。它可以收集程序运行时的性能数据,包括CPU、内存、IO等方面的信息,并提供详细的性能分析和报告。生成程序的调用图,记录程序中函数之间的调用关系,并提供详细的调用图分析和报告。

2024-01-03 17:44:36 1137

原创 Retpoline 一种分支目标注入的缓解措施

继续Meltdown && Spectre安全漏洞的相关分析,本文关注V2 patch中引入的retpoline技术。

2023-12-19 16:43:35 1042

转载 Spectre && Meltdown漏洞

Spectre和Meltdown是缓冲时延旁路攻击的两种实际攻击方法。由于CACHE的存在,CPU对于不同外存的地址访问速度会有差异,这本身就是一种“边带信息”。对这种边带信息的一种利用方式就是:首先清空CACHE;使用内存当中某个地址所存储的字节的值(这个值就是我所感兴趣、但又不被允许访问的,比如内核其他保护区域中)作为下标来读一个我可以访问的数组,这相当于预取了CACHE;然后测试这个数组所有地址的访问速度,就可以猜出我感兴趣的这个值来。

2023-12-19 15:10:38 88

原创 Radix Tree用法

对于长整型数据的映射,如何解决Hash冲突和Hash表大小的设计是一个很头疼的问题。radix树就是针对这种稀疏的长整型数据查找,能快速且节省空间地完成映射。借助于Radix树,我们可以 实现对于长整型数据类型的路由。利用radix树可以根据一个长整型(比如一个长ID)快速查找到其对应的对象指针。这比用hash映射来的简单,也更节省空间,使用hash映射hash函数难以设计,不恰当的hash函数可能增大冲突,或浪费空间。

2023-12-04 20:08:25 646

原创 Linux 进程管理 实时调度类及SMP和NUMA

表示实时调度实体,包含整个实时调度数据信息。实践证明SMP服务器CPU利用率最高是2-4个CPU。

2023-11-18 13:35:23 664

原创 Intel x86 分支记录

X86 处理器支持最近分支记录(Last branch record),也就是记录CPU的跳转记录(jmp,jcc,call,ret等指令,中断和异常). 通过操作MSR寄存器(model specific register)来配置分支记录功能。

2023-11-13 17:26:43 119

原创 Intel x86_64 LBR功能

通过CPUID指令读取处理器的各种标识和特性信息,判断是否支持硬件调试功能,rdmsrwrmsr指令是否可用;通过wrmsr指令设置寄存器,开启LBR功能;通过rdmsr指令读取寄存器,获取跳转指令信息;下面我们将对这几个方能进行更加详细的介绍。该指令可以从读取处理器的各种标识和特性信息(比如:CPU型号和支持的功能),并将指令执行完后返回的信息保存在 EAX, EBX, ECX,和 EDX 寄存器中。CPUID指令有两组功能:一组返回的是基本信息,另一组返回的是扩展信息。

2023-11-10 14:07:40 204

原创 Linux 反弹shell

原理及利用方法:检测方法:

2023-10-18 11:43:02 100

原创 开源协议介绍

开源软件或开源组件,它们都会基于某种协议来提供源码和授权,那么这些开源协议到底有哪些约束呢?在介绍之前,必须告诉大家,针对开源协议,必须打消“开源 = 免费”这个念头,因为“天下没有免费的午餐”这条真理在这里也是适用的……如果有github页面一般都有标在项目根目录一般有LICENSE字眼的说明在某个文件顶部copyright声明BSD源自加州大学伯克利分校,是自由软件中使用最广泛的许可协议之一,其给于使用者很大自由的协议。

2023-10-10 20:12:19 336

原创 Linux 隐藏进程

这种方式属于DKoM(Direct Kernel Object Manipulation)攻击方式了,即直接内核对象操作技术。关于第一种hook方式可以参考上一篇文章。最后推荐一个rootkit工具。

2023-10-09 17:55:00 1114

原创 Linux LD_PRELOAD Hook

loader在进行动态链接的时候,会将有相同符号名的符号覆盖成LD_PRELOAD指定的so文件中的符号。换句话说,可以用我们自己的so库中的函数替换原来库里有的函数,从而达到hook的目的。但是LD_PRELOAD有个限制:只能hook动态链接的库,对静态链接的库无效,因为静态链接的代码都写到可执行文件里了嘛,没有坑让你填。使用PRE_LOAD劫持库函数的这种做法可以做很多事情,比如劫持随机函数random, random_r等,使得看起来是公平的摇号程序可以自如地由自己控制;

2023-10-09 16:37:36 381

原创 Linux Ftrace介绍

Ftrace 是 Linux 官方提供的跟踪工具,在 Linux 2.6.27 版本中引入。Ftrace 可在不引入任何前端工具的情况下使用,让其可以适合在任何系统环境中使用。特定内核函数调用的频次 (function)内核函数在被调用的过程中流程(调用栈) (function + stack)内核函数调用的子函数流程(子调用栈)(function graph)由于抢占导致的高延时路径等性能分析器,用来提供统计和直方图数据(需要 CONFIG_ FUNCTION_PROFILER=y)

2023-10-08 15:34:47 152

原创 Linux eBPF介绍(二)

作为 eBPF 最重大的改进之一,一次编译到处执行(简称 CO-RE)解决了内核数据结构在不同版本差异导致的兼容性问题。不过,在使用 CO-RE 之前,内核需要开启和这两个编译选项。

2023-09-27 20:39:23 267

原创 Linux eBPF介绍(一)

eBPF(extened Berkeley Packet Filter)是一种内核技术,它允许开发人员在不修改内核代码的情况下运行特定的功能。eBPF 的概念源自于 Berkeley Packet Filter(BPF),后者是由贝尔实验室开发的一种网络过滤器,可以捕获和过滤网络数据包。2014 年eBPF 随 Linux 3.18 首次限量发布,充分利用 eBPF 至少需要 Linux 4.4 以上版本。

2023-09-27 11:46:54 710

原创 Linux 一键换源脚本

【代码】Linux 一键换源脚本。

2023-09-27 10:41:40 472

原创 Qemu+Arm64 仿真

Note: Linux原始镜像为vmlinux,后续可能是Image、Image.gz、uImage镜像, 处理过程是。CONFIG_INITRAMFS_SOURCE这里填写你自己的路径地址。如果编译时出现上述报错,sudo su 切换root用户即可。这里可以根据自己的需要选择不同的CPU进行仿真调试。

2023-09-21 10:23:06 346

原创 Linux 系统组成

Linux是一种开源电脑操作系统内核。Uboot的全称 Universal Boot Loader,是遵循GPL条款的开源项目, U-Boot的主要作用是用来启动操作系统内核,它分为两个阶段,即boot + loader, boot阶段启动系统,初始化硬件设备,建立内存空间映射图,将系统的软硬件带到一个合适的状态, loader阶段将操作系统内核文件加载至内存,之后跳转到内核所在地址运行。本篇为Linux系统移植系列的第一篇文章,介绍了一个完整可运行的Linux系统由哪些部分组成,每个部分的作用是什么。

2023-09-20 16:29:24 375

原创 Linux Core Dump

当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”)。我们可以认为 core dump 是“内存快照”,但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时 dump 下来,例如寄存器信息(包括程序指针、栈指针等)、内存管理信息、其他处理器和操作系统状态和信息。

2023-09-19 16:51:42 218

ELF文件格式分析的经典资料,高清PDF版

ELF文件格式分析的经典资料,高清PDF版

2023-08-18

低版本gcc,能够在glibc 2.12环境下运行

低版本gcc,能够在glibc 2.12环境下运行,如redhat6,centos6等环境中

2022-11-18

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除