题目基于 Kotlin/Native 编译,利用UTF-16字符串特性与jvm heap内存布局,通过构造伪对象泄露libc地址并FSOP获取shell。
-
L3HCTF 2025 - heack_revenge
利用
game
函数中的pop rbp
劫持rbp指向堆,构造tcache链分配chunk 0写入ROP链,通过leave; ret
实现堆上ROP拿shell。 -
L3HCTF 2025 - heack
利用栈溢出配合任意地址写跳转至含
%lu
的printf泄露libc,通过爆破4位构造ROP链执行system("/bin/sh")
。 -
D^3CTF 2025 - d3cgi
利用 FastCGI 中 CVE-2025-23016 的整数溢出,通过精确堆风水与函数指针覆盖实现控制流劫持,最终使用裸 FastCGI 请求打通远程并获取 shell。
-
内核加载seccomp:syscall_nr赋给了X寄存器?
最近 dbgbgtf 在编写ceccomp的代码,为了做和内核一样的bpf检查,他研究了内核对于
seccomp
系统调用传入的结构体做的检查。在检查过程中,他发现原本指令中的LD|W|ABS
被内核替换成了LDX|W|ABS
,而这是从seccomp_data
中加载nr
等关键数据结构的指令。 难道syscall_nr其实在内核中一直是加载到X寄存器中,而非A寄存器中? -
京麒CTF 2025 - OldWine
通过修改栈上
[rbp]
为rbp+0x10
,使call read@plt
时rsp
指向可控区域,从而劫持返回地址泄露libc,最终利用ROP链调用execveat
实现利用。 -
ACTF2025 - only_read
通过栈溢出控制
rbp
到bss,伪造write
符号并利用dl_resolve
泄露libc,最终执行execl
获取shell。 -
初探Linux内核调试
这学期有操作系统实验课,第一课就是要求在Linux内核中实现一个系统调用,显示学号。 由于系统调用不能通过加内核模块来实现,因此必须要拉取内核源码并编译。 我想着正好我没有做过内核题,也没有配环境,于是决定借此机会配置一个可调试的内核。 正好遇到能源比赛的题中发现当
write
的size很大时,写的字节数是0x800的倍数, 而非对齐到内存页边界上,直接启动内核源码调试分析!最后发现... -
逆向操作系统实验课的rust评测程序
我们操作系统实验课的配套任务有一个专门的评测程序来判断是否通过, 就像oj一样。然而,他是在本地评测的,测完需要我们复制结果到平台上, 整个程序是用rust写的,不仅需要权限,而且报错也很抽象,让我用得很恼火。
file
一看,竟然没剥符号!直接逆向启动,还原处理逻辑,手写注册机实现任意题目 token输出... -
从 Vim 到 NeoVim:感知不强
Vim原来的功能固然很强大,但是总有人说,现在是时候把Vim换成新时代的NeoVim了。话虽如此,但是要想把NeoVim配得和我现在用的Vim一样丝滑,就需要花大量的时间调配置。但当我全部配完后,却发现好像和之前配的vim差别并不大...