hackgame-2022-wp

0x01 总结

第二次打ctf,4250分:

大概是最后一次参加ctf比赛了,太肝了,每天下班都肝到3点。

这里记录一部分write up。

Read more

Linux内核设计与实现总结(8) —— I/O子系统

I/O子系统

本人觉得I/O子系统是Linux内核中最难的东西,因为它需要兼容横跨物理介质、文件系统、空间位置(网络),为上层提供统一接口,还需要保持高性能,这简直amazing。

I/O子系统的架构图如上图所示。

这里将Linux I/O子系统分为VFS(虚拟文件系统)、块I/O、高速缓存这三个部分总结。

Read more

Linux内核设计与实现总结(3) —— 进程管理与进程调度

进程与线程

Linux内核是不区分线程与进程的,线程只是一种特殊的进程,被视为与其他进程共享地址空间的进程。与windows这种在内核专门提供线程支持的操作系统不一样。

task_struct与thread_info

图片来自biscuitos.github.io

task_struct(进程描述符)描述了一个进程的所有信息,是一个体系无关的结构,位于include/linux/sched.h。它包含进程打开的文件、挂起的信号、进程的状态、进程的pid等。保存在tasks双向循环链表中(见上一节的链表结构体总结),因此可以从一个进程结构体出发,索引到任何其他进程结构体。目前内核中,进程描述符是用slab分配器动态生成的,task_struct有一个void *stack成员变量指向进程的内核栈。

thread_info是体系相关的,位于arch/xxx/include/asm/thread_info.h,它存放了线程上下文,包括是否可以抢占、当前进程是属于哪一种规范的可执行程序等。

早期内核配置中,在X86体系并且CONFIG_THREAD_INFO_IN_TASK没有被时,进程的thread_info存放在进程的内核栈。如果是向下增长的栈,则thread_info在栈顶低地址;向上增长的栈,thread_info还是在低地址,只不过在栈底了。因此,可以通过内核栈的地址快速获得thread_info的地址。

在thread_info中有一个struct task_struct *task变量指向task_struct。后来内核把X86的thread_info结构体中的这个task指针给去掉了(Move thread_info into task_struct),并且将thread_info放到了task_struct中。这个task指针,是为了寄存器在不够多的体系上,可以通过内核栈地址加偏移,找到thread_info,然后快速找到task_struct的。但是X86一直使用的是per_cpu的变量来保存正在使用cpu的进程的进程描述符:

1
DECLARE_PER_CPU(struct task_struct *, current_task);

所以thread_info中的task变量是可有可无的。

在进程调度时,会更新这个变量:

1
this_cpu_write(current_task, next_p);
Read more

Linux内核设计与实现总结(2) —— 内核数据结构

内核数据结构

Linux内核中实现了一些常见的数据结构,而且内核要求代码越高效越好,所以这些数据结构的实现极为优雅!因此,千万不要自己实现山寨的数据结构。

内核的数据结构包括:

  1. 链表(双向循环)
  2. 队列
  3. IDR & IDA
  4. 红黑树

链表

链表头文件

位于include/linux/link.h

Read more

Linux内核设计与实现总结(1) —— qemu内核调试环境搭建(macOS)

宿主机系统

  1. macOS 12.4 (x86)

安装qemu

qemu相比于vmware,简单、轻便,可以直接指定linux内核,再指定一个文件系统,即可调试。硬盘、网络设备可以后加。

首先我尝试了utmapp/UTM,这是个适用于iOS/macOS的虚拟机,基于qemu。但是在指定内核启动镜像bzImage和initramfs后,遇到了问题,一直报错:

1
The bootindex 0 has already been used

搞了一会没搞出来,索性不用UTM了,直接上qemu。

使用homebrew可以直接安装qemu。

1
➜  ~ brew install qemu

目前安装的是7.0.0_2。

安装完成之后验证一下:

1
2
3
4
5
6
7
➜  ~ qemu-system-x86_64 --help
QEMU emulator version 7.0.0
Copyright (c) 2003-2022 Fabrice Bellard and the QEMU Project developers
usage: qemu-system-x86_64 [options] [disk_image]

'disk_image' is a raw hard disk image for IDE hard disk 0
....
Read more

魔改解决超级雕rgb fusion鼠标卡顿问题

前言

仅供学习研究。

上个星期在海鲜市场收了一块技嘉超级雕6800XT,准备用来组黑苹果。

系统是Windows 11,到手之后安装了安装显卡驱动和技嘉rgb控制软件rgb fusion 2.0(B22.0414.1,官网最新版),小屏幕倒是挺好看的,但鼠标滑动总觉得时有点卡顿,用鼠标连续画圈最为明显(眼睛比较敏感)。

大约1秒卡顿一次。如下图所示,第一张图正常,第二张图第一个鼠标位置到第二个鼠标位置滑动距离过长,卡顿:

Read more