多核任务调度
背景调研以往的优秀作品中,大部分的任务调度队列使用的是全局队列,即将所有任务都放在一个fifo队列中,这样可以简化调度策略,方便代码设计。但是这样设计的缺陷也是显而易见,在多核情况下,每个核add、fetch任务都需要对全局队列进行加锁,这样会造成大量的锁竞争和等待,降低cpu利用率。 为了提高性能减少锁竞争,我们在xv6 lab8:lock的提示下想到可以将全局队列拆分给每个核的单独队列,同时保留一个全局优先队列。 设计思路基于工作窃取机制,每个核会先从全局优先队列中fetch任务,这里面放的是被信号唤醒的任务;如果没有优先任务,那么再从自己的队列中取任务执行;这样极大地减少了锁竞争的出现。但是这里又会出现一个极端情况,当存在大量的优先任务时,普通任务会出现饥饿现象,同时这样的设计也会退化到最初版本。所以需要为工作窃取机制找到合适的工作场景才能最大化提高性能。 暂时的实现: #![no_std]extern crate alloc;use alloc::collections::VecDeque;use core::future::Future;use core::sync::ato ...
protobuf
工具安装 python环境搭建:本人使用的是python3和pip3: pip3 install protobuf pyqt5 pyqtwebengine requests websocket-client pbtk安装 git clone https://github.com/marin-m/pbtk 进入这个文件夹就可以使用工具了。 工具使用 如果我们是从题目给的二进制文件提取结构体: ./pbtk/extractors/from_binary.py ./pwn 会在当前文件夹下生成一个message.proto文件。 使用工具将message.proto编译为python文件,这样就能在我们的exp中导入这个python,然后就能使用message.proto中的结构体了。 在message.proto文件路径下使用(注意工具路径换为自己的) /home/tools/pbtk/utils/external/protoc/protoc --python_out=./ ./message.proto 执行完后会生成如下python文件: 最后就是在ex ...
git使用.md
代理 代理查看 git config --global http.proxygit config --global https.proxy 设置代理 git config --global http.proxy http://<proxy_host>:<proxy_port>git config --global https.proxy https://<proxy_host>:<proxy_port> 取消代理设置 git config --global --unset http.proxygit config --global --unset https.proxy 删除文件git rm --cached可以从版本控制中删除文件,但是保留在本地工作目录中的副本。 用途: 不想跟踪特定的文件或文件夹,例如大型数据文件、自动生成的文件或者敏感信息。 已经误将不应该被版本控制的文件添加到了 Git 中,需要将其从版本控制中移除。 调整 .gitignore 文件,使得新的忽略规则生效。有时候,即使你在.gitignore中 ...
rustup包管理器.md
安装首先安装 Rust 版本管理器 rustup 和 Rust 包管理器 cargo,这里我们用官方的安装脚本来安装: curl https://sh.rustup.rs -sSf | sh 安装对应版本的nightlyrustup toolchain install nightly-2025-01-18 然后切换到对应版本的nightly: rustup default nightly-2025-01-18-x86_64-unknown-linux-gnu 最后验证: y@Linux:~/Downloads$ rustc --versionrustc 1.86.0-nightly (6067b3631 2025-01-17)
锁.md
Mutex这是简单的互斥锁,只允许一个线程访问数据空间,无论是读还是写都需要获取锁。所以他的使用场景比较受限(例如需要频繁写操作)。他的缺点也是显而易见,如果读操作频繁,可能会导致性能瓶颈。 RwLock可以使用kernel_sync包中的读写锁。 这个包针对内核环境进行了优化,可能更适合低延迟和高吞吐量的场景。 特点: 允许多个线程同时读取数据,但是写操作是独占的。 适用于读操作远多于写操作的场景(缓存、配置数据等)。 SyncUnsafeCell替换Mutex提高性能SyncUnsafeCell作用: 获取可变数据:在Rust 中,默认情况下,数据是不可变的,且不能在多个线程之间共享可变数据。SyncUnsafeCell 允许你在多线程环境中共享可变数据。 内部可变性:SyncUnsafeCell提供内部可变性,可以在不获取可变引用情况下修改其内容。 安全性:他通过同步机制确保了对UnsafeCell的安全访问。
博客使用
下载Hexo需要有npm和nodejs: npm install -g hexo-cli 创建一个文件夹管理博客文章 my_blog.并初始化项目: hexo init my_blogcd my_blognpm install 文章创建hexo n --path 目录/文章名 文章部署和发布生成静态文件: hexo g 部署: hexo d 启动本地服务器预览: hexo server 缓存清除缓存文件可能会影响生成结果,尤其是在修改主题或配置后。清除缓存可以确保生成的文件是最新的。 1. 使用 Hexo 命令清除缓存运行以下命令清除 Hexo 缓存: hexo clean 这会删除 public 文件夹(生成的静态文件)和 .cache 文件夹(缓存文件)。 2. 手动删除缓存文件夹如果 hexo clean 没有完全清除缓存,可以手动删除以下文件夹: .cache:Hexo 的缓存文件夹。 db.json:Hexo 的数据库文件(位于项目根目录)。 public:生成的静态文件。 运行以下命令手动删除: rm -rf .cache db.json public ...
docker镜像
如何使用别人打包好的docker镜像使用load进行从tar文件导出镜像。 docker load -i xxx.tar 查看镜像是否加载成功: docker images 运行容器使用 docker run 命令运行镜像。 docker run -d --name mycontainer myuser/myapp:1.0 -d:以后台模式运行容器。 --name mycontainer:为容器指定一个名称(可选)。 myuser/myapp:1.0:要运行的镜像名称和标签。 如果需要映射端口或挂载卷,可以添加参数: docker run -d -p 8080:80 --name mycontainer -v /host/path:/container/path myuser/myapp:1.0 -p 8080:80:将主机的 8080 端口映射到容器的 80 端口。 -v /host/path:/container/path:将主机的目录挂载到容器中。
rust异步运行时设计
在了解无栈协程前,我们先看看有栈的情况,其实这就是普通的函数调用。 有栈协程在c语言中,函数调用和返回过程中会使用栈上数据进行恢复调用前状态。程序总体上是同步顺序运行的,他们都使用同一个栈。但是随着不断地函数调用,这个栈会越来越深,所以会带来极大的开销。 而有栈协程中的有栈到底是什么意思,这里其实是约定成俗想表达对于每个新创建的协程来说:他们都独立运行与一块新的栈,这块栈是从堆(基于mmap维护了整个内存管理)上面申请的,没用共用系统栈,那么这个协程的生命周期和上下文都能够被完整保存,可以被任意时间和任意线程独立执行 go 创建协程在golang中可以使用go关键字创建协程,在创建后整个函数与当前的主线程没有瓜葛,相当于单独开辟一个栈给这个程序使用。 go func(){ fmt.Println("this is a goroutine print!") } 这里就不深入了解了,主要是需要学习无栈协程。 无栈协程协程的实现需要保存上下文,但是我又不能依赖栈,因为这样可能会带来其他开销,那我们该如何做到呢?带着这个疑问我们看看ru ...
网络威胁
引入CTI输入是关于网络安全的原始数据,而输出是可以帮助未来主动网络安全防御决策的知识,包括限制网络攻击程度和预防网络攻击的策略。 利用CTI实现对攻击者攻击行为做出正确的反应。(就是主动防御?后发制人)并且揣测攻击者接下来的行为。 网络威胁情报挖掘方法与分类研究方法六个步骤:网络场景分析、数据收集、CTI相关信息提炼、CTI知识获取、绩效评估和决策。 网络场景分析:分析网络攻击的具体场景,在面对攻击时能够快速定位攻击面(方便后序定位攻击手段),制定后序的路线图 数据收集:通过博客、众包平台、国家漏洞库、DIB等 信息提炼:提炼与CTI相关的信息(即文章、段落或句子) 知识获取:在完成CTI相关的信息提炼之后,需要以CTI知识获取的形式进行数据分析,根据用户的需求,精确定位出相关的、准确的信息。 绩效评估:根据我们的预期目标评估提取的CTI的性能。 决策 网络威胁情报挖掘定义与分类我们将网络威胁情报挖掘定义为收集和分析来自各种网络威胁情报数据源的大量信息,以识别与网络威胁、攻击和有害事件相关的信息 类比为医疗过程; 主动防御Cybersecurity Related Entiti ...
gopwn的函数入口定位
结论pwn中的go程序大多数都是静态链接的,所以里面含有大量可以使用的gadget。同时在IDA中,go的主函数一般在最下面(最后几个函数一般是用户自己定义的)。 gopwn一般是栈溢出类型,并且使用rop进行系统调用实现shell获取。 例题题目地址:[NSSRound#2 Able]nohelper | NSSCTF 讲题目放进IDA中后难以找到主函数入口。根据师傅的分析,我们可以一般按照如下的流程找到主函数位置。 主函数定位1. 找到Entry Point. 跟进。 跳到这里 继续跟进。 跳到这里:这里是处理程序的参数和CPU信息初始化等。 继续跟进dufby3r09zexgk。 在dufby3r09zexgk函数中找到3个连续call的汇编位置:找到他们下面的off_4D0030。 跟进off_4D0030查看。 c864jqim4vp6: 跟进c864jqim4vp6。 在c864jqim4vp6找到这个代码块:其中e0ijkhbrz就是主函数。 ok了,到这里就能开始调试了。 程序分析 程序首先让我们输入flag。那我们就需要逆向出这个fl ...
FirmAE
研究原因和工具的优点 Firmadyne模拟覆盖率太低 通过启发式可以解决一些模拟困难 大大提高了模拟率的同时,也提高了工具发现漏洞的能力 研究背景 IoT设备大量使用 许多IoT是接入网络的,这可能对入侵网络带来的新的途径 固件模拟可以在不用获取真实设备的情况下,进行动态调试,并且扩大安全分析面 问题 真实环境与虚拟环境差异性大 不同的IoT有不同的架构 固件依赖于特定的硬件配置 观察通过使用Firmadyne模拟两个漏洞:1. CVE-2014-3936 2. CVE-2017-5521,发现只需要对设备配置做出细小的改变就能成功模拟 实验步骤 调研大量的Firmadyne模拟失败案例 分析出模拟失败主要分为以下5类: 启动相关 网络配置相关 非易失性RAM 内核相关 其他 提出解决方案:通过启发式+仲裁 验证:用已知的漏洞来验证模型的成功率,最后才确定是提高了成功率,并且工具还集成了Fuzz 关键手法将启发式集成形成仲裁模拟 仲裁仿真背后的关键思想是,确保高级行为足以对内部程序执行动态分析(这相对容易做到),而不是查找和修复仿真失败的确切根本原因 ...
DIR815路由器溢出
前言固件下载地址:legacyfiles.us.dlink.com - /DIR-815/REVA/FIRMWARE/,下载1.01版本。 漏洞描述: DIR-815 cgibi中hedwig_cgi函数中处理HTTP 头中 Cookie 字段中 uid 的值时存在栈溢出漏洞 binwalk解包binwalk -Me firmware.bin 解包后结构如下: 固件模拟(系统级)架构定位进入文件系统,查看固件架构: file bosybox 32为mips小端序: 模拟依赖下载进行系统级模拟需要下载mips架构的内核镜像和文件系统:(因为是小端序,所以选择mipsel) 下载地址:Index of /~aurel32/qemu/mipsel (debian.org) debian_squeeze_mipsel_standard.qcow2是文件系统,vmlinux-3.2.0-4-4kc-malta是内核镜像。 在宿主机中使用wget命令下载,随便找一个目录下载 ,只不过这个目录在后面也要同时存放qemu的启 ...