漏洞代码如下

/*
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