天选4Archlinux安装及使用小记

背景 Laptop:华硕天选4锐龙版 CPU:AMD Ryzen 7940H GPU:Radeon 780m Graphics + NVIDIA RTX 4060 Laptop 安装过程主要参考archlinux 简明指南 (icekylin.online) 由于要在win11的D盘切分出来一块空间(好不容易清出来的200G)安装,没办法使用archinstall脚本。(archinstall的分区方案只会分配一整块硬盘,差点把我D盘数据全清了)。 双显卡驱动 仍然按照archlinux 简明指南 (icekylin.online)进行操作。 安装nvidia闭源驱动时出现了各种问题,但是不装闭源驱动又经常卡死,尤其是我的双屏还需要独显输出,于是在timeshift数次之后终于艰难地驯服了双显卡驱动。使用了下面知乎老哥的方案:不安装optimus-manager,仅使用华硕提供的supergfxctl进行显卡切换。猜测optimus-manager使用Xorg进行切换和Wayland一起使用可能会出现卡死等问题,笔者暂且没有能力验证。 华硕天选5Pro使用Win11+ArchLinux双系统 - 知乎 (zhihu.com) sddm改为使用wayland启动(其实没什么意义,而且sddm的wayland支持尚不稳定)。 Kernel mode setting - ArchWiki (archlinux.org) 输入法 只装了个最基础的fcitx5就没管了。 WPS等软件中无法使用输入法: https://wszqkzqk.github.io/2024/03/09/WPS-Fcitx5/ 字体 不知道怎么同时配置中文字体和英文字体,装了教程里的一堆字体之后,暂时摆了。 KDE 由于刚刚更新Plasma6,很多插件,主题还没有更新。(悲) 打算搞一套仿Mac的主题玩。 upd: 使用了Apple-Sonoma-Dark (KDE6的主题更新的还是很快的,给大佬点赞 GTK主题 White-Sur,跟全局主题尽量像一点。 桌面特效 窗口(比如Konsole)的透明度,模糊等配置在这里。 终端 Shell: zsh + zim + powerlevel10k, 常用插件装上 Terminal Emulator: Konsole Konsole好丑,想换。 alt+n会new tab,跟我钟爱的zellij冲突了。看了keyboard shortcut里没有这个快捷键,然后发现是按住alt+某个字母会触发toolbar上以该字母为首字母的功能(New Tab) 。。。索性直接把toolbar关了,反正也没什么用还丑。 zellij不知道为什么不能alt+方向键了。。。好在还能alt+hjkl zellij不能粘贴:config.kdl里修改copy_command为wl-copy NeoVim 下了个LazyVim,被眼花缭乱的功能吓晕,不过感觉可能习惯一下+关一些没用的东西之后会比LunarVim好用。 upd: LunarVim已停止更新 Terminal-Multiplexer zellij 很好用,但是也有一定问题: 快捷键alt+hjkl是切换pane, nvim中shift+hl是切换buffer,ctrl+hjkl是切换split的windows,相当手忙脚乱。并且在用ctrl组合快捷键的时候需要ctrl+g把zellij的快捷键锁起来。 nvim中显示中文(以及其它多字节字符)有问题。提了个issue ...

March 26, 2024 · 1 min · 113 words · JuicyMio

为什么bss上有时会有stdin,stdout,stderr指针

研究了一下bss段上为什么会有stdin,stdout,stderr, 根据经验观察似乎在使用setvbuf时会出现这种情况, 经过控制变量测试, 发现只要setvbuf这三个变量的一个, 就会使该变量出现在bss段中. setvbuf使用了这三个stdio.h中的extern变量 /* Standard streams. */ extern FILE *stdin; /* Standard input stream. */ extern FILE *stdout; /* Standard output stream. */ extern FILE *stderr; /* Standard error output stream. */ /* C89/C99 say they're macros. Make them happy. */ #define stdin stdin #define stdout stdout #define stderr stderr 他们定义在stdio.c中, 不过右边的仍然是extern变量 #include "libioP.h" #include "stdio.h" #undef stdin #undef stdout #undef stderr FILE *stdin = (FILE *) &_IO_2_1_stdin_; FILE *stdout = (FILE *) &_IO_2_1_stdout_; FILE *stderr = (FILE *) &_IO_2_1_stderr_; 他们最初的定义在stdfile.c中 DEF_STDFILE(_IO_2_1_stdin_, 0, 0, _IO_NO_WRITES); DEF_STDFILE(_IO_2_1_stdout_, 1, &_IO_2_1_stdin_, _IO_NO_READS); DEF_STDFILE(_IO_2_1_stderr_, 2, &_IO_2_1_stdout_, _IO_NO_READS+_IO_UNBUFFERED); struct _IO_FILE_plus *_IO_list_all = &_IO_2_1_stderr_; libc_hidden_data_def (_IO_list_all) 因为stdin等三个变量是未初始化的全局变量, 所以他们被分配到bss段. 在执行setvbuf时, 经过两次重定位将libc地址填入其中. 如果不setvbuf, 这三个符号就不会被用到, 也就不会被解析. ...

December 12, 2023 · 1 min · 118 words · JuicyMio

CVE-2023-25139

