天问之路 - 学习笔记&学习周报。内容包括但不限于C++ STL、编译原理、LLVM IR Pass代码优化、CSAPP Lab、uCore操作系统等等。
这里将定期记录着 一些与Sakura
师傅以及一群小伙伴共同学习的内容与进度。从 Sakura 师傅的天问之路毕业后,这里将定期记录着本人接下来的学习历程,叠加起来算是从大一年下半学期开始。
该周报大概每隔半个月 push 一次至 github 上。本周报已自本人本科毕业之日停止更新,希望这一份将近贯穿了我整个本科生涯阶段的学习经历能够激励后来的同学们。
主要任务:STL
主要任务:编译原理
主要任务:LLVM IR Pass 代码优化
主要任务:AFL_LLVM_mode源码分析
主要任务:CSAPP
主要任务:uCore Lab (第15-18周期末复习)
从第20周开始,所有涉及的资料以及分析等等均在个人博客上发布。
JSPromise type confusion学习
CodeQL学习、寒假实习面试
试用了一段时间,发现日报模式可能不太适合我,因此切回周报模式。
接下来3-5周有点摸,主要是学校课业压力有点大,时间太碎片化了。。。
最主要还是完成学校 N 份报告 + 调研 + 视频作业 + 期中考试复习(都是时间吞噬者)。。。
HNU算法设计课程复习 + 算法设计期中考试 + 课程报告(1/2)
学习某某软件(for android) 的 n day exploit 利用
编译 v8 for debug 时只去除 abort in
V8_Fatal
会有坑,DCHECK没去除干净,会引发 SIGSEV T_T。。。
试着对某些漏洞补丁,通过 Regress / POC 来构造 exp。
不过大多数都构造不出来 T_T,在原地踏步。正所谓看答案一看就懂,做题一做就废。
时间还是太短,积累的还是不够。
技术提升遇到瓶颈。与教练聊了一下,明确了自己当前存在的问题,对接下来学习的重点有了一点大概的方向。
问题:钻的不够深、探的不够广,时间不太充裕,且学校课程/活动使可用时间进一步碎片化。
买了一本《计算机网络》,准备先开坑用 C++ 实现一个自己的 WebServer。只读别人的代码没有什么收获,还是边写边学效果会更好一点。
WebServer 这个任务将长期进行下去,打持久战 QwQ.
这周干的比较杂,主要是因为时间太碎片化了。
WebServer 部分
研究了一下 WSL 如何支持 i386 架构程序的运行,并水了一篇博客。
研究 JS 引擎 v8 的 IR 图各个符号的用途。
上课摸鱼水《计算机网络》,看了大概几十页。
帮一个学长写了个脚本,用以判断特定域名是 A 类型还是CNAME类型,同时判断该域名是否已过期。
期中考试周结束,接下来的时间或许可以多一点点。
计算机网络,学习到第四章网络层 IPv4部分。前三章 文摘 笔记已上传至blog。
上课摸鱼学计网,下课回去整笔记。计网笔记整理相当相当耗时间,可能是因为内容实在太多太细了。
计网目前已经看完了大约45%,预计一个月内可以粗略看完(即选择性忽略一些目前用不到的内容)并且整理完所有笔记,预计。XD
Wireshark实验还没做,这个可以以后慢慢来。
WebServer-1.0版本完结(CommitID:6473f5 - github)。1.0版本的 技术文档 笔记已上传至blog.
epoll 多并发
争取在接下来一周内,完成 epoll 相关多并发的学习,整一个 WebServer-1.1 & 笔记出来,尽量结束掉网络编程该部分的学习,开始整新花样。
这周一直在肝 WebServer-1.1。WebServer-1.1 在原先 1.0 版本的基础上大量重构了代码,相对于旧版本来说,新版本主要更新了以下内容:
时间不太够,因此笔记还没写,还有一些bug还没修,多线程多进程调试整的人都要秃了。。。。
WebServer-1.1到目前位置还没有彻底完成,但这个任务从下周开始先暂时挂起(因为要把大块的时间留给更有意义的事情),等到了时间较为碎片的期末周再回来继续完善。
继续开发 AST-Fuzz - print & analyze + 测试套件
AST-Fuzz - type system & analyze
AST-Fuzz - 扩展类型系统
2021.6.19-2021.6.29 HNU 期末周,复习+考试
HNU 期末周, 复习 && 考试
AST-Fuzz - 完善类型系统 + 测试套件 + 零碎 mutate
最近写了 N 多 security bug,还是太菜了,裂开......
还是快乐实习
AST-fuzz v1.0 封版 50%
整了2.5个月,大火花和巨轮都聊出来了,真不容易......
接下来趁着实习期间难得可以摸到 iMac,好好学一手 MacOS。
快乐实习 plus
AST-fuzz v1.0 封版100%
起飞
HNU 夏季实训(4/4)
学习 Trapfuzz 的思路,理解其代码,并与教练一起搭建起一个 fuzz 环境,跑出一个 adobe 空指针漏洞。
修复 IR fuzz 中关于 Python 深拷贝浅拷贝的一个巨坑,该巨坑让我们丢失了一个 crash 样本(简直痛心)
Python 函数默认参数千万别是可变对象。
学习 TrapFuzz 中 Linux 部分相关的内容,包括 gdb 脚本以及 gdb patch 的方式。
gdb python 接口:https://sourceware.org/gdb/onlinedocs/gdb/Python.html#Python
对 IR fuzz 添加构造畸形 unicode 字符串功能
这里有两种方式构造畸形 unicode 字符串,一种是直接在代码中放上已经构造好的畸形unicode,但这样会使得 IR fuzz 在处理 string 时容易产生错误。
再一种就是生成诸如 '\xXX' 这样的字符。这种字符将在 JS 代码层面展示的很好,而具体的字符串将在 adobe 解析所构造的 JS 代码时动态产生 unicode 字符。
理了理关于 CS 架构程序的 fuzz 思路。
突然发现很久没有写博客了。以后除了研究比较大块的内容以外,其他的一点点笔记或思路就直接记录在 learn list 里。
不然一小点笔记就开一篇新博文感觉有点浪费(逃)
整体上分为两部分,分别是
对于第一部分,
对于第二部分:根据 API 的关联性,构建不同的 binding code 以及各类 native API 之间的关联性,并划分等价类。之后的变异就基于等价类来变异,这样可以降低无关类型的输入,大幅度降低输入空间。
如果不想啃论文可以直接看看这个简约版 - 白泽带你读论文 | Favocado - 知乎
简单瞄了几种 hook 技术,只是看了看没写代码
inline hook 有点有趣,想找个机会研究一下,可惜最近有点忙。
打算看看 fuzz 的 结构感知,试着写写 CTF 菜单题的 fuzz 模板
接上面,使用 protobuf 搭配 AFL++ (qemu mode & QASAN)做了个简易 CTF fuzz。
因为只是抱着研究学习的目的来做它,所以实际上用起来可能会比较难用(笑)
报了一个 Debug 模式下才会触发的 SQLite UAF,被谷歌毙了(哭泣)。
简单读了读 Coming : a Tool for Mining Change Pattern Instances from Git Commits 论文。这篇论文大体上介绍了一个从 Git 仓库历史提交信息中获取指定代码模式信息的工具。
它可以:
在课程上花费的时间有亿点点多,而且这周状态也不太好,自我检讨一下。
Kernel pwn CTF 入门,配环境踩坑配了两天;同时也在阅读 Linux Device Drivers 这本书。
接上面,Kernel Pwn CTF 简单入了个小门,写了点记录但还没写完,还差一点 ROP 利用,先不传了。
这周摸了,没怎么学技术,在写一堆红色材料,写不完了......
生活就像是操作系统,总会有事情会抢占掉当前运行的进程。
之前报的一个 facebook OOB read vulnerability 准备发 bounty 了。 虽然不多,但毕竟是第一笔 bug bounty,感觉相当不错。
完善了剩下的 Kernel Pwn CTF 入门笔记 - 传送门
继续写红色材料......
简单练了几题算法题
阅读一个有趣的论文 FUZZIFICATION: Anti-Fuzzing Techniques
三方面来降低 fuzz 效率
speedbump:
首先使用给定 testcase 来识别 cold path(正常执行很少或几乎不访问的路径),并在 code path 中插入 delay 语句以较大幅度提高程序运行时间
注:大部分情况下,普通用户几乎很少会进入 cold path,但 fuzz 就是为了探测 cold path 中的 bug,因此会经常进入。
插入 delay 语句后与先前定义的执行开销进行对比。如果低于预定开销则继续注入 delay 语句,高于则减少注入的 delay 语句
抗分析:为了防止被简单的 patch 掉,这里使用 CSmith 生成动态算术运算代码,而不是常规的 sleep。
同时为了防止被 deadcode elimination 优化掉,这里还修改 CSmith 以生成具有数据依赖和原始代码依赖的代码,具体一点就是涉及到了全局变量的修改。
branchtrap:
antihybrid:
使用特定模板引入隐式数据流依赖,提高数据流污点分析的开销与难度
例如简单的 int 赋值操作,硬是要拿个循环跑。
插入大量假符号以触发符号执行中的路径爆炸
例如将 if 条件判断中的简单判断语句,替换成两个操作数进行 CRC 校验后的值的比较语句,额外引入了 CRC 校验代码,即大量假符号
缺点:容易被攻击者使用代码模式检测方式检测出来,因为模板是不变的
这里有个别人整理的总结可以简单看看(比我这里写的详细不少) - 《fuzzification》论文阅读 - CSDN
准备校级评优材料
将 IR-Fuzz 融合进 AFL,同时也融合进 AST-fuzz 中以提高 fuzz 质量
最近新报的一个漏洞被 facebook 毙了,可惜。不过最早报的那个漏洞流程快走完了,快乐。
重启 WebServer,几乎修复所有已知错误,并完善了连接爆满的错误处理,完善了日志输出的方式。
就差最后一个 bug 还没调通:一个多进程x多线程的条件竞争漏洞,怎么调也调不出来,有点难顶。
WebServer 最后一个 bug 终于调通了,并非条件竞争漏洞。
珍爱生命,请对每个创建文件描述符的地方使用 O_CLOEXEC
至此,WebServer 彻底结项。
阅读了 MemFix: Static Analysis-Based Repair of Memory Deallocation Errors for C 论文,感觉有之前大二寒假实习中,学习流敏感指针分析的味道了......
同时也尝试复现并跑通上面这篇论文里的所有测试与实验。
阅读论文 Low-Tech Steganography for Covert Operations,主要讲解了一个使用低级隐写技术(即无需任何高速计算机就可完成的隐写技术)来巧妙隐藏一些秘密文本。
这个就不写笔记了,论文很简单,读起来非常快。
阅读论文 AddressSanitizer: A Fast Address Sanity Checker 论文,了解了早期 Asan 技术的相关设计方式。
写了一个 fuzz crash 分类工具,思路是通过 ptrace 将 crash 时的栈帧 hash 成一条哈希值,相同哈希值的 crash 被分为同一类 crash(ptrace version src)
该思路源于 trapfuzz。
阅读 Address Sanitizer LLVM 3.1 最早期的源代码,笔记上传至博客上。
将一个新的 IR-Fuzz 融合进 ast-fuzz,同时修复一些遗留bug。
进军 CS144 计算机网络实验,共Lab0- Lab7 八个实验,开始给自己充充电。
本周已完成 Lab0、Lab1。
报了一堆不知道fb认不认的洞上去,坐等消息。
CS144 计网实验 Lab2 - Lab3
Lab4已经跑通全部测试样例,就差对真实网络TCP请求的调试。
漏洞被毙了,噩耗。不过又尝试开始新的挖洞方向。
HNU 期中考试周(1/2)
CS144 计网实验 Lab4(TCP实现组装)、Lab5(网络接口实现)、Lab6 (IP路由实现)、Lab7
至此,CS144 计网实验彻底结项。
IR-Fuzz 启航
HNU 期中考试周(2/2)
syzkaller 入门使用
阅读论文 SHARD: Fine-Grained Kernel Specialization with Context-Aware Hardening
重新实现了一个 Crash 分类工具,基于 gdb 和 trap-fuzz 原理 - CrashUniquer。
修补 fuzz bug,调试语义
最近期中周,课程作业有亿点点多....
阅读论文 VScape: Assessing and Escaping Virtual Call Protections
阅读论文SoFi: Reflection-Augmented Fuzzing for JavaScript Engines
简单看了看 上下文敏感的 AFL++ 插桩技术
粗略阅读 Linux-2.6.24 源码中关于共享内存、信号量的实现
VulDeeLocator: A Deep Learning-based Fine-grained Vulnerability Detector
在 Windows VMware 上配置了一个 MacOS
真不容易......
去深圳打 CCF CCSP 国赛,陪跑。
可惜了......
准备两项考试
密码学课程设计
密码学真有意思。
学习 MacOS 的 Mach IPC
刷 pwn college
做了其他细碎的事情
继续阅读网上的博客和 *OS internal 学习 mach IPC。
课程设计/课程报告
刷了点 pwn college ,学到 ROP 了
带 JIT 的 yan85 可真有趣。
元旦快乐!
复盘 RWCTF 中的 Who Move My Block 以及 QLaas。学习使用 Codeql 对 nbd 进行审计。
IMF 实验抽空结束掉了,准备复现 SyzGen 的实验,又安装了一个 MacOS 10.15 的虚拟机。
1T 固态就这么快被各个虚拟机给吃完了......
完成 RWCTF 中的 FLAG 题的复盘。
完成 RWCTF hso 题的笔记编写
开始做 Syzgen 实验的复现。复现到一半发现 Windows 机器下 VMware MacOS 不能网络调试另一台 VMWare MacOS,真是太折腾了......
找学姐借了一台 macbook pro 远程 teamviewer 控制来做实验......
协助做 Fuzzing 论文的整理
完成 SyzGen 实验的复现
周报实在水不下去了,这里简单记录一下 xcode 编译出的驱动不能在 VM 上跑
这个的踩坑解决过程:
初始时,kextload 时提示 kext start fail(result: 0x5)
,查看 log 时发现在 kextutil 报错前有些语句:
2022-02-18 06:35:53.512950-0800 0x250 Default 0x0 0 0 kernel.development: (47E46FA4-9B3F-38FA-9600-4F71D76491E3) <compose failure [UUID]>)
除此之外没有 hook_start(自定义 kext 的名称为 hook
,其 start 函数为 hook_start) 函数中 print 出的 [hook_start] start kext
这种信息,因此初步认为 kext 在执行 start 前就挂了。
一系列踩坑暂且不表,包括但不限于重新装了一台 10.15.4 版本的 MacOS 等等。
后来 lldb 直接调试 XNU 中的 OSKext::load
方法,发现其实 hook_start 已经执行了,printf 函数也跑了,但是 log 就是没有正常的输出,包括 dmesg 里也没有信息,这就奇了怪了。
之后我在 kext start 里增加了个循环,循环调用 printf 50次,之后再跑一次。这下才知道,原来之前说的那个报错 <compose failure [UUID]>
就是对应于输出的日志,只是可能因为其他缘故所以不能正常输出;
然后在 dmesg 里也能看到输入的日志了,这应该是因为日志相关的缓存机制吧。
太折腾了......
调试时还看到 angr 的有趣之处:给 angr 加装个 lldb proxy,这样 angr 就可以通过这个 lldb proxy 访问 kernel 中的任何内存数据,等价于把整个 kernel 做个 memory snapshot 再打包给 angr 做符号执行。这个设计非常的有意思。
简单看了下 unicorefuzz。
仔细研究了一下 e9patch 的论文,了解其内部机理,顺便写了下笔记留待以后分享。
项目需求,机器学习入门。
读了一下 HFL 和 MoonShine 的论文,了解了一下它们在 kernel fuzz 中是如何解决某一种问题的方案。
Codegate CTF 摸了会,对着题目学习如何编写 syzkaller template
有道题 forgotten
很有意思:
kernel driver 为当前进程创建 vma 时,往
vma->vm_private_data
里塞了一个指向内核对象 entry 的指针。 当进程 fork 一份时,新进程也会完整复制这个 vma,使得有两个进程持有了指向 entry 的指针。 随后当新进程死亡时,entry 对象被释放。但是另一个进程仍然持有指向 entry 的指针,造成 kernel uaf。
syzkaller 源码阅读。主要关注 syzkaller 如何解析 syzlang,以及其变异策略(一步一步来嘛)
阅读论文 NTFUZZ: Enabling Type-Aware Kernel Fuzzing on Windows with Static Binary Analysis
这篇论文提出了一种方法:从那些 documented 的 API 函数,通过静态分析技术一步步往下推断出 undocumented 的 syscall API 参数类型,并对其进行 fuzz。
里面涉及的一些关于静态分析的东西还是有点模糊,不太能看懂。
阅读论文 Scalable Fuzzing of Program Binaries with E9AFL
。
e9afl 是一个可对无符号二进制程序插桩实现覆盖率反馈的工具,插桩后的程序可以直接用于 AFL 中进行 fuzz。相对于其他针对纯二进制文件进行 fuzz 的方法,它的优势在于插桩后的 overhead 还能保证在较低水平,同时还保证较高的精度。
修复了一下 github page 无法更新的缘故,原来是自己上传的 md 中 yaml 格式出现了问题,导致 github 部署时解析错误。
这就使得我的博客处于薛定谔的状态,更了,但没完全更.....
修复了先前复现 SyzGen 实验时没完全跑起来的覆盖率检测,被提供的文档给坑了。
Facebook CVE++
尝试通过 SyzGen 测试一些驱动,看看带有 breakpoint coverage 和不带有时的 fuzz,其效率相差的如何。
测试的时候跑出了某驱动的一个空指针漏洞。(没想到还真能在复现时跑出漏洞.....)
效率相差大概是将近 10x 左右,而且随着覆盖率的加大,带有 breakpoint coverage 的 syzkaller 执行速度会越来越慢。
10x 算低的了,这还是因为 trace 的是单个驱动的覆盖率。
整理了一下周报,将一些较为大块的笔记挪到博客上了,使得周报更简洁一点。
求助了学长,完成 NTFuzz 论文的阅读,理解了其中静态分析的大部分内容。
简单看了看 IOKit UserClient 接口逆向,为下周的逆向工作做准备。
继续 syzkaller 源码阅读,编写笔记梳理整个逻辑流程。
目前已经完成 syz-extract、syz-sysgen 的源码笔记编写。
syz-manager、 syz-fuzzer 以及 syz-executor 由于内容较多,联系紧密,因此其笔记编写不能在短时间内完成,只能慢慢利用碎片时间来磨。
看了点 afl-net,学习一下它的基本用法与实现原理
做了一篇 e9patch + e9AFL 的论文分享
尝试进军 stanford cs346 课程,学习数据库管理系统的实现(1/4)
cs346 貌似已经在 2015 年(将近7年前)便停止了授课,但是这个代码还是值得好好写写的。
复习期中考试,接下来这几周为期中考试周。
刷刷算法题
期中考试(1/2)
把信安国赛的项目整个逻辑都理清楚了,发现思路越来越接近参考的论文了....
写了一份报名书,这就是文书工作了。
用 syzgen 跑跑开源驱动,不过由于开源驱动数量过于少,因此跑出来的效果不太好评估。
期中考试(2/2) + 课程实验等
尝试研究如何解决在 MacOS panic 时获取 panic log,简单探讨了一下,有几种方式可以试试
读了一下 Modern C++ Tutorial。太久没有学新东西会让我感到一点焦虑,原地踏步的样子可不好受 :(
接下来这五个月共22周会开始准备保研相关的事宜,因此周报里有趣的内容就有点少了。再加上课程与课设会进一步挤占自己的空闲时间,很多有意思的代码都可能得往后挪挪。
related work 加了很多东西进去。想写好 related work 也不是一件容易的事情......
SyzGen 努力挣扎了一下,还是没解决收集不到 trace 的问题,不知道是不是因为收集环境的问题。
花了点时间解决掉几个课设:
写一个 Linux 驱动来收集 execve 的 log,增强审计功能。其核心思路是使用 kprobes hook 掉 sys_execve,然后收集当前用户权限等上下文信息,打包做成一个 log 信息发给守护进程中转存到磁盘里。
写了一个数据库系统的前端,使用 vue 框架
写了 SQL 注入攻击课设的网页前端,也是用 vue 完成。
vue 真有意思。
别说了,还是课设
这学期课设总感觉是最多最难的。
SyzGen 跑了一些对比实验。
tmux 真好用,解决了 SSH 断开后进程终止的烦恼。
刷了一些算法题
计算机设计大赛省一到手,上推国赛了
没想到这还真能拿奖.....
简单记录一下跑论文实验时遇到的坑点......SyzGen 需要换一个 VM 版本来跑对比试验,因为 10.15.7 版本中的 kext 并非 fat binary,但是论文工具是针对 arm 的,故最终换了一个 11.5.2 版本的 VM,重新开跑试验。
坑1:SyzGen 只支持 intel kext,不支持 fat binary。
解决方法:使用 lipo xxx -thin x86_64 -output xxx_64
将 intel 架构的 kext 解压出来。
有意思的是,解压出来的 intel kext 竟然在内核中的布局和二进制一致。
坑2:通过调试 11.5.2 MacOS 发现 kextstat 中显示的驱动所占空间大小,竟然会小于实际装载的驱动大小。
解决方法:可以通过 kmutil inspect --show-fileset-entries
来查看驱动各个段的装载位置,把判断 kextstat length 那块代码 fix 掉就可以继续工作。
坑3:SyzGen 在分析 11.5.2 MacOS 上的 UserClient function table,分析出来的模板结构竟然大批量倒退,换句话说 infer_type 后的模板结构还没有 default 的模板好。
解决方法:这个因为时间关系还真解决不了(捂脸),只能通过肉眼搭配 diaphora 来人工比对 10.15.7 与 11.5.2 之间 kext 的变动,之后选用那些在 10.15.7 上分析生成且接口与 11.5.2 变动不大的模板来做 fuzz。
肉眼 bindiff 真的很累,而且眼睛都花了。
参加 HNU 学代会
尝试给论文补一点 background。
该周报大概每隔半个月 push 一次至 github 上。
小学期开始(1/2),开始有课程作业要做了......
还在刷洛谷的基础题单(还是学了些有趣的算法 + 数据结构)。
正在用 panda-re 搭建另一个项目的 linux 环境。
接上条,搭建环境过程中发现有个 progress
命令很有趣,可以自动查找当前系统中运行的 coreutils 命令(用户可手动指定其他命令)并监测其进度 - github,代码量共 1.2 k。
coreutils 命令包含 cp、mv、dd、tar、gzip/gunzip、cat 等。
显示的内容包含 pid、进程名称、当前操作文件、当前处理到的进度、总进度大小、速度和剩余时间等等。
花了点时间读了一下源码,简单了解一下内部原理:
通过遍历/proc
来获取到目标进程的 pid,并遍历 /proc/<pid>/fd
保存目标进程所打开的最多 512 个文件描述符。保存的这些文件描述符必须链接至其他文件(readlink),否则将会在遍历时被忽略掉,例如像这样:
$ sudo ls -al /proc/64/fd
lrwx------ 1 kiprey kiprey 0 6月 26 10:50 0 -> /dev/tty2
lrwx------ 1 kiprey kiprey 0 6月 26 10:50 1 -> /dev/tty2
lr-x------ 1 kiprey kiprey 0 6月 26 10:49 12 -> /usr/share/zsh/functions/Completion.zwc
lr-x------ 1 kiprey kiprey 0 6月 26 10:49 14 -> /usr/share/zsh/functions/Completion/Base.zwc
接下来,遍历 /proc/<pid>/fdinfo/<fd>
来获取这些所保存文件描述符的 fdinfo。
fdinfo 中主要有几种信息,这里只感兴趣 pos
和 flags
,分别是文件指针偏移量以及当前文件打开权限。
其中 flags 用于参数筛选,除此之外没有任何用处。
$ cat /proc/221371/fdinfo/10
pos: 0
flags: 02104002
mnt_id: 1955
tty-index: 4
在遍历完这些 fdinfo 后,每个目标进程都只保存下 size 最大的那个 fd
。
这里的 size,指的是当前所遍历到 fd 的目标文件大小(通过 ioctl BLKGETSIZE64 获取)。
等待一秒钟,之后再循环遍历一次 fdinfo。之后可以根据两次遍历相同 fd 的 fdinfo,其 pos 量的增加大小和两次 fdinfo 的时间戳间隔,来计算出大致吞吐量。
过程大致如上所示,简单总结一下关键的几个点:
pid 和 进程名,均可通过 /proc
获取
将进程中 size 最大的 fd 视为当前操作的文件,并根据 readlink 获取到具体的文件名。
总大小根据当前所操作文件的 size 来决定;
当前进度根据 fdinfo 中的 pos 来获取;
吞吐量根据间隔时间 pos 量的改变来计算出。
HNU 小学期(2/2)
夏令营投递陆陆续续过了几个院校初筛,但也收到了拒信。下周开始就是夏令营高峰期了,这两周在准备面试和专业课。今年的保研形式相对于之前几年会更加严峻,也不知自己能去成哪所院校读研,只能尽人事听天命。
配置 windows fuzzer 环境,研究了一下 Intel-PT & Intel EPT,把 Intel-PT 特性部署在 VM 中。
Intel-PT 是 Intel CPU 的一种硬件特性,如果希望部署的 VM 可以使用 Intel-PT 的话,当前主机的 Intel CPU 必须是 Ice Lake 微架构(可以用 cpuz / cpuid 来查看),这种架构通常只在 Intel 至强系列上才有。
若需要在 KVM 中启用 Intel-PT,则除了 CPU 硬件条件满足上述的 IceLake 以外,还需要做一些设置:
rmmod kvm-intel
modprobe kvm-intel pt_mode=1
之后启 KVM 时:
qemu-system-x86_64 --enable-kvm -cpu host ...
两周夏令营高峰期的面试,一个字,寄。
只拿到了中科大网安和人大信院的学硕 offer,南大计算机学硕和北大软微专硕的 waiting list。
顺手写了篇 1w+ 字的经验贴,等 9 月 28 日保研填报系统彻底结束后再贴到博客上。
预推免再战,球球了想上岸 (捂脸)
尝试修复 SyzGen 在 MacOS 11.5.2 上跑的 bug
答:解决不了,原因是 angr 在进行符号执行时,无法触发先前设置在 mem_read 上的断点,因此不会调用回调函数来记录读取的位置,没法为后续的分析做准备。
已经在发 issue 问 SyzGen 了,希望能有点收获。
刷刷洛谷为预推免做准备。
尝试一周速通 Rust
一个有趣的问题:学语言时在自己不需要的时候学好呢,还是在需要的时候学更好?这是先前留在 TODO 里的问题。
本人的做法:需要的时候学。因为确实要用上了(捂脸)。
速通 rust,看这些就够了:《Rust 程序设计语言》 + Rust语言圣经(Rust Course)
发现 Rust 有着我非常看重的几点特性:
绝对的速度。其运行速度和 C/C++ 有的一比。
较高的安全性。Rust 设置了较多编译时的检查机制,若存在不安全操作,则将在编译阶段报错。
静态语言。各个变量的类型在编写时就确定好,这样可以防止执行到一半报错某某类型不匹配,同时代码补全也会和 C++ 一样好用。
这里点名 Python,每次执行到一半才告诉我某某类型不匹配 ...
无需内存管理。这点与 C++ 相比简直省心不少,每次写 C++ 代码。代码规模一大,内存管理就容易出问题。
执行时无需 rust 环境。和 C++ 一样,编译一次后可以直接在其他平台上运行,无需配置运行时环境(点名 Python 和 Java)。
拥有丰富的库。例如网络请求库,正则表达式库,Windows 图形库等丰富的第三方库。
高频迭代。一门好的语言就需要实时更新迭代。
编译与运行无需处理各种问题。(这里点名 Java 的各种包依赖!)
其中不妨看得出,1、3、5 是 C++ 中所拥有的特性,4、6 是 Python / Java 等语言的特性。
不过 rust 学下去发现这语法确实有忆点点晦涩,得多写写代码才能理解。
SyzGen 找到 bug 了。起因是 SyzGen 大量将一个特定内核地址硬编码进代码中,而这个内核地址在不同的 MacOS 版本上是不同的,因此需要全局替换修改。接下来跑了一些 SyzGen 的实验。
HNU 小学期 (1/2)
混了场 CTF Zone & MapleCTF(捂脸,还是技术不太够,没啥贡献)
趁着忙里偷闲,
探究了 Thread 与 Canary 之间的关系 - 浅析 Linux 程序的 Canary 机制 - Kiprey's Blog。
尝试学习 C++ 的 name demangling 规则,但是这方面的材料太少了,没找到什么有用的信息。
demangling 规则不在 C++ 规范中,是由各个编译器自己决定实现的,通常使用的是 itanium-ABI。这个 ABI 提供了一个用于 demangle 的函数:
namespace abi {
extern "C" char* __cxa_demangle (const char* mangled_name,
char* buf,
size_t* n,
int* status);
}
该函数的实现不在 glibc 中,而是在 binutils
中内部的libiberty\cp-demangle.c
文件里,我们所熟悉的 c++filt
程序就是在 binutils 中实现。最核心的 demangle 函数为:
/* Internal implementation for the demangler. If MANGLED is a g++ v3 ABI
mangled name, return strings in repeated callback giving the demangled
name. OPTIONS is the usual libiberty demangler options. On success,
this returns 1. On failure, returns 0. */
static int
d_demangle_callback (const char *mangled, int options,
demangle_callbackref callback, void *opaque)
该函数执行了 demangle 的完整过程,但 demangle 过程确实过于复杂,看不太懂,暂且搁置(捂脸)。
复盘 Defcon 30 Quals 中的 constricted
题。该题需要 pwn 掉一个使用 rust 编写的 JS 引擎 - Defcon-30-Quals rust-pwn constricted 复盘笔记 - Kiprey's Blog。
之前在 TODO 里留下了一个疑问:学一门新的编程语言是用到再学,还是先学再用呢?根据我这段时间对 rust 的使用,我更偏向于用到再学,因为在动手实践中学习会把基础打得更加的牢固。
smuggler's cove
,这是一道 JIT Spray in Lua JIT 的题。本周主要在刷刷算法题,提交了几个学校的报名信息,为预推免做准备。
本周收到了上交 G.O.S.S.I.P 安全研究组的实习邀请,开心! :)
只是目前本人已经在其他地方实习了,只能忍痛拒绝 T_T。
win fuzzer 的 manager 实现彻底结束,合并进 master 分支。
通过了梦校的初筛,下周要开始准备复试了。
准备梦校预推免。
机考寄!以前刷的各种题目各种洛谷完全没用,机考拼的真就是基础......
这次预推免机考难度比夏令营大了一倍,那些用夏令营分数抵掉的同学简直太香了呜呜。
上岸!拿到梦校初步录取通知了,保研长跑接近尾声。
科研任务 + 保研结束。
去处:清华大学网络科学与网络空间研究院,网络空间安全硕士
给自己点个小赞。不过保完研后的生活将会非常忙碌了......
研究了一手 Dirty Cred,写了篇笔记放博客上。(后面还得补一个 PPT......)
科研任务跑实验,跑出来了一个 win10 21h2 上的 crash(可惜不是我的)
启航 fuzzer
得想想后面要怎么安排了,接下来也要开始整毕设了,到时候问问导师看看。
这周摸了
fuzz (2/3)
读了一下 libAFL 论文,学习了 libAFL 的整体架构与自定义使用。
libAFL 把整个 Fuzzer 各个部件全部打散,使得每一个部件都可以自定义,提供了一个通用模糊测试框架。(论文还上了 CCS2022 好像是,足以证明 AFLpp 团队的强大,膜拜一手)
探索目前的科研方向,打算先用 libAFL 实现一个轻量级框架玩玩。
仔细想想这周好像也没干什么。
__libc_start_main
中就直接触发空指针崩溃了。本周摸了,主要在挖洞 + 写 vulhub 爬虫 + 党员材料 + 优秀班集体材料收集。
本周的挖洞收益比我预期的高了不少。
回顾了一下周报,感觉自己好像近几周没有干什么有意思的事情,得警惕温水煮青蛙。
把fuzzing框架的一个功能点做完了,目前接下来是想看看能不能从这个功能点开始,对fuzzer内部的状态进行观测与修改。
本周突发40度高烧,休息了几天,各位在科研/工作/学习之余也要多注意身体。
目前的生活已经趋于稳定,整体上精力一直在这三个内容来回流转:
后续如果暂无有趣的内容,则先不再添加重复内容至周报上。水周报水的心虚(捂脸
12.26 补充:因为上面这些内容无论是哪一个都无法把更深的细节写在周报上(保密需求),因此这里的周报确实是不知道要写些什么了。
期待接下来的生活能有新变化,来让我继续在周报上添加有趣的内容。 :)
12.30 这周准备本科毕设开题,没想到目前做的这个工作大家看的比我想象的还更重一点,因此还需要我更加努力去完成这一切(挥拳)。
同时自己也在犹豫这个周报要怎么继续写下去。一方面我希望自己可以有个持续输出的地方,但另一方面有些重复性或保密性质的内容确实不太好写上去。所以后面可能采取跳周的方式来实现?
本周是科研最后一周(不是说这周过了就不继续推进科研了,笑),本周过后不再开组会不交周报,感动。
一周三个组会真的有点顶不住.......
这周和学长准备了一下清华的学期总结,讲讲 windows 内核漏洞挖掘综述,纯靠学长带带了。
这周还和 r3 一起打了打 Realworld CTF,不过因为这两天刚好撞车学期总结没法集中精力(以及技术太菜了.....,捂脸)
后面在考虑要分配更多的时间到 CTF 上面打打。虽然自己不太想搞堆风水(没有精力去持续跟进 glibc 堆机制),但是很多题目都会设计一些非常有意思的考点,因此还是想把 CTF 这个短板补上,从其他地方去获取更多的正反馈。(顺带继续维护个人博客)
恨不得自己一天有 48h,笑。
本周在 ubuntu 22.04 下的中文环境中偶遇 wget(v1.20.3) 触发 segment fault。通过对二进制文件进行逆向,发现是一个在特殊语言环境下会触发的整数溢出漏洞,当下载时间超过 10min 时即可在生成终端下载用时文字时稳定触发。可惜 ubuntu 配备的 wget 版本太老了,这个洞早被报了修了.....
不过正是因为该漏洞需要特殊的语言环境,这个漏洞顽强存活了很长一段时间(2015.12-2019.12,漏洞提交者是中国人)。一个有趣的问题:开发者是否可以利用不同语言环境下字符串长度的不同这个特性,来提交可能带有漏洞的代码,并在未来某个时间点通过修改 语言文件特定语句的翻译 来达到在特定地区启用漏洞的效果呢?
感兴趣的师傅也可以调试这个洞看看,还挺有意思。复现条件:
--limit-rate
来限制下载速度)协助写了 short paper 的一部分内容。
idek CTF,独立解出一道基于 C++20 协程机制的竞争 pwn 题(共4解)
C++20 这个协程机制确实有点意思,不过对于普通开发者而言还是有点难用,目前只适合让库开发者来使用。
年后这三周总体上围绕着过年各种亲戚拜访、酒席等年后活动,同时穿插着 fuzzer 的编写和科研方向的探索,以及现在准备回校。
fuzzer 这块走了个非常大的弯路,不过幸好最终还是回到正轨上了。
顺便研究了一手 ossfuzz 打造的 fuzz-introspector,它的作用机理是对 llvm-cov 所生成出来的 trace 进行分析,以便于安全人员推断 fuzz 瓶颈。
开搞毕设,毕设感觉搞不完了,要毕不了业了......
真毕不了业了哇,毕设兜兜转转回到了起点,现在又要准备中期答辩了,真没内容讲了。
最近有个有意思的需求。我有几台机器 (<10) 需要管理(需要能操作 GUI / SSH 连接),现在的条件是:
机器位于不同的地理位置。
各个机器所使用的操作系统不同,win/linux/macos 都有。
考虑到清华校园网拥有公网 IP,因此可以考虑把我这台跟随我许久的 windows 机器丢寝室里暴露至公网,当作中转机器(如有需要的话)。而我其他机器无法拥有公网 IP,因此只能走反向代理(或其他操作)。
这里还有一个问题就是暴露至公网会有很大风险,可能最后我就只暴露一个端口出来。
现在想的是能不能异地组网,先 mark 一下这篇文章 - 私有虚拟网络常见问题 - Wener,等后面再来两台新机器了就正式想想这个事情。
注意到文章里说 Tinc 代码只有 3k,想找个时间读读代码hh,感觉会很有意思。
其实向日葵就很不错,但是免费版没法走 ssh,而且向日葵我用来控制 linux 还有 bug 起不来就很气。之前也折腾过针对 linux 走 RDP 协议,但是一连就闪退,非常怪。
报了一堆洞,dupe 了一堆,不知道今年能不能收到 Google 的 Swag。
最后的这段时间还是在坚持毕设、搞搞横向。
之前那个多机器控制的问题,最后思来想去选择了 RustDesk 这一个开源远控程序,它有一些优点比较适合个人使用:
最后还是没有选择它,因为它功能点没有 ToDesk多,而且也存在一些不太稳定的地方。
也尝试用过一段时间的 ToDesk,但 ToDesk 的显示是通过截取输出至真实显示器的显示数据来完成的,倘若没有接入外部显示器将无法被控制。(这时候就得去下单一个显卡欺骗器了)
所以最后用的是 zerotier 异地组网 + sakurafrp 搭建 moon 中继来做,使用体验还是很不错的。
由于后面研究生的内容不太方便更新,感觉这份学习周报也是时候该结束更新了。回看这一段整整贯穿了我大学四年的学习周报,内心有着诸多感慨。从最初的入学萌新到现在保研去清华的研究僧菜鸡,这一路上经历了非常多有意思的事情,认识了很多有趣的人。
这一份周报我将在六月中旬(本科毕业之日)设为 archive 不再更新,后面要是遇到了更多有意思的内容我就会更新在自己的博客上。
各位,江湖再见!希望大家都能在安全领域混出一个明堂出来~
Stay passionate about the world and everything forever!