68eK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6W2N6r3g2J5L8X3q4D9M7$3q4C8N6i4u0S2i4K6u0r3j5%4c8X3i4K6g2X3M7s2N6F1i4K6u0r3N6s2u0W2k6g2)9J5c8X3#2S2M7%4c8W2M7W2)9J5c8U0m8U0N6r3j5J5x3o6p5^5i4K6u0r3K9r3g2S2M7s2y4@1L8%4u0E0x3R3`.`.
利用linux的/dev/urandom文件产生较好的随机数
e30K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6T1L8r3!0Y4i4K6u0W2j5%4y4V1L8W2)9J5k6h3&6W2N6q4)9J5c8Y4y4@1M7r3g2S2j5$3g2Q4x3V1k6S2M7Y4c8A6j5$3I4W2i4K6u0r3k6r3g2@1j5h3W2D9M7#2)9J5c8U0b7#2z5o6t1&6x3e0j5I4


读入随机数前
读入随机数后


用如图上数字1处的随机数去覆盖后面的16个的每一行的左八个字节(堆指针)。用如图上数字2处的随机数去覆盖后面的16个的每一行的右八个字节(size)。
用图上数字3处的随机数去覆盖数字4处。


有off by null漏洞



在update的时候有一个off by null。
之前做堆的题都不建结构体,全靠脑补…这次建一下,让反编译出来的好看一点。
1.添加segment




2.建结构体

3.改函数参数


4.最后的修改结果

前提:存在一个off-by-null漏洞(已满足)
目的:创造出overlap chunk,进而更改其他chunk中的内容
主要利用unsorted,small bin会unlink合并的特性来达到我们的目的。
1.伪造prev_size

2.free 1,于是下一个chunk的inuse和prev_size将被设置。
图示灰色的地方代表被free掉,然后触发off by null,修改1的size。

3.将free的1再分配出来,然后再分配一块空间到原来的1中,注意大小不能刚好使得这个chunk和2相邻,否则会把2的inuse位置1,不能在后续触发unlink。
然后再free 2,就能触发unlink,然后1和7,overlap



当free 2的时候,因为2是small bin的大小的缘故,所以会检测上一个chunk是否inused.
它会根据prev_size找到1,然后做unlink。
此时,unsortbin存放着这块大的chunk,所以下次malloc会用这一块先分配。

可以看出通过chunk shrink,实现了overlap。
重复一遍之前的过程,再次构造overlap
然后4和8交叠。
free 2前
free 2后
将2再分配出来,这时0x5555557575c0掉链,进入large bins中,再free 2,0x555555757060再次进入unsortedbin。
然后要fake 0x555555757060的后向指针。
fake前
fake后
可以看出bk指针被改写。
然后fake
fake前
fake后
当再分配一个chunk的时候,会先检查unsorted bin中有没有合适的,如果没有就把unsortbin中的chunk插入large bin中。
看源码
当找到插入的位置后,看源码里具体的插入操作。
注意large bin要维持两个双向链表,多了一个chunk size链表,所以要在两个链表中插入。
在此题中,fwd只可能是我们放入large bin的唯一一个chunk,而它的bk_nextsize和bk都是我们可以控制的(如上一步的改写)
victim就是我们要插入的堆地址。
bk_nextsize被写为0x13370800-0x20-0x18-5,那么*(0x13370800-0x20-0x18-5+0x20)=victim
bk被写为0x13370800-0x20+8,那么*(0x13370800 -0x20+8 ) = victim。
当第一个chunk从unsorted bin插入到large bin之后,再到unsorted bin的下一个chunk,如果不满足分配则插入到large bin中。
而下一个chunk是我们伪造的(0x13370800-0x20)
而这个地方已经有值了,也就是我们写入的
(0x13370800-0x20-0x18-5+0x20)=0x133707e3=victim
chunk的size,即0x13370800-0x20+0x8=0x133707e8,就是\x55或者\x56。
之所以要求是\x56,因为需要满足一个检查。
即chunk的mmap标志位置位。
之前我调试的时候都是打开的ASLR,现在关掉看一下,多运行几次总能有一次成功的。

去掉标志位,那么它的大小就是0x50,就满足alloc(0x48),就会返回给我们,成功返回0x13370800-0x10之后,就是传统的做法了。

c42K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4y4@1i4K6u0W2k6$3W2@1K9s2g2T1i4K6u0W2j5$3!0E0i4K6u0r3d9X3q4U0K9%4W2^5N6s2W2Q4x3V1j5&6k6r3f1H3x3h3p5H3j5X3c8X3k6e0g2X3j5U0k6V1x3r3t1@1x3r3k6W2x3o6j5$3k6U0l9#2z5h3k6S2x3H3`.`.
ae5K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6%4K9h3I4D9K9h3&6A6L8W2)9J5c8U0m8U0N6r3j5J5x3o6p5^5i4K6u0r3j5X3I4G2j5W2)9J5c8X3#2S2M7%4c8W2M7W2)9J5c8X3S2W2j5i4m8K6N6r3!0J5L8e0u0Q4x3V1k6Z5k6h3q4H3M7%4c8G2M7X3@1J5i4K6u0W2L8h3b7`.
[培训]科锐逆向工程师培训第53期2025年7月8日开班!
最后于 2019-2-2 14:29
被kanxue编辑
,原因: