2025-2-26
5
.gitignore
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
.github/
|
||||
.deploy_git/
|
||||
public/
|
||||
node_modules/
|
||||
themes/
|
||||
1165
_config.fluid.yml
Normal file
0
_config.landscape.yml
Normal file
110
_config.yml
Normal 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
|
||||
3345
package-lock.json
generated
Normal file
28
package.json
Normal 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
@ -0,0 +1,4 @@
|
||||
---
|
||||
title: {{ title }}
|
||||
tags:
|
||||
---
|
||||
4
scaffolds/page.md
Normal file
@ -0,0 +1,4 @@
|
||||
---
|
||||
title: {{ title }}
|
||||
date: {{ date }}
|
||||
---
|
||||
5
scaffolds/post.md
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
title: {{ title }}
|
||||
date: {{ date }}
|
||||
tags:
|
||||
---
|
||||
13
source/_posts/12月16-17日工作记录.md
Normal file
@ -0,0 +1,13 @@
|
||||
---
|
||||
title: 12月16-17日工作记录
|
||||
date: 2023-12-17 22:26:17
|
||||
tags: [日志]
|
||||
---
|
||||
## 12月16-17日
|
||||
1. 四级考试
|
||||
2. 自学cuda,openacc,了解GPU架构知识
|
||||
3. 参加超算队启动会
|
||||
4. 大计和高数期中考试
|
||||
5. 研究spack使用
|
||||
6. 学习cuda编程
|
||||
7. 补作业
|
||||
9
source/_posts/12月18日工作记录.md
Normal 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存在网络原因无法下载时的手动解决方案.
|
||||
8
source/_posts/12月19日工作记录.md
Normal file
@ -0,0 +1,8 @@
|
||||
---
|
||||
title: 12月19日工作记录
|
||||
date: 2023-12-19 21:59:47
|
||||
tags: [日志]
|
||||
---
|
||||
## 12月18日
|
||||
1. 彻底完成opencaeporo安装部署,本地和服务器均已安装,明天正式开始调优工作;
|
||||
2. 学习cuda编程.
|
||||
14
source/_posts/12月20日工作记录.md
Normal 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符合要求暂未发现更换系统需求
|
||||
12
source/_posts/12月28日进度报告.md
Normal 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做准备
|
||||
12
source/_posts/12月31日进度报告.md
Normal 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. 继续尝试优化,同时已经查阅收集了一些相关资料以尽量理解相关含义便于工作开展.
|
||||
12
source/_posts/BlogUpdate.md
Normal file
@ -0,0 +1,12 @@
|
||||
---
|
||||
title: 博客更新记录
|
||||
date: 2024-11-04 23:18:02
|
||||
tags: 日志
|
||||
categories: 更新
|
||||
---
|
||||
|
||||
- 博客主题更新为 `Fluid` 主题,原主题为 `Next`
|
||||
- 更新了访问地址为 `https://blog.hifuu.ink`
|
||||
- 新增了 `About` 页面
|
||||
- 新增了 `友链` 页面
|
||||
- 完善页面布局
|
||||
7
source/_posts/CGH0S7-s-Blog.md
Normal file
@ -0,0 +1,7 @@
|
||||
---
|
||||
title: Welcome to CGH0S7's Blog
|
||||
date: 2023-12-06 16:33:30
|
||||
tags: TEST
|
||||
---
|
||||
|
||||
Hello World !
|
||||
14
source/_posts/GentleJena.md
Normal 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>
|
||||
15
source/_posts/Vocaloid调教-晴天.md
Normal 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 %}
|
||||
|
||||
112
source/_posts/arch-nvidia.md
Normal 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` 版本)。
|
||||
|
||||

|
||||
|
||||
### 适用系统
|
||||
|
||||
对于 **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 用户也可以执行一次此命令)。
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
## 配置 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. 保存并重启电脑,即可生效。
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
## I+N 混合显卡方案
|
||||
|
||||
如果不希望全局启用独显,可以选择让大部分程序默认使用核显,而少数高性能需求的程序使用独显。这种方法能有效节省功耗,同时将独显资源集中分配给需要的程序(如 Steam 游戏、Blender 等)。缺点是每个程序需要手动配置启动项。
|
||||
|
||||
### 配置步骤
|
||||
|
||||
1. 打开程序的 `.desktop` 启动文件:
|
||||
|
||||
位置可能在 `/usr/share/applications` 或 `~/.local/share/applications` 中。
|
||||
|
||||
2. 在 `Exec=` 后添加 `prime-run` 参数。例如:
|
||||
|
||||
```text
|
||||
Exec=prime-run <程序启动命令>
|
||||
```
|
||||
|
||||

|
||||
|
||||
### 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 桌面会通过独显启动,其他程序则默认使用核显。
|
||||
|
||||
---
|
||||
|
||||
希望以上经验能为有此需求的用户提供参考帮助。
|
||||
17
source/_posts/archlinux-optimization.md
Normal file
@ -0,0 +1,17 @@
|
||||
---
|
||||
title: Archlinux KDE体验优化总结
|
||||
date: 2025-02-02 18:43:26
|
||||
tags: [技术分享]
|
||||
---
|
||||
|
||||
打算开一个坑记录这么久以来的Archlinux系统性能和操作体验优化经验
|
||||
|
||||
本文章长期更新
|
||||
|
||||
------
|
||||
|
||||
## 软件优化
|
||||
|
||||
## 快捷键设置
|
||||
|
||||
##
|
||||
81
source/_posts/clonezilla.md
Normal file
@ -0,0 +1,81 @@
|
||||
---
|
||||
title: 使用Clonezilla备份和克隆系统
|
||||
date: 2025-02-23 21:40:03
|
||||
tags: 技术分享
|
||||
---
|
||||

|
||||
[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
@ -0,0 +1,11 @@
|
||||
---
|
||||
title: 时隔一年再次拿起数位板能画出什么东西
|
||||
date: 2024-11-04 23:47:54
|
||||
tags: [板绘, 生活]
|
||||
---
|
||||
|
||||
如题,前段时间推完LOOPERS的时候有感而发对着画了张海报
|
||||
|
||||
时隔一年,终于又拿起了数位板
|
||||
|
||||

|
||||
14
source/_posts/mhwi.md
Normal 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 %}
|
||||
|
||||
420
source/_posts/nudtbomblab.md
Normal file
@ -0,0 +1,420 @@
|
||||
---
|
||||
title: 高地特供版CSAPP Bomb Lab全流程攻略
|
||||
date: 2025-02-24 15:09:11
|
||||
tags: [技术, 学习, 生活]
|
||||
---
|
||||
|
||||
这篇文章记录高地CSAPP课程Bomblab实验操作流程,仅供参考交流(答案是随机生成的和学号相关)。
|
||||
|
||||
笔者实验环境为Archlinux/CachyOS,使用lldb作为调试器(和gdb操作差不多),其余用到的工具主要为objdump,strings,neovim/helix和zellij,全程开源环境不使用IDA。
|
||||
|
||||
## **Phase_1**
|
||||
|
||||
### **静态分析**
|
||||
|
||||
#### **`strings`扫描**
|
||||
```bash
|
||||
strings bomb_linux
|
||||
```
|
||||
先用strings寻找可能与`phase_1`相关的字符串或函数名,运气好说不定能直接找到密码毕竟是第一题。
|
||||

|
||||
- 结果没有明文密码无法直接秒掉第一问,可惜。
|
||||
- 但是找到`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求解的完整流程:
|
||||
```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`还有其他函数也是非常好理解的,第二题依旧可以轻松拿下。
|
||||
|
||||
---
|
||||
## **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_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`即可。
|
||||
|
||||
完结
|
||||

