漏洞代码如下
/*
Heap overflow vulnerable program.
*/
#include <stdio.h>
#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 );
printf("this is morty\n");
/*[6]*/ return( 0 );
}
第三部分的代码存在堆溢出,用户输入的argv[1]
没有长度限制,会覆盖到第二个chunk,可能会造成代码执行
这里放一个图片 heap segment
Unlink: 主要的技巧是使用‘glibc malloc’来unlink第二个chunk,达到gotentry覆写的目的,造成代码执行.上边的代码中,[5]部分是漏洞代码,代码将被执行.下面我们就来解释一下
一句话总结,就是==这个就是溢出到下一个chunk,构造特定的大小并且覆盖两个指针,实现修改一个任意地址的值==
编译
gcc -m32 -g vuln.c -z execstack -fno-stack-protector
checksec
python
>>> from pwn import *
>>> print ELF('a.out').checksec()
[*] '/root/sploitfun/unlink/a.out'
Arch: i386-32-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX disabled
PIE: No PIE (0x8048000)
RWX: Has RWX segments