美文网首页
heap_off_by_one

heap_off_by_one

作者: zs0zrc | 来源:发表于2018-07-09 15:48 被阅读88次

这个主要是由于malloc的内存区域存在单字节溢出漏洞,通过溢出下一个chunk的 size字段,能在堆中创造出重叠的内存块,达到改写其他数据的目的。
如果溢出的数据为0,就是off_by_null

对于单字节溢出的利用大致分四种:

  1. 扩展被释放的chunk
 0x100   0x100    0x80
|-------|-------|-------|
|   A   |   B   |   C   |   初始状态
|-------|-------|-------|
|   A   |   B   |   C   |   释放 B
|-------|-------|-------|
|   A   |   B   |   C   |   溢出 B 的 size 为 0x180
|-------|-------|-------|
|   A   |   B   |   C   |   malloc(0x180-8)
|-------|-------|-------|   C 块被覆盖
        |<--实际得到的块->|
  1. 扩展已分配的chunk
0x100   0x100    0x80
|-------|-------|-------|
|   A   |   B   |   C   |   初始状态
|-------|-------|-------|
|   A   |   B   |   C   |   溢出 B 的 size 为 0x180
|-------|-------|-------|
|   A   |   B   |   C   |   释放 B
|-------|-------|-------|
|   A   |   B   |   C   |   malloc(0x180-8)
|-------|-------|-------|   C 块被覆盖
        |<--实际得到的块->|
  1. 收缩被释放的chunk
0x100     0x210     0x80
|-------|---------------|-------|
|   A   |       B       |   C   |   初始状态
|-------|---------------|-------|
|   A   |       B       |   C   |   释放 B
|-------|---------------|-------|
|   A   |       B       |   C   |   溢出 B 的 size 为 0x200
|-------|---------------|-------|   之后的 malloc 操作没有更新 C 的 prev_size
         0x100  0x80
|-------|------|-----|--|-------|
|   A   |  B1  | B2  |  |   C   |   malloc(0x180-8), malloc(0x80-8)
|-------|------|-----|--|-------|   
|   A   |  B1  | B2  |  |   C   |   释放 B1
|-------|------|-----|--|-------|
|   A   |  B1  | B2  |  |   C   |   释放 C,C 将与 B1 合并
|-------|------|-----|--|-------|  
|   A   |  B1  | B2  |  |   C   |   malloc(0x180-8)
|-------|------|-----|--|-------|   B2 将被覆盖
        |<实际得到的块>|
  1. house of einherjar :这种是溢出字节为0的情况,当它更新溢出块下一块的prev_size字段时,使它在被释放时能找到之前一个合法被释放的chunk与其合并,造成堆块重叠
 0x100   0x100   0x101
|-------|-------|-------|
|   A   |   B   |   C   |   初始状态
|-------|-------|-------|
|   A   |   B   |   C   |   释放 A
|-------|-------|-------|
|   A   |   B   |   C   |   溢出 B,覆盖 C 块的 size 为 0x200,并使其 prev_size 为 0x200
|-------|-------|-------|
|   A   |   B   |   C   |   释放 C
|-------|-------|-------|
|   A   |   B   |   C   |   C 将与 A 合并
|-------|-------|-------|   B 块被重叠
|<-----实际得到的块------>|

这个是我在ctf_all_in_one中看到的,特地记录一下

相关文章

  • heap_off_by_one

    这个主要是由于malloc的内存区域存在单字节溢出漏洞,通过溢出下一个chunk的 size字段,能在堆中创造出重...

网友评论

      本文标题:heap_off_by_one

      本文链接:https://www.haomeiwen.com/subject/myozuftx.html