Unlink原理和一些手法

简单介绍一下unlink相关的知识

unlink是利用glibc malloc 的内存回收机制造成攻击的,核心就在于当两个free的堆块在物理上相邻时,会将他们合并,并将原来free的堆块在原来的链表中解链,加入新的链表中其目的是把一个双向链表中的空闲块拿出来(例如 free 时和目前物理相邻的 free chunk 进行合并)比如说数组这类的.........等等。

前提是我们可以进行溢出修改下一个chunk的fd和bk指针

当我们实现unlink的时候就可以任意地址写,但是现实是残酷的,现在的unlink加了很多保护,我们先看一下定义。

#define unlink(P, BK, FD) {
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);
else {
FD->bk = BK;
BK->fd = FD;
if (!in_smallbin_range (P->size)
&& __builtin_expect (P->fd_nextsize != NULL, 0)) {
assert (P->fd_nextsize->bk_nextsize == P);
assert (P->bk_nextsize->fd_nextsize == P);
if (FD->fd_nextsize == NULL) {
if (P->fd_nextsize == P)
FD->fd_nextsize = FD->bk_nextsize = FD;
else {
FD->fd_nextsize = P->fd_nextsize;
FD->bk_nextsize = P->bk_nextsize;
P->fd_nextsize->bk_nextsize = FD;
P->bk_nextsize->fd_nextsize = FD;
}
} else {
P->fd_nextsize->bk_nextsize = P->bk_nextsize;
P->bk_nextsize->fd_nextsize = P->fd_nextsize;
}
}
}
}

大多是一些保护,其中最重要的是下面这个

//检查p和其前后的chunk是否构成双向链表
if (__builtin_expect (fd->bk != p || bk->fd != p, 0))
malloc_printerr ("corrupted double-linked list");

这是一个关键 check ,那么如何绕过检查呢?

64位满足以下式子32位依次类推:

P->fd->bk == P <=> *(P->fd + 0x18) == P
p->bk->fd == P <=> *(p->bk + 0x10) == P

那么我们可以将fd设置为*p-0x18 bk设置为*p-0x10,那么我们就可以绕过检查,那么当我们free下一个chunk的时候就会进行合并,实现了unlink,那么当我们再次修改该chunk的时候指针就会指向*p-0x18的位置进而实现任意地址写。

我们通过题目看一下具体用法题目链接https://pan.baidu.com/s/1lEba9fl8Yt56MvC6fj3xjQ?pwd=w6du提取码:w6du

首先看保护

got表可修改,我们ida载入看一下

是一些菜单什么的,其中有一个隐藏选项,看一下

好家伙是后门函数,但是他有条件,magic处地址的值必须大于等于114514才可以执行

值得注意的是edit函数没有对我们输入的修改长度进行检查,那么我们可以使用unlink修改magic地址的值

思路:

1.先申请4个较大的chunk(方便到时候我们进行伪造)4个chunk是因为*p-0x18可以指向第一个chunk,最后一个用来free

2.编辑chunk进行伪造修改bk和fd指针,实现unlink

3.修改magic处地址的值为理想的值,选择隐藏选项得到flag

先贴一下wp我再详细解释

这里采用下标为3的数组是因为当设置完bk和fd之后会指向第一个下标(*p-0x18),那么我们再次修改下标为0的chunk数据是理想数据下标为3的数组为magic地址那么

相当于magic的地址为我们理想的值(3->0->magic)中间把下标为3的chunk分割成了两个chunk,伪造fd和bk以及下一个chunk的头部使当前chunk为free状态,那么再free下一个chunk就可以完成unlink,最后再进行修改就好啦具体可以参考这个图和这个链接https://blog.csdn.net/qq_35493457/article/details/105857572