|
||||
97
source/_posts/overleaf.md
Normal 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包和中文字体。
|
||||
|
||||
这篇记录希望能为遇到类似问题的朋友提供帮助。
|
||||
19
source/_posts/zellij-helix.md
Normal 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
|
||||
|
||||

|
||||
9
source/_posts/原来我还有个博客.md
Normal file
@ -0,0 +1,9 @@
|
||||
---
|
||||
title: 原来我还有个博客
|
||||
date: 2024-06-03 00:19:55
|
||||
tags: 日志
|
||||
---
|
||||
|
||||
2025-02-25
|
||||
|
||||
最近整理了一下缓存部署起来方便多了,有空就写点东西记录一下吧~
|
||||
34
source/_posts/梦开始的地方.md
Normal 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
@ -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>
|
||||
BIN
source/images/1613f5602b203b38230f19699deb0219454454985.png
Normal file
|
After Width: | Height: | Size: 724 KiB |
BIN
source/images/1730728153314.png
Normal file
|
After Width: | Height: | Size: 369 KiB |
BIN
source/images/20241027_222225.png
Normal file
|
After Width: | Height: | Size: 1.2 MiB |
BIN
source/images/5364bba6d035326e82c53504dd53e7c2454454985.png
Normal file
|
After Width: | Height: | Size: 641 KiB |
BIN
source/images/71a5357ef4bd808b10429bc2ea46cb6f454454985.png
Normal file
|
After Width: | Height: | Size: 826 KiB |
BIN
source/images/Written-By-Human-Not-By-AI-Badge-white@2x.png
Normal file
|
After Width: | Height: | Size: 4.3 KiB |
BIN
source/images/amd.webp
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
source/images/archlinux-logo.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
source/images/asc-events.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
source/images/asc.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
source/images/b2054bbaf6197624d38cc2007d885fd1454454985.png
Normal file
|
After Width: | Height: | Size: 1.2 MiB |
BIN
source/images/built_on_the_kde_platform.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
source/images/caseclosed.png
Normal file
|
After Width: | Height: | Size: 211 KiB |
BIN
source/images/clonezilla.png
Normal file
|
After Width: | Height: | Size: 913 KiB |
BIN
source/images/mhwilds4050.jpg
Normal file
|
After Width: | Height: | Size: 783 KiB |
BIN
source/images/mhwilds780M.jpg
Normal file
|
After Width: | Height: | Size: 908 KiB |
BIN
source/images/phase1.png
Normal file
|
After Width: | Height: | Size: 492 KiB |
BIN
source/images/phase1_strings.png
Normal file
|
After Width: | Height: | Size: 84 KiB |
BIN
source/images/phase_2_14.png
Normal file
|
After Width: | Height: | Size: 1.0 MiB |
BIN
source/images/phase_4.png
Normal file
|
After Width: | Height: | Size: 1.0 MiB |
BIN
source/images/zellij-helix.jpg
Normal file
|
After Width: | Height: | Size: 4.3 MiB |