文档章节

pwn易忘操作原理笔记

o
 osc_fmg49rzg
发布于 2019/03/22 21:22
字数 1209
阅读 16
收藏 0

精选30+云产品,助力企业轻松上云!>>>

堆溢出漏洞:

一、null-byte-off-by-one

漏洞原理:由于输入操作失误,导致可以把size最低字节修改为\x00,overlapchunk利用。

构造

1.freeB,此时C的presize被修改为B的大小

2.通过A的null-byte-off-by-one漏洞修改B的size大小,malloc b1,b2两个块,此时由于通过B的size去找下一个堆块的presize位置来修改,B的size被改动后,C的presize无法得到更新仍然是B的原来大小。

3.free b1,free C,free C的时候通过presize找到b1的位置判断b1未使用所以发生unlink合并。

4.申请一个大的chunk就可以覆盖到b2堆块。

二、ret2dl-runtime-resolve

这个漏洞原理是利用了程序动态链接相关知识,在程序中对一些调用动态链接库函数的got地址会在第一次调用时使用_dl_runtime_resolve函数来获取动态链接库对应函数的实际地址然后填充到got表处,调用该函数时会传递两个参数link_map和.rel.plt的偏移位置reloc_arg,link_map包含了.dynamic的指针

该漏洞主要关注里面的三个指针地址DT_STRTAB,DT_SYMTAB,DT_JMPREL,这三个指针分别指向.dynstr(字符串表)、.dynsym(符号表)、.rel.plt(重定位表),_dl_runtime_resolve的步骤大致如下:

1.通过link_map找到.dynamic的地址,然后通过.dynamic的地址获取到.dynstr,.dynsym,.rel.plt的地址

2.用.rel.plt的地址加上第二个参数reloc_arg取得动态链接库函数在重定位表中的表项,.rel.plt的结构如下:

typedef struct
{
  Elf32_Addr    r_offset; //指向GOT表的指针
  Elf32_Word    r_info;
  //一些关于导入符号的信息,我们只关心从第二个字节开始的值((val)>>8),忽略那个07
  //1和3是这个导入函数的符号在.dynsym中的下标,
  //如果往回看的话你会发现1和3刚好和.dynsym的puts和__libc_start_main对应
} Elf32_Rel;

3.通过rel的r_info字段>>8来获得.dynsym的偏移,.dynsym的结构如下:

typedef struct
{
  Elf32_Word    st_name; //符号名,是相对.dynstr起始的偏移,这种引用字符串的方式在前面说过了
  Elf32_Addr    st_value;
  Elf32_Word    st_size;
  unsigned char st_info; //对于导入函数符号而言,它是0x12
  unsigned char st_other;
  Elf32_Section st_shndx;
}Elf32_Sym; //对于导入函数符号而言,其他字段都是0

4.通过sym的st_name字段(这个字段是动态链接库函数在.dynstr的偏移位置)来找到.dynstr对应的字符串位置

5.在动态链接库中找该函数的实际地址并赋值给got表地址处

6.调用这个函数

利用手段:修改reloc_arg让.rel.plt+reloc_arg的地址在可控地址处来获取可控的r_info,通过r_info>>8+.dynsym的地址来将符号表地址修改到可控地址处sym,再通过.dynstr+sym指向可控地址获取字符串信息system,从而将system函数的地址写到其它函数的got表处,第一次调用该函数相当于调用了system函数。

三、house of orange

 这个堆溢出的利用方式使用到的知识点比较多io_file,unsortedbin attack,top_chunk attack等。

1.利用堆溢出修改top_chunk的size然后去申请一个大于size的chunk,这里会把top_chunk放到unsortedbin里然后在后面重新建一个新的top_chunk,需要满足以下几个条件:

(1)申请的大小要大于MINSIZE

(2)申请的大小要小于128*1024

(3)改后的top_chunk的size要页对齐(top_chunk+size(top_chunk)是0x1000的倍数)

(4)申请的大小+MINSIZE要大于top_chunk的size

2.再申请一个chunk会分割unsortedbin可以获得libc地址

3.修改剩下的unsorted_bin的size为0x60,bk为_IO_list_all-0x10,这样下一次申请一个chunk(大于0x60)时,会触发unsortedbin attack,将bk+0x10也就是_IO_list_all的值改为unsorted_bin的地址,由于我们无法控制main_arena附近的地址,所以我们考虑使用fp->chain来跳到下一个file结构体,这个结构体是我们可以控制的地址,fp->chain是偏移0x60的位置,正好是smallbin[6]的位置,所以之前把size改为0x60,这样unsortedbin会放入smallbin对应大小的地方也就是smallbin[6]的位置,现在smallbin[6]的位置就是之前top_chunk剩余的地址,那一块地址的内容可以事先构建好IO_FILE结构和vtable的地址

4.触发malloc报错,进入libc_message调用abort,abort调用_IO_flush_all_lockp,是IO_FIle vtable里面的内容,由于第一个IO_FILE_ALL的fp->mode不符合判断条件,所以会执行fp=fp->chain到达我们旧的top_chunk剩余的地址处,然后就会执行那个vtable中的函数,事先将该函数地址改为one_gadget即可获得shell。

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

PO模式你会吗?自动化测试PO模式分层如何实现?

一、什么是PO模式 全称:page object model 简称:POM/PO PO模式最核心的思想是分层,实现松耦合!实现脚本重复使用,实现脚本易维护性! 主要分三层: 1.基础层BasePage:封装一些最基础的s...

osc_s4e6jr85
25分钟前
5
0
lodash compact & concat

前置 本篇随笔包含 _.compact 和 _.concat 及其依赖的工具函数。 你可能需要一些 JavaScript 基础知识才能看懂一些没有注释的细节。 compact _.compact(array) 创建一个新数组,包含原数组中...

osc_xu7n68ts
25分钟前
3
0
Django快速开发实践:Drf框架和xadmin配置指北

步骤 既然是快速开发,那废话不多说,直接说步骤: 安装Djagno 安装Django Rest Framework 定义models 定义Rest framework的serializers 定义Rest framework的viewsets 配置Rest framework的...

osc_qo2uprmb
27分钟前
7
0
SQL注入原理及代码分析(一)

前言 我们都知道,学安全,懂SQL注入是重中之重,因为即使是现在SQL注入漏洞依然存在,只是相对于之前现在挖SQL注入变的困难了。而且知识点比较多,所以在这里总结一下。通过构造有缺陷的代码...

osc_axrkis5i
28分钟前
6
0
Tomcat启动流程简析

Tomcat是一款我们平时开发过程中最常用到的Servlet容器。本系列博客会记录Tomcat的整体架构、主要组件、IO线程模型、请求在Tomcat内部的流转过程以及一些Tomcat调优的相关知识。 力求达到以下...

osc_5c67s863
29分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部