pwn易忘操作原理笔记
堆溢出漏洞:
一、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。
pwn易忘操作原理笔记的更多相关文章
- 关于Verilog HDL的一些技巧、易错、易忘点(不定期更新)
本文记录一些关于Verilog HDL的一些技巧.易错.易忘点等(主要是语法上),一方面是方便自己忘记语法时进行查阅翻看,另一方面是分享给大家,如果有错的话,希望大家能够评论指出. 关键词: ·技巧篇 ...
- Linux考试易忘命令
这是为了考试而做的笔记 mv命令可以移动可以改名 mv a /test //移动a到test文件夹下 mv a b //把a改名为b 软链接和硬链接的创建 ln -s profile a //prof ...
- C#易忘点
下面是自己总结的一些C#语言方面用的少容易忘的地方,总结一下,在用的时候看一下.(仅针对本人) 参数数组 定义一个函数,用来取得数字的和,但是数字的个数不确定. 解决方案: 1,定义一个函数,参数传递 ...
- python学习手册中的一些易忘的点(前三部分)
1.ubuntu下让python脚本可直接运行: test.py文件(后缀可省)#!/usr/bin/pythonprint('wwwww') sudo chmod +x ./test.py (sud ...
- jQuery学习易忘细节
1.类似于alert(""),但不会中断页面操作:console.log("last"); 2.javascript是HTML5以及所有现代浏览器中的默认脚本语 ...
- Javascript备忘复习笔记2
一.函数与形参 1.函数 function abs(x) { if (x >= 0) { return x; } else { return -x; } } alert(abs(-10)); 2 ...
- Javascript备忘复习笔记1
一.字符串操作 1.大小写 var s = "hello"; undefined g = s.toUpperCase(); "HELLO" g; "H ...
- tableView使用的易忘技术点(相对于自己)
1.在tableView设置右向导航指示箭头 cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator; 2.tableView的系 ...
- linux日常易忘指令
1.编辑全局指令 进入~/.bash_profile 增加"exprot +(启动文件的地址)" source ~/.bash_profilr(刷新) 2.修改mysql密码 my ...
随机推荐
- webpack优化
注:总结自吴浩麟---<webpack深入浅出>第四章--优化 1.缩小文件的搜索范围 1.1 优化loader:module.rules中,使用test,include,exclude尽 ...
- Exp1 PC平台逆向破解
本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,getShell,会返 ...
- 机器学习中模型泛化能力和过拟合现象(overfitting)的矛盾、以及其主要缓解方法正则化技术原理初探
1. 偏差与方差 - 机器学习算法泛化性能分析 在一个项目中,我们通过设计和训练得到了一个model,该model的泛化可能很好,也可能不尽如人意,其背后的决定因素是什么呢?或者说我们可以从哪些方面去 ...
- 0426JavaSE01day02.txt=========正则、Object、包装类详解
正则表达式 基本正则表达式:正则表达式简介.分组(). "^"和"$" String正则API:matches方法.split方法.replaceAll方法 O ...
- 暑假闲着没事第一弹:基于Django的长江大学教务处成绩查询系统
本篇文章涉及到的知识点有:Python爬虫,MySQL数据库,html/css/js基础,selenium和phantomjs基础,MVC设计模式,ORM(对象关系映射)框架,django框架(Pyt ...
- linux 上安装图形界面
linux 上安装 vncserver 后,图形界面里只有灰底和一个terminal 框, 解决方法: 修改 .vnc/xstartup为 unset SESSION_MANAGER # exec / ...
- QT背景颜色,菜单颜色更改
1.进入QT上置菜单栏 工具->选项 2.进入选项中 环境->interface (1)颜色:点击重置是默认颜色,想修改其他颜色,点击重置旁边的颜色自行选择. (2)Theme:这个里面提 ...
- Standford NLP study
Homepage https://stanfordnlp.github.io/CoreNLP/index.html Source Code: https://github.com/stanfordnl ...
- Q查询条件
e. Q查询 ``` def search(self, query_list): query = self.request.GET.get('query', '') # 获取query的值 # Q(Q ...
- MFC常用宏
MFC调试宏 TRACE() 其形式与函数printf()的参数一样,功能是在调试运行时把表达式的值输出到Output调试窗口. Debug版有效 ASSERT()——断言宏, 表达式为真,则程 ...