-
-
[原创] CTF2017 秋季赛 第四题 club pwn 提交
-
发表于:
2017-10-31 02:54
6455
-
[原创] CTF2017 秋季赛 第四题 club pwn 提交
double free的题
但是开了挺多保护的
这里需要一些unlink的知识,如果不会以下是参考
http://cb.drops.wiki/drops/tips-16610.html
http://cb.drops.wiki/drops/tips-7326.html
在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:
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)