本次比赛中UKFC获得第10名的成绩
PWN
heack
buf 能覆盖 v4,能控制写的位置,可以绕过 canary 检测

这边是返回地址是 0x18e2

返回时,rdi 是 libc 地址,只需要跳到一个 printf 的地方就行

跳到 0x191a 就能泄露地址,但是因为第四位存在随机性,只需要爆破一下就行,概率只需要十六分之一,概率很大。拿到 libc 之后直接打 rop 就行

|
|
heack_Rev

这串奇怪的数字是直接写死在代码中的,利用错位可以找到 0x5d 也就是"pop rbp",配合 off by null 可以在不 leak 的前提下修改 rbp 的值到 heap 上,由于管理 heap 地址的结构放在 game 函数的栈帧上,所以修改 rbp 之后就可以通过输出 hp attack pwoer 的值来 leak 得到 heap 上的数据,即 libc_base,需要事先布置堆风水,之后将 rop 链写到 heap 上从 game 函数返回
|
|
library
这个题目貌似是一道 Kotlin 写的堆题,审计十分困难,基本上只能通过动调的方式解决
并且题目环境在本地,docker,和靶机之间貌似也有一些微妙的区别
其中 1 对应 add ,2 对应 free ,3 对应 edit
其中 edit 较为重要,进行多次填充固定内容不同 page 的 edit 可以使用 search 搜寻到
可以得出 edit 函数的 page 是类似一个偏移,并且操作是一个类似于堆的位置,这里写了 0x114514 可以找到

而上文对 page 进行修改时发现 page 并未有严格的边界检查,形成类似堆溢出
下面的内容,即上图表示一个 c 一个 i 的内容是堆块名字,即 chunithm ,只不过是双字节长而已,可以往那个内容写东西就会留下一个红色的地址,借此通过输出可以得到 libc ,需要 utf8 变 unicode,上图其实写到了 maimaima 的位置
对于堆的开发还不止这些,对于覆盖堆上写着自己内容的地址一旦被修改会导致执行流被破坏,进一步发现这些地址类似于虚表一样的,程序在执行中会根据这些地址的偏移寻找应该执行什么,可以劫持,尤其是对应在主函数之间的地址,事实上,远端不知道怎么回事,堆的地址相对于 libc 不变,我们可以写堆地址并找个地方伪造一下就能执行想执行的函数

然后我们需要劫持执行流到堆这里,布置 gadget ,这时候我们需要执行的就是 wp 的 magic gadget,通过适配 gadget 进行堆布局,进而执行 rop 流
|
|
Reverse
TemporalParadox

出题人在特定时间得到一个请求,现在要找到这个请求,格式如下
|
|
盐值固定,后面几个值一开始通过伪随机算法得出,初始值和时间戳有关,fun1 对整个字符串进行 md5 加密,fun2 转字符串,最后输出得值就是前面计算出的 r,a,b,x,y
猜测最后给出比较得值就是要求得请求的 md5 值,要爆破 2025-07-09 00:00:00 — 2025-07-09 17:07:31
|
|
重写逻辑把每个时间的字符串都保存下来
|
|
然后 md5 比较
|
|
最后把这个字符串 sha1 加密就可以了
easyvm
关键函数在 sub_140001C45

在输入的地方有一个 func 函数,用来储存,后面 vm 循环和最后密文 check 的地方都调用了这个函数

这个循环里面就是 vm
密文
|
|
输入 11223344556677881122334455667788 找到解释器,在异或,加减,左右移处下访问断点 trace 执行流,这里贴一部分结果
|
|
根据 trace 还原出的加密逻辑
|
|
魔改的 tea 类,解密逻辑&exp(最后 flag 层内和层间都需要逆序)
|
|
ez_Android
tauri 框架,但是代码不在 html 里 搜字符串定位到 greet,直接抄出来解密
|
|
终焉之门
其实是着色器逆向,代码已经给了
|
|
写出脚本还原逻辑
|
|
打印出来结果如下:
|
|
密文:
|
|
最后还原每一个的逻辑
|
|
最后补上 x0 大写转小写即可
Snake
一堆 int3 直接 Scyllahide 过掉,不断调试跟到游戏主要函数 sub_4FBAC0 这里 nop 掉反调试跳转

下面是游戏逻辑,思路是: 1:nop 掉位移逻辑

2:nop 掉判定加分的逻辑

运行拿到 flag 即可