0x00 背景 TPCTF里和qym师傅研究了两天safehttpd这题(虽然我一直在背英语pre,没干什么活),把整个程序可能的漏洞点翻遍了也没找到突破口的off by null如何触发(实际上是测试过程中出现了重大失误,已经找对了地方却没有测试出漏洞),赛后看wp发现有这样一个CVE: 30068 – (CVE-2023-25139) incorrect printf output for integers with thousands separator and width field (CVE-2023-25139) (sourceware.org) 0x01 分析 先看上面链接中的复现样例: #include <stdio.h> #include <locale.h> int main (void) { if (setlocale (LC_ALL, "")) { printf ("1234567890123:\n"); printf ("%0+ -'13ld:\n", 1234567L); } return 0; } 在有漏洞的Glibc2.37下的输出: 1234567890123: +1,234,567 : 输出的长度是15而不是13,因为两个千位分隔符没有被计入宽度,导致输出时多补了两个空格。 这是一个glibc 2.37里短暂出现就被迅速修复的漏洞:千位分隔符在限制长度的格式化输出时没有被正确计入宽度,导致出现了溢出。 由该commit修复: Account for grouping in printf width (bug 30068) · bminor/glibc@c980549 (github.com) 下面就通过这个修复的commit分析一下这个bug是如何产生的。 其中第266行由 width -= workend - string + prec 改成了 width -= number_length + prec_inc 这里的width变量为补足宽度限制需要添加的字符的宽度。prec和prec_inc的值是相同的,区别在于number_length和workend - string并不等同:(168-182行) int number_length; #ifndef COMPILE_WPRINTF if (use_outdigits && base == 10) number_length = __translated_number_width (_NL_CURRENT_LOCALE, string, workend); else number_length = workend - string; if (group) number_length += iter.separators * strlen (thousands_sep); #else number_length = workend - string; /* All wide separators have length 1. */ if (group && thousands_sep != L'\0') number_length += iter.separators; #endif 在上面代码的后几行可以看到number_length是原本的数字长度加上千位分隔符的长度,而workend-string没有计算千位分隔符的长度,导致了错误的长度计算。 ...

December 11, 2023 · 2 min · 311 words · JuicyMio

WSL2中C/C++开发环境配置

基础 编辑器: LunarVim 基于clangd的代码提示, compile_commands.json由bear生成, 命令是bear -- make tmux管理窗口(目前又改成了zellij, 感觉快捷键更好用一点) 美化 WSL2: 运行在Windows Terminal中, 安装oh my posh, One Half Dark主题 字体: Fira Code Nerd Font (为了显示LunarVim以及终端中各种小图标) Powerlevel10k 效果: 图炸了() 比之前那个运行在CMD里调个窗口大小就闪退, 配色还极其阴间, 显示不出来图标的状态强了不知道多少. 效率提升 lazygit LunarVim中打包的一些插件差不多够用, 懒得折腾新的了 问题 挂代理也连不上各种东西, 经一通检查之后发现 感觉是wsl和steam++一起干的好事…

July 8, 2023 · 1 min · 40 words · JuicyMio

Phoenix

0x00 前言 Windows+WSL2(Ubuntu22.04)下的exploit.education的phoenix虚拟机环境配置, 但不建议使用Windows配置环境, 比Linux多了不必要的麻烦. 0x01 QEMU安装 官网amd的下载包只有Qcow2格式的可用了, 所以只能装一个QEMU. 去QEMU官网下载一个win版的安装包一路默认就可以了, 可以改个安装地址. 0x02 虚拟机安装以及ssh Linux下直接运行压缩包中的boot脚本即可, 但Windows不行, 我找到个大佬博客提供了脚本.创建一个boot.ps1文件, 把下面的代码复制进去改下qemu的路径即可. D:\Program` Files\qemu\qemu-system-x86_64.exe ` -kernel vmlinuz-4.9.0-8-amd64 ` -initrd initrd.img-4.9.0-8-amd64 ` -append "root=/dev/vda1" ` -m 1024M ` -netdev user,id=unet,hostfwd=tcp:127.0.0.1:2222-:22 ` -device virtio-net,netdev=unet ` -drive file=exploit-education-phoenix-amd64.qcow2,if=virtio,format=qcow2,index=0 第一行的路径是qemu的安装路径, 注意空格用`代替. 再用powershell运行一下这个脚本即可, 若提示禁止运行脚本则给一下脚本运行权限即可. 下一步是ssh到Phoenix虚拟机上, 配置脚本中"hostfwd=tcp:127.0.0.1:2222-:22"指定了虚拟机监听本机的127.0.0.1:2222端口, 如果你使用普通虚拟机, 则直接ssh到这个端口即可, 可以ssh -p2222 user@localhost , 用户名和密码都是user, 配置环境到这里就结束了. 但如果你跟我一样使用的是WSL2, 并且没有升级到Win11所以WSL没有固定的ip地址, 那还需要再操作一下. 打开Powershell输入Get-NetIPInterface, 找到vEthernet(WSL), 记下前面的ifIndex, 然后在刚才的脚本前面加上两句. $WSL_ip = (Get-NetIPAddress -InterfaceIndex 76 -AddressFamily Ipv4).IPAddress $WSL_ip += ":2222" Get-NetIPAddress的文档: https://learn.microsoft.com/en-us/powershell/module/nettcpip/get-netipaddress?view=windowsserver2022-ps 把76改成你的vEthernet(WSL)的ifIndex. 再把hostfwd那里的127.0.0.1:2222替换为$WSL_ip即可. 然后你还要在WSL2里再获取这个ip地址, 如果你给WSL2配置过代理, 那应该获取过这个ip, 如果没有, 在你的WSL2的~/.bashrc里加上这句: ...

March 28, 2023 · 1 min · 95 words · JuicyMio