【问题标题】:How a corrupted double linked list error is detected in malloc?如何在 malloc 中检测到损坏的双链表错误?
【发布时间】:2019-10-04 06:19:29
【问题描述】:

我不明白获取错误的条件 - 损坏的双链表(不小) -

程序中有一点由于损坏的双链表(不小)而崩溃。

此时,我不想知道它为什么崩溃,但我想知道这个条件是如何工作的

if (__builtin_expect (P->fd_nextsize->bk_nextsize != P, 0) || __builtin_expect(P->bk_nextsize->fd_nextsize != P, 0))    
     malloc_printerr (check_action,"corrupted double-linked list (not small)", P, AV);              

这里我们可以看到当P->fd_nextsize->bk_nextsize != P 没有完成或者P->bk_nextsize->fd_nextsize 没有完成的时候观察到错误的双链表。

但我的主要问题是我无法解释这部分代码 - P->fd_nextsize->bk_nextsize - 期望是 P。我期望 P->fd_nextsize->bk_nextsize 是 P->bk_nextsize。

也许我对 bin 中双链表的结构感到困惑。

此时,我将双链表理解为:

+------------------->+----------------+ <---------+
|                    |  fd_nextsize   |           |
|                    |                |           |
|                    |                |           |
|                    +----------------+           |
|                    |                |           |
|                    |fd_nextsize     |           |
|                    |                |           |
|                    +----------------+           |
|                    |                |           |
|                    +bk_nextisize    |--------------------+
|                    |                |           |        |
|                    +----------------+           |        |
|                                                 |        |
|                                                 |        |
|                                                 |        |
|                                                 |        |
|                     +---------------+           |        |
|                     |  P            |           |        |
|                     |               |           |        |
|                     +---------------+           |        |
|                     |               |           |        |
|                     |fd_nextsize    +-----------+        |
|                     |               |                    |
|                     +---------------+                    |
|                     |               |                    |
|         +-----------+bk_nextsize    |                    |
|         |           |               |                    |
|         |           +---------------+                    |
|         |                                                |
|         |                                                |
|         |                                                |
|         +----------->+----------------+<-----------------+
|                      | bk_nextisize   |
|                      |                |
|                      |                |
|                      +----------------+
|                      |                |
+----------------------+ fd_nextsize    |
                       |                |
                       +----------------+
                       |bk_nextsize     |
                       |                |
                       +----------------+

所以,如果我对 bin 中的双链表的理解不正确(重要信息,根据代码以及我们使用 fd_nextsize 和 bk_nextsize 的事实,这个块不在 smallbin 中)请纠正我。因为此时此刻,这个条件对我来说没有任何意义。

【问题讨论】:

    标签: malloc free glibc corruption bins


    【解决方案1】:

    带有正确图表的损坏双列表示例。

    gef> x/200x victim
    0x2c76330:      0x00000000      0x00000000      0x000004d1      0x00000000
    0x2c76340:      0x140e8fb8      0x00007f12      0x140e8fb8      0x00007f12
    0x2c76350:      0x02c15e48      0x00000000      0x02c76330      0x00000000
    0x2c76360:      0x00000318      0x00000000      0x00000000      0x00000000
    
    Here 
    
    0x02c15e48    >>> fd_nextsize
    0x02c76330    >>> bk_nextsize 
    
    gef> x/100x 0x02c15e48
    0x2c15e48:      0x02c76348      0x00000000      0x00000000      0x00000000
    0x2c15e58:      0x00000019      0x00000000      0x09080003      0x0071db5c
    0x2c15e68:      0xc0b51d4f      0x00000001      0x000000fa      0x00000000
    0x2c15e78:      0x00000003      0x00007706      0x00007706      0x586a0001
    
    0xc0b51d4f >>> victim->fd_nextisize->fd_nextsize
    0x000000fa >>> vicitim->fd_nextsize->bk_nextsize  >>>>>>>>>>>>>>>>>>>>>>>>>>>>> This is not valid. 
    
    
    gef> x/100x 0x02c76330
    0x2c76330:      0x00000000      0x00000000      0x000004d1      0x00000000
    0x2c76340:      0x140e8fb8      0x00007f12      0x140e8fb8      0x00007f12
    0x2c76350:      0x02c15e48      0x00000000      0x02c76330      0x00000000
    0x2c76360:      0x00000318      0x00000000      0x00000000      0x00000000
    
    0x02c15e48 >>> victim->bk_nextsize->fd_nextsize
    0x02c76330 >>> victim->bk_nextsize->bk_nextsize >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> This condition is valid.
    
    
    
    
       Double Linked Lists in GLIBC
    
                 +----------------------+<------------------+
                 |      ChunkA          |                   |
                 +-----------------------+                  |
                 |fd_nextsize           |                   |
                 +----------------------+                   |
                 |                      |                   |
             +---+bk_nextsize           |                   |
             |   +----------------------+                   |
             |                                              |
             |  +------------------------+<---------+       |
             |  |    ChunkB              |          |       |
             |  +------------------------+          |       |
             |  |fd_nextsize             |          |       |
             |  |                        |          |       |
             |  +------------------------+          |       |
    +-----------+bk_nextsize             |          |       |
    |        |  +------------------------+          |       |
    |        |                                      |       |
    |        +->+------------------------+<-----------------------------+
    |           |      ChunkC            |          |       |           |
    |           +------------------------+          |       |           |
    |           |fd_nextsize             +------------------+           |
    |           |                        |          |                   |
    |           +------------------------+          |                   |
    |    +------+bk_nextsize             |          |                   |
    |    |      +------------------------+          |                   |
    |    |                                          |                   |
    +---------->+------------------------+          |                   |
         |      |        ChunkD          |          |                   |
         |      +------------------------+          |                   |
         |      |fd_nextsize             +----------+                   |
         |      +------------------------+                              |
         |      |                        |                              |
         |      |bk_nextsize             |                              |
         |      +------------------------+                              |
         |                                                              |
         +----> +------------------------+                              |
                |       ChunkE           |                              |
                +------------------------+                              |
                |fd_nextsize             +------------------------------+
                |                        |
                +------------------------+
                |bk_nextsize             |
                +------------------------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-05
      • 2020-01-15
      • 2020-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多