2025-2-26

This commit is contained in:
2025-02-26 09:13:52 +08:00
commit bf50b6c865
54 changed files with 7537 additions and 0 deletions

5
.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
.github/
.deploy_git/
public/
node_modules/
themes/

1
README.md Normal file
View File

@ -0,0 +1 @@
我的个人博客

1165
_config.fluid.yml Normal file

File diff suppressed because it is too large Load Diff

0
_config.landscape.yml Normal file
View File

110
_config.yml Normal file
View File

@ -0,0 +1,110 @@
archive_dir: archives
author: CGH0S7
category_dir: categories
category_map:
code_dir: downloads/code
date_format: YYYY-MM-DD
default_category: uncategorized
default_layout: post
deploy:
branch: main
repo: https://github.com/CGH0S7/cgh0s7.github.io.git
type: git
description: ''
exclude:
external_link:
enable: yes
exclude: ''
field: site
filename_case: 0
future: yes
highlight:
auto_detect: no
hljs: no
line_number: yes
tab_replace: ''
wrap: yes
i18n_dir: :lang
ignore:
include:
index_generator:
order_by: -date
path: ''
per_page: 10
keywords:
language: zh-CN
meta_generator: yes
new_post_name: :title.md
pagination_dir: page
per_page: 10
permalink: :year/:month/:day/:title/
permalink_defaults:
post_asset_folder: no
pretty_urls:
trailing_html: yes
trailing_index: yes
prismjs:
line_number: yes
preprocess: yes
tab_replace: ''
public_dir: public
relative_link: no
render_drafts: no
skip_render:
source_dir: source
subtitle: The Gensokyo the Gods Loved
syntax_highlighter: highlight.js
tag_dir: tags
tag_map:
theme: fluid
time_format: HH:mm:ss
timezone: Asia/Shanghai
title: CGH0S7's Blog
titlecase: no
updated_option: mtime
url: http://blog.hifuu.ink

1
db.json Normal file

File diff suppressed because one or more lines are too long

3345
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

28
package.json Normal file
View File

@ -0,0 +1,28 @@
{
"name": "hexo-site",
"version": "0.0.0",
"private": true,
"scripts": {
"build": "hexo generate",
"clean": "hexo clean",
"deploy": "hexo deploy",
"server": "hexo server"
},
"hexo": {
"version": "7.3.0"
},
"dependencies": {
"hexo": "^7.3.0",
"hexo-deployer-git": "^4.0.0",
"hexo-generator-archive": "^2.0.0",
"hexo-generator-category": "^2.0.0",
"hexo-generator-index": "^3.0.0",
"hexo-generator-tag": "^2.0.0",
"hexo-renderer-ejs": "^2.0.0",
"hexo-renderer-marked": "^6.0.0",
"hexo-renderer-pug": "^3.0.0",
"hexo-renderer-stylus": "^3.0.0",
"hexo-server": "^3.0.0",
"hexo-theme-landscape": "^1.0.0"
}
}

4
scaffolds/draft.md Normal file
View File

@ -0,0 +1,4 @@
---
title: {{ title }}
tags:
---

4
scaffolds/page.md Normal file
View File

@ -0,0 +1,4 @@
---
title: {{ title }}
date: {{ date }}
---

5
scaffolds/post.md Normal file
View File

@ -0,0 +1,5 @@
---
title: {{ title }}
date: {{ date }}
tags:
---

View File

@ -0,0 +1,13 @@
---
title: 12月16-17日工作记录
date: 2023-12-17 22:26:17
tags: [日志]
---
## 12月16-17日
1. 四级考试
2. 自学cudaopenacc了解GPU架构知识
3. 参加超算队启动会
4. 大计和高数期中考试
5. 研究spack使用
6. 学习cuda编程
7. 补作业

View File

@ -0,0 +1,9 @@
---
title: 12月18日工作记录
date: 2023-12-18 21:57:34
tags: [日志]
---
## 12月18日
1. 初步了解opencaeporo尝试在本地docker环境使用gcc完成编译安装目前完成各项依赖安装由于晚上停电计划明天开始编译安装opencaeporo本体并在本地调优;
2. 协助Neko组完成任务;
3. 找出spack存在网络原因无法下载时的手动解决方案.

View File

@ -0,0 +1,8 @@
---
title: 12月19日工作记录
date: 2023-12-19 21:59:47
tags: [日志]
---
## 12月18日
1. 彻底完成opencaeporo安装部署本地和服务器均已安装明天正式开始调优工作;
2. 学习cuda编程.

View File