Crypto
math_problem
先根据 hint1 求出 r 来,而对于 hint2,我们对其使用二项式定理展开,得到
$$ hint2 \equiv 1+3kn+ \frac{9k(k-1)}{2}n^2 \pmod{n^3} $$移项后除以 n,得到
$$ B=\frac{hint2-1}{n}=3k+\frac{9k(k-1)}{2}n+k'n^2 $$我们再对 B 模 n,得到
$$ B\mod n \equiv 3k \mod n,k=\frac{B \mod n}{3} $$这里求得的 k 就是 p 的低 400 位,之后我们使用 coppersmith 求解出 p 就行了。
|
|
EzECDSA
解方程题,已知 6 个签名方程 $s_i=k_i^{-1}(h_i+dr_i)\pmod{n},i={1,2,3,4,5,6}$
$s_i,h_i,r_i,n$均已知,k 之间有联系 $k_{i+1}=ak_i^2+bk_i+c\pmod{n}$
所以 6 个方程 5 个未知数,解方程组即可,唯一难的地方在化简方程
非线性迭代方程在有限步差分后必然线性化,d 次多项式方程,做差 d 次是常数
差分就是方程之间做差, $k_{i+1}=ak_i^2+bk_i+c\pmod{n}$不断做差化简为全是 k 的方程
再用 $k_i=A_i+B_id\pmod{n},A_i=s_i^{-1}h_i,B_i=r_is_i^{-1}$把关于 k 的方程换为关于 d 的方程
用.roots()方法求解模下多项式方程的根
|
|
RRRSSSAAA
|
|
解法二(不是)
用论文的方法也能算出来,和维纳攻击的思路大差不差,式子化简方式都一样的
论文链接:https://eprint.iacr.org/2024/1263.pdf
$$ e(\phi(N)-d_{small})\equiv 1\pmod{\phi{(N)}}\Rightarrow ed_{small}+1=k\phi(N) $$e 和$\phi(N)$相近,$d_{small}$只有 1021bit,很小,所以可以考虑勒让德定理
$$ \frac{e}{\phi(N)}+\frac{1}{k\phi(N)}=\frac{k}{d_{small}}\Rightarrow |\frac{e}{\phi(N)}-\frac{k}{d_{small}}|=\frac{1}{k\phi(N)}<\frac{1}{2d_{small}^2} $$此时对$\frac{e}{\phi(N)}$做连分数展开,其逼近中含有$\frac{k}{d_{small}}$,由此可求出 $\phi(N)=\frac{ed_{small}+1}{k}=\left\lfloor\frac{d_{small}}{k}e\right\rfloor$
但$\phi(N)$不知道,一开始想用$N^4$近似一下,但是发现论文里有更好的近似计算方法
其实直接用 N^4 也能求出来
$$ \phi_0(N)=N^4-(3N^2+\left\lfloor\frac{N^2}{3}\right\rfloor)+1 $$算出$\phi(N)$,就能直接算 d 解出 flag 了
|
|
MISC
量子双生影
解压附件,可以用手机扫描二维码得到:

这里尝试过后,发现存在 NTFS 隐写,使用 AlternateStreamView 工具解密,得到另一张二维码


提取出隐藏文件,使用 PS 进行一些处理,然后扫描得到 flag

Why not read it out?
文件改后缀为 jpg:

同时发现文件尾 FF D9 后有其它内容:

很明显的 base 特征,字符串逆序,解 base64 得到 hint:

发现是游戏 tunic 的语言,上 b 站可以搜到旭日升冰茶博主的 tunic 语言教程,了解完语言特性之后看看那张图,初步推测是换表,因为元辅音的数量看着没啥变化
之后在推这个表的时候才发现规律反过来了,元音和辅音的内外和游戏中相反,实际上就是发现元音和辅音的图形数量对不上,正常来讲应该是 18 个元音,但是数量对不上,最后发现反过来对得上才看出来这个规律
正常做词频分析的方式还是比较慢的,不如直接做猜词来得快,最后分析出来七七八八,然后有几个比如 I 或者 ae 这种音标没分析出来,直接从下面的几句话分析就行
翻译出来下面第一句是:
The content of flag is:come on little brave fox
交上去发现不对,就看看下面的句子
然后下面发现第二句和第三局开头都是一个词,想着占便宜把这俩都先翻了,发现是单词 replace,后面还有一个单元音 a 和 e,那么我可猜出来出题人什么意思了,也就是上面大块的内容是给你来算这个换表的,下面的才是有用的,于是果断放弃上面的翻译,开始翻译下面的
第二句整句翻出来是:
replace letter o with number 0,letter l with 1
第三句整句翻出来是:
replace letter a with simple @(æt)
第四句没翻出来,但是看见 every letter 两个词就大概知道啥意思了,肯定是变化字母,直接找后面的元音(实际上这句我是最后翻的,当时就直接用暴力破解法了)
/mak/ vary letter ? /Λpəksa/
Make every letter E uppercase
第五句更简单,我当时就在想 ctf 的 flag 怎么可能空格,盲猜有一句是加下划线,但是直接翻译出来 link 这个词的时候我就其他的都没咋看了,肯定是用下划线把单词连起来
use(ju:z) underline(Λnpəlain) to(tʊ) link(liŋk) each(i:t∫) word(wɔːd)
最后的 flag 就是L3HCTF{c0mE_0n_1itt1E_br@vE_f0x}
LearnRag
grok 秒了
|
|
Please Sign In
题目说是人脸检测,给的脚本是通过图片得出的特征向量和原来题目给的比对满足不大于对应的损失精度
先喂给 ai ,让他写一个根据题目脚本要求和模型,可以通过训练生成满足对应特征向量比对误差图片的脚本
再炼就行了
使用 png 无损压缩格式发送,不然有误差
|
|
WEB
赛博侦探
打开题目是个朋友圈,主页没发现什么有用的东西,每个链接都点一点
在 bilibili 视频链接后找到了找回密码的 url

http://61.147.171.103/secret/find_my_password

在小说 docx 作者找到邮箱:

根据图一位置可以确定经纬度:

飞机票可以找到老家和英文名:

找回后

目录穿越

best_profile
nginx 对于静态文件的缓存利用,注册一个.js 这种静态文件后缀的用户就会在第一次被访问之后缓存,先在/get_last_ip/路由有正确的恶意 ip 后访问写进去,后续请求不走后端,读缓存



最后本地起一个测试环境转接到 fenjing 上面输出 poc
|
|
|
|
gateway_advance
local args = ngx.req.get_uri_args() 在请求参数过多时会出现解析问题,一般的默认长度为 100

任意文件读取下,关闭了 flag 的读取但是没关 passwd 的,会残留 fd,本地有个 fd10 但是读不出来,尝试遍历读取

因为会检测是否出现 password 关键词所以需要分段输出,每六个一组

读一下 maps,有个删除的地址

最后在 mem 中读取到 flag

