double free的题
但是开了挺多保护的这里需要一些unlink的知识,如果不会以下是参考e98K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3y4T1i4K6u0W2k6s2u0G2M7s2y4Q4x3X3g2%4K9h3E0A6i4K6u0r3k6s2u0G2M7s2y4Q4x3V1k6@1K9i4m8K6i4K6u0V1x3e0j5$3x3e0m8Q4x3X3g2Z5N6r3#2D9ba0K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3y4T1i4K6u0W2k6s2u0G2M7s2y4Q4x3X3g2%4K9h3E0A6i4K6u0r3k6s2u0G2M7s2y4Q4x3V1k6@1K9i4m8K6i4K6u0V1y4K6x3J5y4W2)9J5k6h3S2@1L8h3H3`.
在free的时候并没有将指针置零,可以多次free
另外程序还有一个漏洞,程序在做read的时候,没有加上'\x00',有一个off-by-one的一字节漏洞,..
继续往下看
在guess_a_randnum函数中,程序调用的是rand(),事实上,这是一个伪随机函数,
这个函数中,当我们猜中randnum后,程序会讲seed地址给我们打印出来,那么我们将获取一个地址
get ...我们能获取地址,意味着我就可以做unlink了
rand()的值决定与srand(&seed) 当这个我们知道&seed的时候,我们就可以去预测rand()的值,
那么我们可以去暴力猜测 seed,然后再去预测下一个rand()
通过这样的方法,我们能获取seed的指针地址
进一步,我们可以计算获取free_got_addr,一个bss地址
那么下一步,我们的思路就是,泄漏libc地址,我们这个时候有了一个free的got地址,
我们可以构造 paload 去泄漏地址,然后计算system偏移 最后getshell首先我们构造三个chunk
然后将他free掉,这个时候指针并没有清零然后再去创建第四块
第四块要比之前free掉的两块都要大然后伪造 fd bk
紧着我们去free掉 第三块,去触发unlink这个时候堆上的情况如下:进一步 。我们去构造leave_me_a_message(2,p64(1)+p64(1)+p64(free_got_addr))这样的payload 可以将free地址打印出来
从而我们可以获取free的地址
最后,我们可以计算system在内存中的地址然后传入我们会发现这个时候 fd_nextsize 指向了system地址那么下一步我们去传入system的参数/bin/sh
最后再free 一次 第三个块触发一次unlink 就能get shell了
完整exp:
[培训]科锐软件逆向54期预科班、正式班开始火爆招生报名啦!!!