来干!来干!
转战堆溢出,这东东确实接触的很少,听说很神奇很细腻。我也是初次接触就和大家一起共同学习下,也填补下这方面的空白。
https://sploitfun.wordpress.com/2015/02/26/heap-overflow-using-unlink/
这篇文章讲的就是堆溢出的原理,不过全是英文,估计。。。慢慢看,不急。我就结合着它给的示例程序来分析下原理,以及如何利用堆溢出。如有不妥之处,还望及时批评指正!
/*
Heap overflow vulnerable program.
*/
#include <stdlib.h>
#include <string.h>
int main( int argc, char * argv[] )
{
char * first, * second;
/*[1]*/ first = malloc( 666 );
/*[2]*/ second = malloc( 12 );
if(argc!=1)
/*[3]*/ strcpy( first, argv[1] );
/*[4]*/ free( first );
/*[5]*/ free( second );
/*[6]*/ return( 0 );
}
这就是存在堆溢出的程序了,很明显好不啦。
堆确实很难。整了好久没整出来。多亏了在师傅的帮助下,终于把unlink给整明白了。(为了记录下学习的过程,前面的内容我就不删了)
先来推荐几篇文章,主要是看一下原理,虽然我知道即使看懂了,但是利用它时还是一脸懵比。
这是一道很经典的unlink,希望从此叩开堆溢出的大门(需要程序的在下方留个言)
由于调试堆的题目需要注意很多细节,而这些细节对于一个有栈经验的选手来说应该不难懂,所以我就不会说的太明白。我主要是分析一下unlink那块代码。
按着我的习惯,先检查一下。
和堆有关的保护我也不清楚 ,我就不班门弄斧了。
试运行一下程序。这种结构很明显是个堆题。