本文在个人blog上率先发布
bafK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9r3!0K6N6s2y4Z5j5i4u0C8i4K6u0V1M7s2u0G2i4K6u0W2k6$3W2@1K9s2g2T1i4K6u0W2K9h3!0Q4x3V1j5`.

nc连一下???


这是干什么

难道限制7byte,还会ban字符

出题人怎么这么坏啊
这到底在考什么
格式化字符串???

wc,我是天才
可以还原一下函数
char buf[8];
scanf("%7s", buf);
printf(buf);

出canary了


%i$s
这内存里也没flag啊

ez-nc的文件头


有点奇怪的题


有seccomp

ban 了execve和execveat
用orw

c++编译

全开

我去,2.39

有backdoor function,那还用个蛋的orw


这笔记看着就高级
翻译一下
根本看不懂
这出题人怎么这么坏啊
•᷄ࡇ•᷅

什么叫main函数里还有加密???
不对,不是加密,这是自校验

底下这一块才是要看的
兮,这c++反汇编我还不太看的懂

慢慢看了


先清零buf 376+16字节
malloc 了0x200,512bytes
v23 = begin , v29=the chunk's end
*(__m128i *)&buf[376] = _mm_unpacklo_epi64((__m128i)v23, (__m128i)v23);
将两个 64 位整数交叉组合成一个 128 位的向量
两个参数都是v23,故高64低64都是v23
sub_8A60 和 sub_3570:传入了 buf 的起始地址
先看看8a60

控制台这一块

ban execve

buf共用

用来int (str)的

8a60结束后free buf的,6720也是
看看case1

calloc

打印calloc的返回地址

单个输入 v9 (items) 和 v42 (stride) 被限制在 32 位以内
n32_1 = (std::ios_base *)(v42 * v9);
乘积被存入了 64 位的 n32_1 中
n32 = (unsignedint)n32_1;
强制将 64 位的 n32_1 转换为 32 位的 unsigned int
v13 = calloc(n32, 1uLL);
使用截断后的 32 位小数值去分配堆内存
存在 Integer Truncation (高位砍掉)
这样就可以伪造所记录的calloc的chunk大小
看看case2

看看case3
什么叫引导异步调度器

启动后台的任务分发系统
创建总控台(Scheduler Control Plane):分配一个全局的调度器控制块(queue_ctrl),里面记录了调度器的状态,并且初始化了安全策略(strict_policy = 1)
创建任务槽(Task Descriptors):循环 8 次,创建 8 个任务结构体(Task 0 到 Task 7)。每个结构体里预先填好了默认的回调函数指针(handler)和参数(context)

可以通过case2的溢出覆盖v10
看看case4

4可以泄露addr

看看case5
case6

UAF
看看case7

可以用它改fd
这就是edit
看看case8
Case 8 表面上是一个配置节点的业务功能,但在 Pwn 攻击链中,它是一个无损的 64 位任意内存内容填充器

看看case9
可以通过case2把strict_policy改成0
看看case10
看看case11

原来是凑数的

2.32以上就有safe-linking了
有UAF时就可以直接得到heap_base_addr,pwn.college里写过太多了


这题的阅读实在有点困难
•᷄ࡇ•᷅



伪c可比伪cpp清秀多了

[培训]《冰与火的战歌:Windows内核攻防实战》!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。
最后于 21小时前
被shark_pro编辑
,原因: