目录

堆溢出点

伪造空闲堆块

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

如何利用

参考资料


堆溢出点

图1           堆溢出点

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


伪造空闲堆块

正常的堆块布局

图2           正常堆块布局

溢出后内存布局

图3           溢出后堆块布局


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

    FD = P->fd;                                      \
BK = P->bk; \
if (__builtin_expect (FD->bk != P || BK->fd != P, )) \
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)的更多相关文章

  1. Glibc堆块的向前向后合并与unlink原理机制探究

    i春秋作家:Bug制造机 原文来自:Glibc堆块的向前向后合并与unlink原理机制探究 玩pwn有一段时间了,最近有点生疏了,调起来都不顺手了,所以读读malloc源码回炉一点一点总结反思下. U ...

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

    1.1    SEHOP保护机制 1.1.1    SEHOP工作原理: SEHOP保护机制的核心就是检查SEH链的完整性,其验证代码如下: BOOL RtlIsValidHandler(handle ...

  3. 内存保护机制及绕过方案——从堆中绕过safeSEH

    1.1    SafeSEH内存保护机制 1.1.1    Windows异常处理机制 Windows中主要两种异常处理机制,Windows异常处理(VEH.SEH)和C++异常处理.Windows异 ...

  4. java利用反射绕过私有检查机制实行对private、protected成员变量或方法的访问

    在java中,如果类里面的变量是声明了private的,那么只能在被类中访问,外界不能调用,如果是protected类型的,只能在子类或本包中调用,俗话说没有不透风的墙.但是可以利用java中的反射从 ...

  5. git commit报错解决,绕过代码检查

    上一个项目用的svn,新项目用了git,很开心,终于学习了git了,本以为把git都学会了,但是还是遇到了一个不在自己学习的知识点范围内的问题,最后是同事帮忙解决的. 问题:第一次代码commit的时 ...

  6. SE37 绕过权限检查 ALINK_CALL_TRANSACTION

  7. linux下堆溢出unlink的一个简单例子及利用

    最近认真学习了下linux下堆的管理及堆溢出利用,做下笔记:作者作为初学者,如果有什么写的不对的地方而您又碰巧看到,欢迎指正. 本文用到的例子下载链接https://github.com/ctfs/w ...

  8. Dance In Heap(二):一些堆利用的方法(上)

    0×00 前面的话 在前面的文章里我们稍微有点啰嗦的讲解了堆中的一些细节,包括malloc.free的详细过程,以及一些检查保护机制,那在这篇文章里,我们就开始结合这些机制,以64位为例来看一看如何对 ...

  9. windows程序员进阶系列:《软件调试》之Win32堆的调试支持

    Win32堆的调试支持 为了帮助程序员及时发现堆中的问题,堆管理器提供了以下功能来辅助调试. 1:堆尾检查(Heap Tail Check) HTC,在堆尾添加额外的标记信息,用于检测堆块是否溢出. ...

随机推荐

  1. 每日英语:Vender Assault Shines Ugly Light on China's Urban Enforcers

    The sudden death of a street vendor in Hunan province on Wednesday provoked outrage chengguan, or ur ...

  2. shell学习笔记之命令(四)

    命令的类型:1>.外部命令:在命令提示符中执行的普通命令.2>.内置命令:内置命令是在shell内部实现的. 1.break命令 #!/bin/sh rm -rf fred* echo & ...

  3. SAP ECC6安装系列一:安装前硬件和软件准备

    原作者博客 http://www.cnblogs.com/Michael_z/ ======================================== 写在前面的罗嗦话 一晃就是5年,前几天 ...

  4. FreeRTOS 计数信号量

    以下转载自安富莱电子: http://forum.armfly.com/forum.php 本章节开始讲解 FreeRTOS 任务间的同步和资源共享机制,计数信号量. FreeRTOS 中计数信号量的 ...

  5. Netty 源码分析之 番外篇 Java NIO 的前生今世

    简介 Java NIO 是由 Java 1.4 引进的异步 IO. Java NIO 由以下几个核心部分组成: Channel Buffer Selector NIO 和 IO 的对比 IO 和 NI ...

  6. js获取字符串的实际长度并截断实际长度

    在项目中有这样一个需求,就是一个很长的字符串,需要截断成几组字符串,而这几组字符串里既包含汉字,又包含字母,下面提供了几种方法 1,获取字符串的长度 function getstrlength(str ...

  7. Update 语句用于修改表中的数据。

    语法: UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值

  8. HttpClient使用学习

    import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apac ...

  9. Ubuntu 编译安装搭配LNMP 环境

    这里用Nginx1.2.0+mysql5.6.33+php5.6.2搭配安装环境 ---------------------------------------------Nginx BEGIN--- ...

  10. Java千百问_05面向对象(011)_引用传递和值传递有什么差别

    点击进入_很多其它_Java千百问 1.什么是值传递 值传递,是将内存空间中某个存储单元中存放的值,传送给还有一个存储单元.(java中的存储单元并不是物理内存的地址,但具有相关性) 比如: //定义 ...