首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux (x86) Exploit 开发系列教程之十一 Off-By-One 漏洞(基于堆)

每个块有自己块头部(由malloc_chunk表示)。malloc_chunk结构包含下面四个元素: prev_size – 如果前一个块空闲,这个字段包含前一个块大小。...当大小为 1020 字节(p2)块由单个字节溢出时,下一个块(p3)头部size最低字节会被 NULL 字节覆盖,并不是prev_size最低字节。...checked_request2size将用户请求大小转换为可用大小(内部表示大小),因为需要一些额外空间来储存malloc_chunk,并且也出于对齐目的。...但是在同一篇文章,我们也看到,unlink 技巧已经废弃,因为 glibc 近几年来变得更加可靠。具体来说,因为“双向链表损坏条件,任意代码执行时不可能。...但是在 2014 年末,Google Project Zero 小组找到了一种方式,来成功绕过“双向链表损坏条件,通过 unlink large 块。

51210
您找到你想要的搜索结果了吗?
是的
没有找到

Exim Off-by-one(CVE-2018-6789)漏洞复现分析

不过虽然有影响,但是只是影响构造细节,总体构造思路还是按照meh写paper那样。...0x4040大小chunk,在执行完EHLO命令后被释放, 然后0x1d191c0是inusesender_host_name,这两部分就构成一个0x6060chunk STEP 2 现在情况是...EHLO释放之前sender_host_name,然后重新设置,让sender_host_name位于0x6060大小chunk中部 p.sendline("EHLO %s"%("c"*(0x2000...: 第一块未被使用0x2020大小chunk 第二块正在被使用0x2000大小sender_host_name 第三块未被使用,并且和之后堆块合并, 0x6060大小chunk 我们现在再回过头来想想各个...另外,通过github上exp进行对比,发现不同版本exim,acl_check_xxx堆偏移也有差别,所以如果需要RCE exim,需要满足下面的条件: 包含漏洞版本(小于等于commit

79820

Linux (x86) Exploit 开发系列教程之九 使用 unlink 堆溢出

例如,从 binlist unlink(移除)前一个块,将前一个块大小当前块相加,并将块指针指向前一个快。但是我们这里,前一个快是分配,因此 unlink 不会调用。...因此下一个块second不是空闲。 如果是空闲,合并它。例如,从它 binlist unlink(移除)下一个块,并将下一个块大小添加到当前大小。...例如,从 binlist unlink(移除)前一个块,将前一个块大小当前块相加,并将块指针指向前一个快。但是我们这里,前一个快是分配,因此 unlink 不会调用。...例如,从它 binlist unlink(移除)下一个块,并将下一个块大小添加到当前大小。...当攻击者将second块大小赋为 -4 时,glibc malloc 就会抛出下一个块大小无效错误

63830

关于OpenResty里ngx.on_abort

关于 OpenResty 里 ngx.on_abort,官方文档里是这样说明: Registers a user Lua function as the callback which gets called...因为我在代码里设置了 sleep,所以 curl 无疑会卡住,通过执行 Ctrl+c 强行终止,以此构造出一个客户端提前关闭连接场景,此时我们在 tail 窗口就能看到输出了 log,由此可知当客户端提前关闭连接时候...has been called)....也就是说,当客户端提前关闭连接时候,如果 ngx.req.socket 数据没有被读取,那么 ngx.on_abort 里注册函数不会被触发。...把这个报错信息重新加工了一下,所以不能按等于判断,必须按包含判断,可见通过判断错误信息等于什么来判断错误类型方式有点不靠谱,其实在 websocket 场景,如果要求不是特别严格的话,那么只要 fatal

64910

一篇文章彻底讲懂malloc实现(ptmalloc)

prev_size主要用于相邻空闲chunk合并)   size :当前 chunk 大小,并且记录了当前 chunk 和前一个 chunk 一些属性,包括前一个 chunk 是否在使用,当前...故而实际上, 一个使用 chunk 大小计算公式应该是: in_use_size = ( 用户请求大小 + 8 - 4 ) align to 8 bytes 这里加8是因为需要存储 prev_size...六、sbrkmmap   在堆区, start_brk 指向 heap 开始,而 brk 指向 heap 顶部。...使用 mmap()直接映射 chunk 在释放时直接解除映射,而不再属于进程内存空间。任何对该内存访问都会产生段错误。...判断chunk是否top chunk相邻,如果相邻,则直接和top chunk合并(和top chunk相邻相当于和分配区空闲内存块相邻)。

1.3K10

Exim Off-by-one(CVE-2018-6789)漏洞复现分析

不过虽然有影响,但是只是影响构造细节,总体构造思路还是按照meh写paper那样。...0x4040大小chunk,在执行完EHLO命令后被释放, 然后0x1d191c0是inusesender_host_name,这两部分就构成一个0x6060chunk STEP 2 现在情况是...EHLO释放之前sender_host_name,然后重新设置,让sender_host_name位于0x6060大小chunk中部 p.sendline("EHLO %s"%("c"*(0x2000...: 第一块未被使用0x2020大小chunk 第二块正在被使用0x2000大小sender_host_name 第三块未被使用,并且和之后堆块合并, 0x6060大小chunk 我们现在再回过头来想想各个...write理解有问题吧 另外,通过github上exp进行对比,发现不同版本exim,acl_check_xxx堆偏移也有差别,所以如果需要RCE exim,需要满足下面的条件: 包含漏洞版本

1.3K70

Dance In Heap(三):一些堆利用方法(

在内size,而实际可用size与此不同,它是减去chunk header后大小。...= 0x181 // 0x01标识a为inuse状态 现在我们malloc一个0x180 chunk,系统就会将从b开始0x180大小空间返还,这其中包括c d = malloc(0x180-8)...; ok,现在我们就可以更改利用d更改c内容,如果c包含某个函数指针,我们也可以去改变它,当然 0x03 overlapping chunk 2 我们在前面先释放再修改size来获得了一个覆盖掉后面...chunksize,所以我们预留了d,并且防止free后直接top chunk合并,之后我们free掉b,然后再次malloc就又包括了c free(p); e = malloc(0x200-8);...了解chunk复用原理,就是去改变 size 位来使系统对错误长度进行 malloc、free,这就是我们目的。

62770

nodejs创建线程问题

我们知道在nodejs可以使用new Worker创建线程。今天有个同学恰好问到,怎么判断创建线程成功,这也是最近开发线程池时候遇到问题。nodejs文档里也没有提到如何捕获创建失败这种情况。...不过坏消息是,我们无法捕获这个这个错误。下面看一下源码。我们直接从c++层开始分析。...当我们调用new Worker时候,最后会调用c++StartThread函数(node_worker.cc)创建一个线程。...我们回头看一下返回非0时,c++处理。我们对c++层CHECK_EQ(uv_thread_create_ex(…), 0)进行宏展开。...对于业务错误我们可以注册error事件处理,在new Worker时候,我们可以加try catch。可以捕获一下参数错误情况。

94720

大厂生产环境RocketMQ都是这样部署

缺点:Master宕机磁盘损坏情况下会丢失少量消息。...数据服务都无单点故障,Master宕机情况下,消息无延迟,服务可用性数据可用性都非常高; 缺点:性能比异步复制模式略低(大约低10%左右),发送单个消息RT会略高,且目前版本在主节点宕机后,备机不能自动切换为主机...文件存储路径 abortFile=/usr/local/rocketmq/store/abort #限制消息大小 maxMessageSize=65536 #flushCommitLogLeastPages...文件存储路径 abortFile=/usr/local/rocketmq/store/abort #限制消息大小 maxMessageSize=65536 #flushCommitLogLeastPages...由于版本更新问题,少部分命令可能未及时更新,遇到错误请直接阅读相关命令源码 相关命令比较多可以在官网查看。

89430

how2heap 系列记录

unsort bin 中去,然后下一次分配大小如果比它大,那么将从 top chunk 上分配相应大小,而该 chunk 会被取下link到相应 bin 。...该攻击方式可实现两次往任意地址写堆地址能力,设任意地址为evil_addr,问题出现在当前largebin插入为堆头过程,在此过程假设我们可控largebinbk_nextsizebk。...PREV_INUSE位 size_t fake_size = (size_t)((b-sizeof(size_t)*2) - (uint8_t*)fake_chunk); //计算目标地址偏移...此外,需要注意是,在一些特殊大小堆块,off by one不仅可以修改下一个堆块 prev_size,还可以修改下一个堆块PREV_INUSE比特位。...如果要触发sysmalloc_int_free,那么本次申请大小也不能超过mp_.mmap_threshold,因为代码也会根据请求值来做出不同处理。

1.4K30

Oracle 普通数据文件备份恢复

恢复这样数据文件可以采用高可用策略,在数据库OPEN状态下进行 10.1 普通数据文件损坏后果 普通数据文件损坏后,只是用户业务数据不同程度上无法访问(查询修改),报错 ORA-01578,执行命令会话不会被中断...由于检查点失败导致文件下线错误记录,访问该数据文件ORA-00376错误,实例不再试图访问该文件,此时实例也能重启成功。...数据文件头部损坏情况可能需要特殊处理。 10.3.1 恢复前准备 关键数据文件恢复一样,进入mount状态时恢复前提,确保参数文件和控制文件正常。...10.3.2 非文件头部损坏恢复 只要文件头部没有损坏(包括文件丢失),文件就不会被自动下线,也不会出现ORA-01210错误,可以使用此节步骤进行恢复,数据库处于mount状态为低可用恢复策略,....dbf文件将意外引发RMAN-06010错误,原因是控制文件表示该文件已下线,restore发现yhqt01.dbf存在,通道还是会访问yhqt01.dbf文件头部, 以确认其信息是否控制文件一致

86220

how2heap学习(下)

然后我们释放掉 b,这时候 b 因为 top chunk 挨着,会跟 top chunk 合并,然后因为 prev_inuse 是 0,所以会根据 prev_size 去找前面的 free chunk...bin 地址,然后因为我们把 old top chunk size 改为了 0x61 属于 smallbin,恰好这个大小 smallbin 相对 unsorted bin 偏移 _chain...,smallbin 相同大小空闲块会放入 tcache ,这时候也会出现 unlink 操作 calloc 在分配时不会用 tcache bin 首先把 7 个放到 tcache bin ,...这时候去申请一个 0xa0 大小 chunk,那俩在 unsorted bin chunk 整理放在了 small bin ?...如果要覆盖堆栈地址不为零,则需要再释放6个指针,否则攻击将导致分段错误。但是,如果堆栈上值为零,那么一个空闲就足够了。

57641

【DB笔试面试534】在Oracle,数据库启动经历几个过程?

c)启动后台进程,例如PMON、SMON等。(d)打开并修改告警日志文件及跟踪文件。 MOUNT阶段完成任务如下所示:(a)利用参数文件CONTROL_FILES值,打开并锁定控制文件。...即使有一个控制文件缺失或损坏,实例也会向DBA返回错误(指明控制文件缺失或状态不同步)并保持NOMOUNT状态。(b)将数据库实例关联起来。...(c)读取控制文件并获取数据文件和Redo日志文件名称和状态信息,但不检查数据和日志文件是否存在。需要注意是,这一步会读取控制文件,如果这一步有任何一个控制文件被损坏,那么数据库就无法正常启动。...如果缺失了任何数据文件,那么数据库会向DBA返回一个错误,指出第一个缺失文件,此时实例保持MOUNT状态。当实例发现缺失文件时,错误消息只显示导致问题第一个文件。...如果任何文件需要进行介质恢复,那么数据库会向DBA返回一条错误消息,指出第一个需要恢复文件,此时实例保持MOUNT状态。(c)打开联机Redo日志文件。

85420

「玩转Lighthouse」Linux(CentOS7)配置RocketMQ集群

摘要 RocketMQ是阿里巴巴开源分布式消息中间件。支持事务消息、顺序消息、批量消息、定时消息、消息回溯等。它里面有几个区别于标准消息件间概念,如Group、Topic、Queue等。...磁盘损坏情况下会丢失少量消息。...:数据服务都无单点故障,Master宕机情况下,消息无延迟,服务可用性数据可用性都非常高; - 缺点:性能比异步复制模式略低(大约低10%左右),发送单个消息RT会略高,且目前版本在主节点宕机后,...文件存储路径 abortFile=/usr/local/rocketmq/store/abort #限制消息大小 maxMessageSize=65536 #flushCommitLogLeastPages...文件存储路径 abortFile=/usr/local/rocketmq/store/abort #限制消息大小 maxMessageSize=65536 #flushCommitLogLeastPages

1.9K50

【 二进制安全】House Of Eingherjar

隐式链表技术,把 P 指针指向了要 free 堆块前一个堆块(q),然后进行 unlink 操作。...对于关键点,我觉得 wiki 上总结很好。 * 需要有溢出漏洞可以写物理相邻高地址 prev_size PREV_INUSE 部分。...* 我们需要计算目的 chunk p1 地址之间差,所以需要泄漏地址。 * 我们需要在目的 chunk 附近构造相应 fake chunk,从而绕过 unlink 检测。...来求出 free 堆块地址,然后就可以根据地址差来计算 pre_size,同时也使得我们在 ptr_array fake_chunk 可以事先写入堆块指针 p 地址来绕过 unlink....3.free 之后我们堆块指针成功转移,那么我们可以根据预先设定 fake_chunk 大小将其申请出来,那么我们就可以对 ptr_array 实现任意写了。

40020

Postgresql源码(109)并行框架实例分析

这会导致启动后端在下一个 CHECK_FOR_INTERRUPTS() 读取并重新抛出消息。大部分情况下,这使得并行模式下错误报告“正常工作”。...没有通用机制可以确保每个工作进程全局变量启动后端值相同;即使我们可以确保这一点,我们调用某些函数在每次调用后可能会更新变量,并且只有执行更新后端才会看到新值。...为了在并行模式下使尽可能多操作安全,我们尝试从启动后端复制最重要状态片段到每个并行工作进程。这包括: dfmgr.c动态加载库集合。 已认证用户ID和当前数据库。...()和TransactionIdIsCurrentTransactionId()返回启动后台进程相同值方式存储。...在并行操作结束时,可能是因为操作成功完成,也可能是因为被错误中断,该操作相关联并行工作者退出。在出现错误情况下,主导并行事务事务中止处理会终止剩余工作者,并等待它们退出。

31430
领券