Unlink原理和一些手法的更多相关文章

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

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

  2. Web开发,浏览器通讯原理及流程那点事,你应该听说下

    题外话: 最近园子里,关于.net门槛的文章风风火火,不过这类事情每过段时间就会出来一次,所以酱油都懒的打了. 当然个人也是有想法的,特别是这两天碰巧和一个三四年经验的java开发者呆在一起,对方说. ...

  3. 动态修改字节码以替换用反射调用get set方法的形式

    1. 起因 在前两天,为了解决websphere和JDK8上部署的应用发起webservice调用(框架用的cxf)时报错的问题,跟了一些代码,最终发现可以通过加上参数-Dcom.sun.xml.bi ...

  4. 二十五:XSS跨站值原理分类及攻击手法

    HTML DOM树 XSS跨站产生原理,危害,特点 本质,产生层面,函数类,漏洞操作对应层,危害影响,浏览器内核版本 XSS是什么? XSS全称跨站脚本(Cross Site Scripting),为 ...

  5. HTTPS那些事(一)HTTPS原理

    转载来自:http://www.guokr.com/post/114121/ 谣言粉碎机前些日子发布的<用公共WiFi上网会危害银行账户安全吗?>,文中介绍了在使用HTTPS进行网络加密传 ...

  6. Linux堆溢出漏洞利用之unlink

    Linux堆溢出漏洞利用之unlink 作者:走位@阿里聚安全 0 前言 之前我们深入了解了glibc malloc的运行机制(文章链接请看文末▼),下面就让我们开始真正的堆溢出漏洞利用学习吧.说实话 ...

  7. 跟vczh看实例学编译原理——一:Tinymoe的设计哲学

    自从<序>胡扯了快一个月之后,终于迎来了正片.之所以系列文章叫<看实例学编译原理>,是因为整个系列会通过带大家一步一步实现Tinymoe的过程,来介绍编译原理的一些知识点. 但 ...

  8. HTTPS那些事(一)HTTPS原理(转载)

    原创地址:http://www.guokr.com/post/114121/   楔子 谣言粉碎机前些日子发布的<用公共WiFi上网会危害银行账户安全吗?>,文中介绍了在使用HTTPS进行 ...

  9. unlink和close关系

    今天看到nginx用文件锁实现互斥的实现方案时,发现,unlink文件后还可需用fd,很是纳闷!于是搜索到此文,并自测了下,涨姿势了~分享给大家~ 原理: 每一个文件,都可以通过一个struct st ...

  10. XSS的原理分析与解剖

    0×01 前言: <xss攻击手法>一开始在互联网上资料并不多(都是现成的代码,没有从基础的开始),直到刺的<白帽子讲WEB安全>和cn4rry的<XSS跨站脚本攻击剖析 ...

随机推荐

  1. FFmpeg开发笔记(四)FFmpeg的动态链接库介绍

    FFmpeg不仅提供了ffmpeg.ffplay和ffprobe三个可执行程序,还提供了八个工具库,使得开发者能够调用库里面的函数,从而实现更精准的定制化开发需求.这八个库的名字是avcodec.av ...

  2. 假期做了一项调研:大厂为啥都自研RPC?结果合乎情理!

    大家好,我是冰河~~ 五一假期过的可真快,今天开始,又要搬砖了.在五一假期当中,冰河做了一项调研,感觉结果还是挺合乎情理的. 翻看招聘信息 先来看我在某招聘网站上随便搜索了下Java招聘的岗位,看到的 ...

  3. Oracle PL/SQL 中的 CHAR 和 VARCHAR2 比较

    https://docs.oracle.com/cd/B14117_01/appdev.101/b10807/b_char.htm SQL 标准要求被比较的两个字符值具有相等的长度.如果比较中的两个值 ...

  4. zynq之TF卡写入函数f_printf

    zynq之TF卡写入函数f_printf 1.基本原理 前面使用f_write写入了数据到TF(SD)卡中,可以实现较短字符串的写入.当字符增加时,容易出现乱码.而f_printf则是专门用于字符串写 ...

  5. KingbaseES Json 系列一:Json构造函数

    KingbaseES Json 系列一--Json构造函数(JSON,ROW_TO_JSON,TO_JSON,TO_JSONB) JSON 数据类型是用来存储 JSON(JavaScript Obje ...

  6. Python---flask框架实现免密登录功能

    思路总结: html代码: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta c ...

  7. docker运行javaWeb服务,操作文件异常

    一.问题由来 部署一个测试服务在自己的服务器上面,然后运行其中的一个功能.然后报错,报错信息如下 二.问题分析 自己一开始也很疑惑,怎么会出现这个问题呢,自己明明把对应的文件放在对应的目录下面,并且已 ...

  8. Jetty的http-forwarded模块

    启用http-forwarded模块,执行如下命令: java -jar $JETTY_HOME/start.jar --add-modules=http-forwarded 命令的输出,如下: IN ...

  9. OHOS IDE和SDK的安装方法

    参照OpenHarmony应用开发环境安装流程,下载安装OHOS的IDE,过程中需要全程联网. IDE,安装至D:\Tools\Huawei\DevEcoStudio. IDE安装成功之后,按照提示下 ...

  10. OpenHarmony社区运营报告(2023年12月)

      • 截至2023年12月22日,OpenAtom OpenHarmony(简称"OpenHarmony")社区累计超过6700名贡献者,产生26.9万多个PR,2.4万多个St ...