伪造堆块绕过unlink检查(ctf-QiangWangCup-2015-shellman)

Posted 一肩担风月

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了伪造堆块绕过unlink检查(ctf-QiangWangCup-2015-shellman)相关的知识,希望对你有一定的参考价值。

目录

堆溢出点

伪造空闲堆块

释放时重写指向伪造堆块的指针

如何利用

参考资料

 


堆溢出点

图1           堆溢出点

  在edit函数中,没有对输入的长度和原来的长度做判断。


伪造空闲堆块

正常的堆块布局

图2           正常堆块布局

溢出后内存布局

图3           溢出后堆块布局


释放时重写指向伪造堆块的指针

    FD = P->fd;                                      \\
    BK = P->bk;                                      \\
    if (__builtin_expect (FD->bk != P || BK->fd != P, 0))              \\
      malloc_printerr (check_action, "corrupted double-linked list", P, AV);  \\
    else {                                      \\
        FD->bk = BK;                                  \\
        BK->fd = FD;

  这样就使得string_ptr1=&string_ptr1-0x18


如何利用

编辑string1的内容

图4           修改string_ptr1的内容

    可以看到,由于string_ptr1指向了& string_ptr1-0x18,所以我们修改内容时候,再一次将string_ptr1指针的值修改了。修改为指向free的GOT表项。

查看string1内容

    此时查看string_ptr1的内容就可以把free函数的地址打印出来了。

再一次编辑string1的内容

    这个时候编译string1意味着什么呢?意味着修改free的GOT表项中的地址。那么随后的free调用,起始就是调用我们写入的函数。我们写入system地址

释放string3

    free(string_ptr3)意味着什么?

    system(“/bin/sh;”)


参考资料

[1] linux堆溢出实例分析

http://tyrande000.how/2016/03/21/linux%E5%A0%86%E6%BA%A2%E5%87%BA%E5%AE%9E%E4%BE%8B%E5%88%86%E6%9E%90/

 

以上是关于伪造堆块绕过unlink检查(ctf-QiangWangCup-2015-shellman)的主要内容,如果未能解决你的问题,请参考以下文章

pwnable.kr unlink

内存保护机制及绕过方法——通过伪造SEHOP链绕过SEHOP保护机制

绕过Referer和Host检查

堆调试技巧

伪造XFF头绕过服务器IP过滤

Unlink——2016 ZCTF note2解析