@ -0,0 +1,14 @@
---
title: 12月20日工作记录
date: 2023-12-20 21:56:42
tags: 日志
---
## 12月20日
OpenCAEPoro 小组(黄**,梁**,程**
1. 阅读代码,开展优化工作,初步使用openacc完成petsc_solver的优化取得一定优化效果
> 优化方向基本确定为OpenMP/OpenACC并行化+cuda移植
2. 赛题环境汇总目前各组工作有序开展CentOS 7符合要求暂未发现更换系统需求

View File

@ -0,0 +1,12 @@
---
title: 12月28日进度报告
date: 2023-12-28 23:22:13
tags: 日志
---
## 12月28日
OpenCAEPoro 小组(黄**,梁**,程**,刘**
1. 各组员继续进行优化工作,部分函数完成cuda移植取得一定优化效果
2. 继续学习openacc及cuda相关知识
3. 搜集多孔介质流动模拟与opencaeporo相关论文资料为proposal做准备

View File

@ -0,0 +1,12 @@
---
title: 12月30-31日进度报告
date: 2023-12-31 00:07:09
tags: 日志
---
## 12月30-31日
OpenCAEPoro 小组(黄**,梁**,程**,刘**
1. 服务器上的Opencaeporo改用nvhpc编译器编译以支持cuda;
2. 收集运行数据用于proposal绘制图表;
3. 继续尝试优化,同时已经查阅收集了一些相关资料以尽量理解相关含义便于工作开展.

View File

@ -0,0 +1,12 @@
---
title: 博客更新记录
date: 2024-11-04 23:18:02
tags: 日志
categories: 更新
---
- 博客主题更新为 `Fluid` 主题,原主题为 `Next`
- 更新了访问地址为 `https://blog.hifuu.ink`
- 新增了 `About` 页面
- 新增了 `友链` 页面
- 完善页面布局

View File

@ -0,0 +1,7 @@
---
title: Welcome to CGH0S7's Blog
date: 2023-12-06 16:33:30
tags: TEST
---
Hello World !

View File

@ -0,0 +1,14 @@
---
title: Gentle Jena
date: 2024-10-30 22:11:14
tags: 音乐
categories: Rearrangement
---
很喜欢的一首曲子
顺便测试一下视频上传
以后随缘更新各种乱七八糟的东西。。
<video controls width="600" height="400">
<source src="https://ik.imagekit.io/7grujzz8i/2024-09-22%2014-05-02.mp4?updatedAt=1738496025016" type="video/mp4" width="50%">
</video>

View File

@ -0,0 +1,15 @@
---
title: Vocaloid调教-晴天(洛天依v4)
date: 2024-11-04 21:52:59
tags: [Vocaloid, 音乐]
categories: [Vocaloid]
---
其实是今年年初的作品想起来可以搬上来这是我调教的第一首v曲。
“故事的小黄花,从出生那年就飘着...”
{% raw %}
<iframe src="//player.bilibili.com/player.html?bvid=BV1xzPteRErF&page=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true" width="100%" height="500"></iframe>
{% endraw %}

View File

@ -0,0 +1,112 @@
---
title: Archlinux的KDE Plasma优先启用Nvidia独立显卡和混合显卡配置指北
date: 2024-11-06 10:02:04
tags: 技术
categories: [技术分享]
---
本文将介绍在 **X11****Wayland** 两种会话下,如何在 KDE Plasma 中优先启用 Nvidia 独立显卡,并提供 I+N 混合显卡的配置方案。**首先,请确保您已经正确安装了 Nvidia 驱动**(如果非 Mainline 内核,请使用 `nvidia-dkms``nvidia-open-dkms` 版本)。
![Nvidia设置示意图](/images/5364bba6d035326e82c53504dd53e7c2454454985.png)
### 适用系统
对于 **CachyOS****EndeavourOS** 等 Arch Linux 衍生版,这些配置大多开箱即用,但对于刚刚入坑 Arch Linux 且使用 KDE 的新手可能会遇到这样的问题:
- Nvidia 驱动已安装,`nvidia-smi` 输出正常
- KDE 系统信息显示仍在使用核显,程序运行时也优先使用核显
- 导致某些应用如浏览器、Blender可能出现卡顿或掉帧现象
这是因为 Arch Linux 的高自定义性,许多功能需要用户手动配置。以下是详细的解决方案。
---
## 配置 X11 下的 Nvidia 显卡优先
可以通过配置 `/etc/X11/xorg.conf` 实现 Nvidia 独显输出。幸运的是Nvidia 提供了自动生成配置文件的工具,用户无需手动编写:
```bash
sudo nvidia-xconfig --prime
```
该命令会根据硬件情况自动生成配置文件。执行后 **重新登录会话** 即可生效(即使是 Wayland 用户也可以执行一次此命令)。
![X11 Nvidia配置](/images/1613f5602b203b38230f19699deb0219454454985.png)
---
## 配置 Wayland 下的 Nvidia 显卡优先
在 Wayland 下优先启用 Nvidia 显卡的步骤如下:
1. 编辑 **GRUB 配置**文件:
打开 `/etc/default/grub` 文件,在 `GRUB_CMDLINE_LINUX_DEFAULT=""` 中添加 `nvidia_drm.modeset=1`
```bash
GRUB_CMDLINE_LINUX_DEFAULT="nvidia_drm.modeset=1"
```
2. 重新生成 grub 配置:
```bash
sudo grub-mkconfig -o /boot/grub/grub.cfg
```
3. 配置 **Plasma 环境**文件:
在 `~/.config/plasma-workspace/env/nvidia.sh` 中写入以下内容:
```bash
#!/bin/bash
export __NV_PRIME_RENDER_OFFLOAD=1
export __GLX_VENDOR_LIBRARY_NAME=nvidia
```
4. 保存并重启电脑,即可生效。
![Wayland Nvidia配置](/images/b2054bbaf6197624d38cc2007d885fd1454454985.png)
---
## I+N 混合显卡方案
如果不希望全局启用独显,可以选择让大部分程序默认使用核显,而少数高性能需求的程序使用独显。这种方法能有效节省功耗,同时将独显资源集中分配给需要的程序(如 Steam 游戏、Blender 等)。缺点是每个程序需要手动配置启动项。
### 配置步骤
1. 打开程序的 `.desktop` 启动文件:
位置可能在 `/usr/share/applications` 或 `~/.local/share/applications` 中。
2. 在 `Exec=` 后添加 `prime-run` 参数。例如:
```text
Exec=prime-run <程序启动命令>
```
![混合显卡配置示意图](/images/71a5357ef4bd808b10429bc2ea46cb6f454454985.png)
### Vim 快捷配置
如果使用 Vim可以使用以下快捷键快速批量替换 `Exec=` 为 `Exec=prime-run`
```vim
v -> G -> :s/Exec=/Exec=prime-run /g Enter -> :wq Enter
```
---
## 让 Plasma 桌面也使用独显
如果希望 Plasma 桌面也通过独显运行,可以修改 Wayland 配置文件并删除第二行:
```bash
#!/bin/bash
export __GLX_VENDOR_LIBRARY_NAME=nvidia
```
这样 Plasma 桌面会通过独显启动,其他程序则默认使用核显。
---
希望以上经验能为有此需求的用户提供参考帮助。

View File

@ -0,0 +1,17 @@
---
title: Archlinux KDE体验优化总结
date: 2025-02-02 18:43:26
tags: [技术分享]
---
打算开一个坑记录这么久以来的Archlinux系统性能和操作体验优化经验
本文章长期更新
------
## 软件优化
## 快捷键设置
##

View File

@ -0,0 +1,81 @@
---
title: 使用Clonezilla备份和克隆系统
date: 2025-02-23 21:40:03
tags: 技术分享
---
![Clonezilla官网](/images/clonezilla.png)
[Clonezilla](https://clonezilla.org/)是一款非常好用的系统迁移工具本文将介绍其基本用法不包含网络迁移及Clonezilla服务器等进阶内容以及在克隆Btrfs磁盘时遇到的问题解法。
---
### **零.事前准备**
- 下载Clonezilla Live镜像ISO制作启动U盘有手就行
- 准备目标存储设备如U盘需要迁移的新硬盘等确保有足够空间建议大于源硬盘已用空间的1.2倍)。
### **一.备份镜像到硬盘Device-to-Image**
这个模式可以将硬盘完整备份为一个镜像文件(可保存到本地硬盘、外置硬盘或网络存储)方便多机部署。注意如果只是将一个硬盘的系统完全克隆到新盘可以跳过此部分。
#### **步骤说明**
2. **启动Clonezilla**
- 插入U盘重启电脑并从U盘启动。
- 选择默认选项语言键盘布局Beginner模式进入Clonezilla的TUI界面。
3. **选择备份模式**
```plaintext
Choose mode: 选择 "device-image"(设备到镜像)
Mount storage media: 选择 "local_dev"(本地存储设备)
```
- 按提示挂载目标存储设备(注意这里选择的是你要存储镜像的设备且文件系统一般不限,如外置硬盘),确认路径(如 `/dev/sdb1`)。
4. **配置备份参数**
- **源硬盘**:选择需要备份的硬盘(如 `/dev/sda`)。
- **镜像存储路径**:指定目标位置(如外置硬盘的挂载目录)。
- **镜像名称**:自定义名称(如 `2025-img-rockylinux-2-21`)。
- **压缩选项**:默认即可,支持并行压缩加速。
- **镜像分割**若目标存储设备为FAT32格式单文件最大4GB选择自动分割。
5. **确认操作**
- 检查提示信息,输入 `y` 开始备份。
- 完成后关机或重启。
6. **镜像还原**和备份非常相似只是选项换成restore to disk顺着指引操作即可。
---
### **二、直接克隆硬盘Device-to-Device**
将源硬盘完整克隆到目标硬盘适合硬盘升级或快速迁移比如笔者最近白嫖了一个三星的2T硬盘直接把原来512G硬盘里的CachyOS无损迁移了进去。
#### **步骤说明**
1. **准备工作**
- 连接目标硬盘需容量≥源硬盘已用空间还原镜像操作也是如此注意Clonezilla支持小分区到大分区迁移不支持大分区到小分区后者出门右转Rsync
- **警告**:目标硬盘数据将被覆盖,操作前如有需要务必备份重要数据!
2. **启动Clonezilla**
- 同上从U盘启动进入Clonezilla界面。
3. **选择克隆模式**
```plaintext
Choose mode: 选择 "device-device"(设备到设备)
```
4. **选择硬盘**
- **母碟硬盘**:选择原始硬盘(如 `/dev/sda`)。
- **目标硬盘**:选择新硬盘(如 `/dev/sdb`)。
5. **克隆选项**
需要进入专家模式才能看到,一般直接新手模式默认即可。
6. **执行克隆**
- 确认提示信息后输入 `y`,等待完成。
- 克隆结束后关机移除旧硬盘并测试新硬盘主要是查看能不能启动进入系统若能进入一般不会有问题而且一般都能进入因为Clonezilla是高精确的块对块克隆
---
### **两种模式对比**
| **模式** | 特点 |
|----------------|---------------------------|
| 备份镜像 | 方便多机部署也可以用于留档|
| 直接克隆 | 换硬盘快速迁移无需恢复过程|
---
### **Btrfs务必注意**
对Btrfs直接进行Clonezilla克隆大概率会碰到一个边界错误这是由于Btrfs本身使用一段时间后碎片化存储导致的你需要执行`sudo btrfs balance start --full-balance /`来进行整理,但是这也算是一个风险操作要确保完整执行不能在执行时意外中断导致文件系统出错,并且在后续克隆时不能使用新手模式要进入专家模式勾选-p1支持所有文件系统但是效率降低的选项来确保顺利克隆未勾选此选项可能导致文件系统无法识别的错误其他步骤参照前文即可。

11
source/_posts/loopers.md Normal file
View File

@ -0,0 +1,11 @@
---
title: 时隔一年再次拿起数位板能画出什么东西
date: 2024-11-04 23:47:54
tags: [板绘, 生活]
---
如题前段时间推完LOOPERS的时候有感而发对着画了张海报
时隔一年,终于又拿起了数位板
![LOOPERS](/images/20241027_222225.png "LOOPERS")

14
source/_posts/mhwi.md Normal file
View File

@ -0,0 +1,14 @@
---
title: 愿指引明路的苍蓝星永远为你闪耀
date: 2024-11-11 21:46:49
tags: 音乐
categories: Rearrangement
---
使用东方Project软音源THFont简单重置的MHWI主题曲
雄关漫道真如铁,而今迈步从头越
{% raw %}
<iframe src="//player.bilibili.com/player.html?bvid=BV1WymmYNEAk&page=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true" width="100%" height="500"></iframe>
{% endraw %}

View File

@ -0,0 +1,420 @@
---
title: 高地特供版CSAPP Bomb Lab全流程攻略
date: 2025-02-24 15:09:11
tags: [技术, 学习, 生活]
---
这篇文章记录高地CSAPP课程Bomblab实验操作流程仅供参考交流答案是随机生成的和学号相关
笔者实验环境为Archlinux/CachyOS使用lldb作为调试器和gdb操作差不多其余用到的工具主要为objdumpstringsneovim/helix和zellij全程开源环境不使用IDA。
## **Phase_1**
### **静态分析**
#### **`strings`扫描**
```bash
strings bomb_linux
```
先用strings寻找可能与`phase_1`相关的字符串或函数名,运气好说不定能直接找到密码毕竟是第一题。
![strings](/images/phase1_strings.png)
- 结果没有明文密码无法直接秒掉第一问,可惜。
- 但是找到`GenerateRandomString`函数可能与密码生成相关。
#### **用`objdump`反汇编**
```bash
objdump -d bomb_linux > bomb.asm
```
搜索`GenerateRandomString``phase_1`函数的汇编代码。
```assembly
401b53 <phase_1>:
401b53: endbr64
401b57: push %rbp
401b58: mov %rsp,%rbp
401b5b: sub $0x20,%rsp
401b5f: mov %rdi,-0x18(%rbp)
401b63: lea -0xb(%rbp),%rax
401b67: mov %rax,%rdi
401b6a: callq 401ac1 <GenerateRandomString> # 调用密码生成函数
401b6f: lea -0xb(%rbp),%rdx # 生成的字符串地址%rbp-0xb存入%rdx即密码存储位置
401b73: mov -0x18(%rbp),%rax
401b77: mov %rdx,%rsi
401b7a: mov %rax,%rdi
401b7d: callq 401c0c <string_compare> # 调用字符串比较函数
401b82: test %eax,%eax
401b84: je 401b8d <phase_1+0x3a>
401b86: callq 401d67 <explode_bomb> # 比较失败则引爆炸弹
```
- `phase_1`调用`GenerateRandomString`生成一个字符串。
- 用户输入的字符串需要与此生成的字符串完全匹配。
---
### **动态调试**
![phase_1](/images/phase1.png)
下面是phase_1求解的完整流程
```lldb
lldb bomb_linux <你的学号后六位>
(lldb) b phase_1 # 在phase_1入口断点
(lldb) run # 从入口开始执行
请输入第1级的密码114514 # 随便输入触发断点
(lldb) b 0x401b6f # 在GenerateRandomString返回后断点
(lldb) continue # 继续执行
(lldb) x/s $rbp - 0xb # 计算字符串地址(-0xb偏移量
0x7fffffffdaf5: "mJHurpQZtY" # 轻松拿下,这里是根据学号伪随机生成的哦
```
将得到的密码保存入bomb_<学号后六位>.txt即可避免后续重复输入。
---
## **Phase_2**
### **静态分析**
这道题目还是比较一目了然的,观察`phase_2`代码不难发现其实构建了一张跳转表:
```assembly
0000000000401b8e <phase_2>:
401b8e: f3 0f 1e fa endbr64
401b92: 55 push %rbp
401b93: 48 89 e5 mov %rsp,%rbp
401b96: 48 83 ec 10 sub $0x10,%rsp
401b9a: 48 89 7d f8 mov %rdi,-0x8(%rbp)
401b9e: bf 10 00 00 00 mov $0x10,%edi
401ba3: e8 05 fb ff ff call 4016ad <GenerateRandomNumber>
401ba8: 48 8b 05 71 6c 00 00 mov 0x6c71(%rip),%rax # 408820 <rand_div>
401baf: 48 83 f8 0f cmp $0xf,%rax
401bb3: 0f 87 16 01 00 00 ja 401ccf <phase_2+0x141>
401bb9: 48 8d 14 85 00 00 00 lea 0x0(,%rax,4),%rdx
401bc0: 00
401bc1: 48 8d 05 4c 4a 00 00 lea 0x4a4c(%rip),%rax # 406614 <_IO_stdin_used+0x614>
401bc8: 8b 04 02 mov (%rdx,%rax,1),%eax
401bcb: 48 98 cltq
401bcd: 48 8d 15 40 4a 00 00 lea 0x4a40(%rip),%rdx # 406614 <_IO_stdin_used+0x614>
401bd4: 48 01 d0 add %rdx,%rax
401bd7: 3e ff e0 notrack jmp *%rax
401bda: 48 8b 45 f8 mov -0x8(%rbp),%rax
401bde: 48 89 c7 mov %rax,%rdi
401be1: e8 f2 00 00 00 call 401cd8 <phase_2_0>
401be6: e9 ea 00 00 00 jmp 401cd5 <phase_2+0x147>
401beb: 48 8b 45 f8 mov -0x8(%rbp),%rax
401bef: 48 89 c7 mov %rax,%rdi
401bf2: e8 8b 01 00 00 call 401d82 <phase_2_1>
401bf7: e9 d9 00 00 00 jmp 401cd5 <phase_2+0x147>
401bfc: 48 8b 45 f8 mov -0x8(%rbp),%rax
401c00: 48 89 c7 mov %rax,%rdi
...
```
这里面需要注意的关键点是rand_div它会决定你的跳转方向而你的学号又决定了它的取值。然后是`GenerateRandomNumber`这个函数的原理需要了解一下,而这个函数将在跳转前后分别调用一次,第一次决定你的跳转方向,第二次则决定了你的密码线索。
---
### **动态调试**
理解原理就没什么难度了,自己找几个断点打好然后关注一下`rand_div`的值就好,观察自己的学号向哪个函数跳转并理解相应函数计算即可,比如我这里向`phase_2_14`跳转:
![phase_2_14](/images/phase_2_14.png)
而除了`phase_2_14`还有其他函数也是非常好理解的,第二题依旧可以轻松拿下。
---
## **Phase_3**
### **静态分析**
和Phase_2一样开局先跳转尽可能防止同学们答案雷同互相帮助bushi
本体其实没有什么好说的,这里我跳转的方向是`Phase_3_5`简要解释一下可供参考:
```assembly
0000000000403001 <phase_3_5>:
403001: f3 0f 1e fa endbr64
403005: 55 push %rbp
403006: 48 89 e5 mov %rsp,%rbp
403009: 48 83 ec 20 sub $0x20,%rsp
40300d: 48 89 7d e8 mov %rdi,-0x18(%rbp)
403011: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%rbp)
403018: c7 45 f8 00 00 00 00 movl $0x0,-0x8(%rbp)
40301f: 48 8d 4d f0 lea -0x10(%rbp),%rcx
403023: 48 8d 55 f4 lea -0xc(%rbp),%rdx
403027: 48 8b 45 e8 mov -0x18(%rbp),%rax
40302b: 48 8d 35 5a 36 00 00 lea 0x365a(%rip),%rsi # 40668c <_IO_stdin_used+0x68c>
403032: 48 89 c7 mov %rax,%rdi
403035: b8 00 00 00 00 mov $0x0,%eax
40303a: e8 51 e1 ff ff call 401190 <__isoc99_sscanf@plt>
40303f: 89 45 f8 mov %eax,-0x8(%rbp)
403042: 83 7d f8 01 cmpl $0x1,-0x8(%rbp)
403046: 7f 05 jg 40304d <phase_3_5+0x4c>
403048: e8 a9 2b 00 00 call 405bf6 <explode_bomb>
40304d: bf 08 00 00 00 mov $0x8,%edi
403052: e8 56 e6 ff ff call 4016ad <GenerateRandomNumber>
403057: 8b 45 f4 mov -0xc(%rbp),%eax
40305a: 48 63 d0 movslq %eax,%rdx
40305d: 48 8b 05 bc 57 00 00 mov 0x57bc(%rip),%rax # 408820 <rand_div>
403064: 48 39 c2 cmp %rax,%rdx
403067: 74 05 je 40306e <phase_3_5+0x6d>
403069: e8 88 2b 00 00 call 405bf6 <explode_bomb>
40306e: bf c8 00 00 00 mov $0xc8,%edi
403073: e8 35 e6 ff ff call 4016ad <GenerateRandomNumber>
403078: 8b 45 f4 mov -0xc(%rbp),%eax
40307b: 83 f8 07 cmp $0x7,%eax
40307e: 0f 87 eb 00 00 00 ja 40316f <phase_3_5+0x16e>
403084: 89 c0 mov %eax,%eax
403086: 48 8d 14 85 00 00 00 lea 0x0(,%rax,4),%rdx
40308d: 00
40308e: 48 8d 05 9f 36 00 00 lea 0x369f(%rip),%rax # 406734 <_IO_stdin_used+0x734>
403095: 8b 04 02 mov (%rdx,%rax,1),%eax
403098: 48 98 cltq
40309a: 48 8d 15 93 36 00 00 lea 0x3693(%rip),%rdx # 406734 <_IO_stdin_used+0x734>
4030a1: 48 01 d0 add %rdx,%rax
4030a4: 3e ff e0 notrack jmp *%rax
4030a7: 48 8b 05 72 57 00 00 mov 0x5772(%rip),%rax # 408820 <rand_div>
4030ae: 89 c2 mov %eax,%edx
4030b0: 8b 45 fc mov -0x4(%rbp),%eax
4030b3: 01 d0 add %edx,%eax
4030b5: 89 45 fc mov %eax,-0x4(%rbp)
4030b8: bf c8 00 00 00 mov $0xc8,%edi
4030bd: e8 eb e5 ff ff call 4016ad <GenerateRandomNumber>
...
403174: 8b 45 f0 mov -0x10(%rbp),%eax
403177: 39 45 fc cmp %eax,-0x4(%rbp) # 注意这里
40317a: 74 05 je 403181 <phase_3_5+0x180>
40317c: e8 75 2a 00 00 call 405bf6 <explode_bomb>
403181: 90 nop
403182: c9 leave
403183: c3 ret
```
看起来一大堆很吓人对不对?实际上确实很吓人。
但是发现其中玄机后其实简单的没边,最终答案就藏在`0x403177`里面,前提是确保这一步前炸弹不爆炸(意识到要爆炸了直接`run`一下重开qwq
---
### **动态调试**
阅读`Phase_3_5`发现这一关其实需要两个输入,并且第一个输入必须是`rand_div`,这里建议通过`si`单步执行监控好`rand_div`值变化,确定正确结果后使用`run`重开正确输入第一个密码后才能进行下一步求解:
```lldb
(lldb) si
Process 13376 stopped
* thread #1, name = 'bomb_linux', stop reason = instruction step into
frame #0: 0x000000000040317a bomb_linux`phase_3_5 + 377
bomb_linux`phase_3_5:
-> 0x40317a <+377>: je 0x403181 ; <+384>
0x40317c <+379>: callq 0x405bf6 ; explode_bomb
0x403181 <+384>: nop
0x403182 <+385>: leave
(lldb) x/wx $rbp-0x4
0x7fffffffdb0c: 0xffffffd7
```
例如这里我可以打印出第二个值结合第一个值得到第三关正确结果。
---
## **Phase_4**
### **静态分析**
本题依旧开局跳转,笔者的跳转方向是`phase_4_01`,如何跳转不再强调关注`rand_div`的值即可下面请D指导解读一下`phase_4_01`的内容:
```assembly
0000000000404895 <phase_4_01>:
; 函数入口,初始化栈帧
404895: f3 0f 1e fa endbr64
404899: 55 push %rbp
40489a: 48 89 e5 mov %rsp,%rbp
40489d: 48 83 ec 70 sub $0x70,%rsp ; 分配栈空间
; 初始化斐波那契数组F(10)~F(24)的十六进制值)
4048a1: 48 89 7d 98 mov %rdi,-0x68(%rbp) ; 保存输入字符串指针
4048a5: c7 45 b0 37 00 00 00 movl $0x37,-0x50(%rbp) ; F(10)=55
4048ac: c7 45 b4 59 00 00 00 movl $0x59,-0x4c(%rbp) ; F(11)=89
4048b3: c7 45 b8 90 00 00 00 movl $0x90,-0x48(%rbp) ; F(12)=144
4048ba: c7 45 bc e9 00 00 00 movl $0xe9,-0x44(%rbp) ; F(13)=233
4048c1: c7 45 c0 79 01 00 00 movl $0x179,-0x40(%rbp) ; F(14)=377
4048c8: c7 45 c4 62 02 00 00 movl $0x262,-0x3c(%rbp) ; F(15)=610
4048cf: c7 45 c8 db 03 00 00 movl $0x3db,-0x38(%rbp) ; F(16)=987
4048d6: c7 45 cc 3d 06 00 00 movl $0x63d,-0x34(%rbp) ; F(17)=1597
4048dd: c7 45 d0 18 0a 00 00 movl $0xa18,-0x30(%rbp) ; F(18)=2584
4048e4: c7 45 d4 55 10 00 00 movl $0x1055,-0x2c(%rbp) ; F(19)=4181
4048eb: c7 45 d8 6d 1a 00 00 movl $0x1a6d,-0x28(%rbp) ; F(20)=6765
4048f2: c7 45 dc c2 2a 00 00 movl $0x2ac2,-0x24(%rbp) ; F(21)=10946
4048f9: c7 45 e0 2f 45 00 00 movl $0x452f,-0x20(%rbp) ; F(22)=17711
404900: c7 45 e4 f1 6f 00 00 movl $0x6ff1,-0x1c(%rbp) ; F(23)=28657
404907: c7 45 e8 20 b5 00 00 movl $0xb520,-0x18(%rbp) ; F(24)=46368
; 读取输入到局部变量(格式为"%d"
40490e: 48 8d 55 ac lea -0x54(%rbp),%rdx ; 输入存储地址
404912: 48 8b 45 98 mov -0x68(%rbp),%rax ; 输入字符串
404916: 48 8d 0d 93 1f 00 00 lea 0x1f93(%rip),%rcx ; 格式字符串"%d"
40491d: 48 89 ce mov %rcx,%rsi
404920: 48 89 c7 mov %rax,%rdi
404923: b8 00 00 00 00 mov $0x0,%eax
404928: e8 63 c8 ff ff call 401190 <__isoc99_sscanf@plt>
; 验证输入有效性必须为1个正数
40492d: 89 45 fc mov %eax,-0x4(%rbp) ; sscanf返回值
404930: 83 7d fc 01 cmpl $0x1,-0x4(%rbp) ; 检查是否读取1个参数
404934: 75 07 jne 40493d <phase_4_01+0xa8> ; 失败则爆炸
404936: 8b 45 ac mov -0x54(%rbp),%eax ; 获取输入值N
404939: 85 c0 test %eax,%eax ; 检查N > 0
40493b: 7f 05 jg 404942 <phase_4_01+0xad>
40493d: e8 b4 12 00 00 call 405bf6 <explode_bomb>
; 检查输入值上限(必须 > 1999
404942: 8b 45 ac mov -0x54(%rbp),%eax
404945: 3d cf 07 00 00 cmp $0x7cf,%eax ; 1999的十六进制
40494a: 7f 05 jg 404951 <phase_4_01+0xbc> ; N > 1999?
40494c: e8 a5 12 00 00 call 405bf6 <explode_bomb>
; 计算 N/2000通过定点数乘法优化
404951: 8b 45 ac mov -0x54(%rbp),%eax ; 输入值N
404954: 48 63 d0 movslq %eax,%rdx ; 符号扩展
404957: 48 69 d2 d3 4d 62 10 imul $0x10624dd3,%rdx,%rdx ; 乘以274877907(≈2^32/2000)
40495e: 48 c1 ea 20 shr $0x20,%rdx ; 取高32位
404962: c1 fa 07 sar $0x7,%edx ; 算术右移7位 → N/2000
404965: c1 f8 1f sar $0x1f,%eax ; 符号位扩展
404968: 89 c1 mov %eax,%ecx
40496a: 89 d0 mov %edx,%eax
40496c: 29 c8 sub %ecx,%eax ; 处理负数情况
40496e: 89 45 ac mov %eax,-0x54(%rbp) ; 保存k = N/2000
; 调用递归函数func4_0(k), 这个函数用于计算斐波那契数列
404971: 8b 45 ac mov -0x54(%rbp),%eax
404974: 89 c7 mov %eax,%edi ; 参数k
404976: e8 ce fd ff ff call 404749 <func4_0> ; 返回值eax=F(k+1)
40497b: 89 45 f8 mov %eax,-0x8(%rbp) ; 保存结果
; 生成随机索引并验证结果
40497e: bf 0f 00 00 00 mov $0xf,%edi ; 参数15
404983: e8 25 cd ff ff call 4016ad <GenerateRandomNumber> ; 生成0~14随机数
404988: 48 8b 05 91 3e 00 00 mov 0x3e91(%rip),%rax # 408820 <rand_div> ; 获取随机索引
40498f: 8b 44 85 b0 mov -0x50(%rbp,%rax,4),%eax ; 取数组[rand_div]的值
404993: 39 45 f8 cmp %eax,-0x8(%rbp) ; 比较func4_0(k) == 数组值?
404996: 74 05 je 40499d <phase_4_01+0x108>
404998: e8 59 12 00 00 call 405bf6 <explode_bomb>
```
所以相对还是很明了的,依旧是关注`rand_div`。
### **动态调试**
先找出`rand_div`在最后判断前的取值比如我下面的0xa
```lldb
(lldb) si
Process 27027 stopped
* thread #1, name = 'bomb_linux', stop reason = instruction step into
frame #0: 0x0000000000401719 bomb_linux`GenerateRandomNumber + 108
bomb_linux`GenerateRandomNumber:
-> 0x401719 <+108>: movq %rax, 0x7100(%rip) ; rand_div
0x401720 <+115>: jmp 0x401723 ; <+118>
0x401722 <+117>: nop
0x401723 <+118>: popq %rbp
(lldb) si
Process 27027 stopped
* thread #1, name = 'bomb_linux', stop reason = instruction step into
frame #0: 0x0000000000401720 bomb_linux`GenerateRandomNumber + 115
bomb_linux`GenerateRandomNumber:
-> 0x401720 <+115>: jmp 0x401723 ; <+118>
0x401722 <+117>: nop
0x401723 <+118>: popq %rbp
0x401724 <+119>: retq
(lldb) x/gx &rand_div
0x00408820: 0x000000000000000a
```
而当 `rand_div = 0xa`(即十进制 **10**)时,输入值 `N` 的计算步骤如下:
- 数组索引 **10** 的值是 **斐波那契数列第 20 项**`F(20) = 6765`)。
- `func4_0(k)` 实际计算的是 **标准斐波那契数列的第 `k+1` 项**(例如,`func4_0(0) = 1 = F(2)` 需要满足:
```c
func4_0(k) = F(k+1) = F(20)
```
解得:
k + 1 = 20 → k = 19
- `k = N / 2000` → `N = 2000 * k = 2000 * 19 = 38000`.
从而得解。
![phase_4](/images/phase_4.png)
---
## **Phase_Impossible**
Impossible
从这道题开始偷懒了掏出ghidra直接看c代码了解一下大概流程再去objdump看汇编
```c
void phase_impossible(char *param_1)
{
int iVar1;
size_t sVar2;
undefined local_118 [256];
long local_18;
long local_10;
local_10 = GetTickCount();
sVar2 = strlen(param_1);
if ((sVar2 < 10) || (sVar2 = strlen(param_1), 0x300 < sVar2)) {
explode_bomb();
}
memset(local_118,0,0x100);
tohex(local_118,param_1);
GenerateRandomNumber(0x400);
iVar1 = check_buf_valid(local_118,rand_div & 0xffffffff);
if (iVar1 == 0) {
puts(&DAT_00406518);
explode_bomb();
}
GenerateRandomNumber(3);
if (rand_div != 2) {
if (2 < rand_div) goto LAB_00401891;
if (rand_div == 0) {
goto_buf_0(local_118);
}
else if (rand_div != 1) goto LAB_00401891;
goto_buf_1(local_118);
}
goto_buf_2(local_118);
LAB_00401891:
explode_bomb();
GenerateRandomNumber(0x400);
if ((long)(int)result != rand_div) {
printf(&DAT_00406560,rand_div,(ulong)result);
explode_bomb();
}
local_18 = GetTickCount();
if (1000 < (ulong)(local_18 - local_10)) {
puts(&DAT_004065a8);
explode_bomb();
}
return;
}
```
最终任务还是很明确的,需要写一段机器码修改`result`的数值,但是注意要能通过`check_buf_valid`检测,并且最后指令必须是跳转到`0x401896`不然就会触发`phase_impossible`中`0x401891`处的`explode_bomb`函数,唯一的难点是跟踪`rand_div`的数值变化,建议使用`register write`来修改`check_buf_valid`的返回值使其强制通过然后监控`rand_div`每一次的数值变化(`x/gx &rand_div`),记录好`rand_div`的结果后开始指令设计,需要满足:
- 指令的异或和为`rand_div`第一次的数值末尾八位以通过检查;
- 修改`result`使其数值等于`rand_div`第三次数值;
- 跳转到`0x401896`避免炸弹;
如果前几问都完成了到这里应该是没有问题的。
---
## **Phase_Secret**
隐藏彩蛋,并非隐藏。汇编里写的非常清楚:
```assembly
0000000000401a8b <phase_secret>:
401a8b: f3 0f 1e fa endbr64
401a8f: 55 push %rbp
401a90: 48 89 e5 mov %rsp,%rbp
401a93: 48 83 ec 10 sub $0x10,%rsp
401a97: 48 89 7d f8 mov %rdi,-0x8(%rbp)
401a9b: 48 8d 05 26 4b 00 00 lea 0x4b26(%rip),%rax # 4065c8 <_IO_stdin_used+0x5c8>
401aa2: 48 89 c7 mov %rax,%rdi
401aa5: e8 76 f6 ff ff call 401120 <puts@plt>
401aaa: 90 nop
401aab: c9 leave
401aac: c3 ret
```
注意到这段指令在原程序中完全没有执行说明是需要用户自己跳转的,也非常简单只需要在`phase_5`中设计指令时加一个要求跳转到`0x401a8b`即可。
完结
![Case Closed](/images/caseclosed.png)

97
source/_posts/overleaf.md Normal file
View File

@ -0,0 +1,97 @@
---
title: Overleaf Toolkit踩坑记录
date: 2024-11-06 09:56:18
tags: 技术
categories: [技术分享]
---
在安装 Overleaf Toolkit 时,表面上看起来很简单只要执行一些脚本就行,但是在某地区网络环境下还是遇到了一些问题和困难,这里记录安装过程中的问题和解决方案,方便以后参考。
具体流程就不赘述了,先将访问[Overleaf Toolkit官方仓库](https://github.com/overleaf/toolkit)将代码clone下来并按照手册执行即可。
## 问题一:无法 Pull Mongo、Redis 和 Sharelatex 镜像
在执行 `bin/up` 脚本启动服务时,发现 Mongo、Redis 和 Sharelatex 镜像无法拉取。主要原因是 Docker 在国内网络环境中,直接访问 Docker Hub 可能会被限制,导致拉取镜像失败。
截至这篇博客编写时网上提供的镜像均无法解决只能使用代理。
### 解决方案:为 Docker 设置代理
通过配置 Docker 的代理,可以解决拉取镜像受限的问题。步骤如下:
1. 创建一个 `systemd` 服务文件,为 Docker 设置代理。
2. 编辑 `/etc/systemd/system/docker.service.d/proxy.conf` 文件,添加以下内容(确保已经设置了代理服务器):
```ini
[Service]
Environment="HTTP_PROXY=http://<your-proxy-server>:<port>"
Environment="HTTPS_PROXY=http://<your-proxy-server>:<port>"
Environment="NO_PROXY=localhost,127.0.0.1"
```
3. 重新加载 `systemd` 配置并重启 Docker
```bash
sudo systemctl daemon-reload
sudo systemctl restart docker
```
4. 重启 Docker 后再次执行 `sudo ./up`,此时应该可以正常拉取 Mongo、Redis 和 Sharelatex 的镜像。等待执行完成即可。
---
## 问题二:外部机器无法访问 Overleaf Web 服务
先确认ipv4和ipv6转发功能没有问题但是依旧出现只能本机访问127.0.0.1其他方式均无法访问甚至nmap扫描端口也发现并未开放sharelatex端口可以通过修改docker-compose配置文件解决。
注意到在默认的 `lib/docker-compose.base.yml` 配置中Overleaf Web 服务的端口映射方式为 `"${OVERLEAF_LISTEN_IP:-127.0.0.1}:${OVERLEAF_PORT:-80}:80"`。
### 解决方案:修改端口映射
在 `docker-compose.base.yml` 文件中,删除 `${OVERLEAF_LISTEN_IP:-127.0.0.1}` 前缀,将 `"${OVERLEAF_LISTEN_IP:-127.0.0.1}:${OVERLEAF_PORT:-80}:80"` 修改为 `"${OVERLEAF_PORT:-80}:80"`。这样可以使 Docker 将 Overleaf 的 Web 服务端口暴露给所有网络接口,从而允许外部机器访问。
修改后的 `docker-compose.base.yml` 端口映射配置如下:
```yaml
---
services:
sharelatex:
restart: always
image: "${IMAGE}"
container_name: sharelatex
volumes:
- "${OVERLEAF_DATA_PATH}:${OVERLEAF_IN_CONTAINER_DATA_PATH}"
ports:
#- "${OVERLEAF_LISTEN_IP:-127.0.0.1}:${OVERLEAF_PORT:-80}:80"
- "${OVERLEAF_PORT:-80}:80"
environment:
GIT_BRIDGE_ENABLED: "${GIT_BRIDGE_ENABLED}"
GIT_BRIDGE_HOST: "git-bridge"
GIT_BRIDGE_PORT: "8000"
REDIS_HOST: "${REDIS_HOST}"
REDIS_PORT: "${REDIS_PORT}"
V1_HISTORY_URL: "http://sharelatex:3100/api"
env_file:
- ../config/variables.env
stop_grace_period: 60s
```
完成修改后,重新启动 Docker 服务:
```bash
sudo ./start
```
现在,外部机器可以通过服务器的 IP 地址加端口 `{Overleaf_Port}` 访问 Overleaf Web 服务。
---
## 总结
这次安装 Overleaf Toolkit 时,主要遇到的两个问题分别是镜像拉取失败和端口映射受限。通过为 Docker 设置代理解决了拉取镜像的问题,而通过修改 `docker-compose.base.yml` 中的端口映射使外部设备可以访问 Overleaf 服务。
可以在这里参考我的本地[Overleaf](https://overleaf.hifuu.ink)效果注意安装完后还需要配置latex包和中文字体。
这篇记录希望能为遇到类似问题的朋友提供帮助。

View File

@ -0,0 +1,19 @@
---
title: 命令行编辑器的优雅新选择
date: 2024-12-13 01:40:27
tags: [技术分享]
---
意外发现Zellij+Helix还挺好用的
避免了vim/neovim的配置流程直接就能上手的轻量命令行开发环境
稍微了解一下二者的快捷键就能舒适码字了
甚至还都是rust出品
即刻尝试一下[Zellij](https://zellij.dev/)和[Helix](https://helix-editor.com/)吧!
// 至于Helix没有文件树显示的方案反正Helix选择文件挺方便的要文件树无非是希望编辑窗口居于窗口中央倒是可以用watch和tree命令来代替还能手动设置哪些文件不用显示hhh
![实际效果](/images/zellij-helix.jpg)

View File

@ -0,0 +1,9 @@
---
title: 原来我还有个博客
date: 2024-06-03 00:19:55
tags: 日志
---
2025-02-25
最近整理了一下缓存部署起来方便多了,有空就写点东西记录一下吧~

View File

@ -0,0 +1,34 @@
---
title: 梦开始的地方
date: 2023-12-06 22:53:35
tags: 日志
---
不知不觉已经高中毕业快半年了现在在NUDT的生活还算适应吧交到了一些很有趣的朋友并且在技术方面取得了一定突破很期待明年的asc2024呢今天看到华科一位学长的博客突然想起我还没好好搭建过自己的Blog于是心血来潮搞了下我的Github Pages。
今后会在这里更新记录自己的生活,学习,工作,以及一些想法,希望能坚持下来吧。
> P.S.最近我都经历了些什么:
>
> 1. 时长21天军训认识了一群很可爱的班长尤其是负责我们5班6班的英子初步和队里的同学了解;
> 2. 学习了一些C++基础,在洛谷上刷了不少算法题;
> 3. ACM招新赛被薄纱差一题进入校队;
> 4. 对算法竞赛感到疑惑尝试学习Flutter和操作系统开阔视野;
> 5. 入坑战地,爽爽爽;
> 6. 被一位巨强的学长发掘加入NUDT超算队;
> 7. 面临三个考试周,熬过去就是胜利;
虽然天天早八满课很不爽但是平时还是可以学习自己想学的技术周末也可以打游戏感觉还行吧我还是相信NUDT既来之则安之。
这里,毕竟是我梦开始的地方。
> 胸怀祖国,团结协作,志在高峰,奋勇拼搏!
今天是2023年12月6日加油
------------------------
修改一下,有的话还是不适合明说哦
5YK75a2p5a2Q5Lus77yM5b+r6YCD5ZWK77yB77yB77yBCg==

17
source/about/index.md Normal file
View File

@ -0,0 +1,17 @@
---
title: About
date: 2024-11-04 22:46:12
layout: about
---
白茅铺高地玄院第N任非菌群主🐳Linux六年牢用户🐧
爱好编程绘画编曲Vocaloid调教Blender建模等😇
截至目前最喜欢的歌手是宇多田光❤️
联系方式:
- Email: <c_gh0s7@nudt.edu.cn>
- Github: <https://github.com/CGH0S7>

Binary file not shown.

After

Width:  |  Height:  |  Size: 724 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 369 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 641 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 826 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

BIN
source/images/amd.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
source/images/asc.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 211 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 913 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 783 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 908 KiB

BIN
source/images/phase1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 492 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

BIN
source/images/phase_4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 MiB

1922
yarn.lock Normal file

File diff suppressed because it is too large Load Diff