House of Spirit学习调试验证与实践
作家:Bug制造机
House of Spirit和其他的堆的利用手段有所不同。它是将存在的指针改写指向我们伪造的块(这个块可以位于堆、栈、bss任何一个位置)并且free掉欺骗glibc达到把伪造块回收到bins中不过在free之前,需要设置当前伪造块和下一个伪造块的size字段,满足free()的安全检测机制,从而欺骗glibc。
下面是一个demo小程序先感性的体会下:
#include<stdio.h>
#include<stdlib.h>
struct fast_chunk
{
size_t pre_size;
size_t size;
struct fast_chunk *fd;
struct fast_chunk *bk;
char buf[0x20];
};
int main(void)
{
struct fast_chunk fake_chunks[2];
void *ptr,*victim;
ptr=malloc(0x30);
fake_chunks[0].size=sizeof(struct fast_chunk);
fake_chunks[1].size=sizeof(struct fast_chunk);
ptr=(void *)&fake_chunks[0].fd;
free(ptr);
victim=malloc(0x30);
}
调试验证
申请两块fake_chunk。

所以:
&fake_chunks[0]=0x7fffffffdda0
&fake_chunks[1]=0x7fffffffdde0
为绕过安全监测机制,设置好当前块和下一块的size字段

改写一个指针指向伪造的块

因为是fd的地址,所以是:0x7fffffffddb0
free之后,伪造的块已经加入到了fastbin的链表中去了

此时再申请和伪造的块大小一样的块
返回了和之前free的伪造块一样的块。
至于地址为什么是&fake_chunks[0]+0x10是因为返回的可用memory就是位于pre_size和size字段之后。这个和chunk的结构有关
为什么当前构造块和下一个构造块要填充size字段?
分析下free的源码就知道了:
void
public_fRE(Void_t* mem)
{
mstate ar_ptr;
mchunkptr p; // mem相应的chunk
...
p = mem2chunk(mem); //将 mem转换为chunk地址
if (chunk_is_mmapped(p)) //检查chunk的mmp位
{
munmap_chunk(p); //用unmmap的方式直接取消映射
return;
}
...
ar_ptr = arena_for_chunk(p); //找到chunk对应的area
...
_int_free(ar_ptr, mem); //调用init_free()函数进入正常的free块并检测以及回收的流程
}
为了让伪造的块进入到正常的free流程,所以要使得构造的当前chunk的size字段的mmp对应位是0就行了。
接下来是_init_free函数:
void _int_free(mstate av, Void_t* mem)
{
mchunkptr p; // mem相应的chunk
INTERNAL_SIZE_T size; //size,大小
mfastbinptr* fb; //联系fast bin
...
p = mem2chunk(mem); //memory转换为chunk
size = chunksize(p); //获得chunksize
...
if ((unsigned long)(size) <= (unsigned long)(av->max_fast)) //当前chunk的size字段的比较,不能超过fastbin的最大值
{
if (chunk_at_offset(p, size)->size <= 2 * SIZE_SZ
|| __builtin_expect(chunksize(chunk_at_offset(p, size))
>= av->system_mem, 0)) //比较下一个chunk的size字段,2*SIZE_ZE<chunksize<av->system_mem
{
errstr = "free(): invalid next size (fast)";
goto errout;
}
...
fb = &(av->fastbins[fastbin_index(size)]);
...
p->fd = *fb;
*fb = p;
}
}
所以要设置好下个chunk的size字段。
看懂了,在网上找了道题练练手:
xdctf2016的pwn200:
虽然存在另外的解法,这里不管,只是为了学习HouseOfSpirit。
先分析流程:

存在offbyone,只要完整的输入48个字节,就会泄露出ebp的值,因此是可以使用shellcode的,至于怎么触发shellcode,肯定需要修改返回地址,由于程序在每个函数返回前会进入下一个函数执行,因此在开始的函数里面想要直接写入返回地址,得避免破坏掉调用的子函数的栈帧才行,不太可能
执行测试就知道:
划线的就是泄露的ebp的值。
输入id的值。
然后进入:
申请了一个块,然后先通过buff获得输入,然后再通过strcpy复制到申请的块当中,并将块的地址赋值到全局变量的指针ptr中去,并且这个ptr是可以被覆盖重写的。
然后进入:
这个函数的内容和经典的菜单题没什么区别。
checkout函数是把块给free掉
checkin则是申请块,并填充块的内容:
仔细调试分析可以发现,在提示输入who are u?的函数里边,id是我们可以控制的,然后进入了函数400A29
然后分配了money局部变量,也是我们可控的,stack的图大致如下
=============stack===================
money
...
返回地址
...
id
=====================================
money和id都是可控的。就返回地址不可控,再结和文章开始houseofspirit的使用条件是两个可控的chunk。
那其实这道题是HouseOfSpirit,已经很明显了。
解题思路
从程序流程开始,先在栈中布置shellcode,并泄露出ebp的值,从而计算出shellcode在栈中的值。
输入id作为下一个chunk的size字段的id的值
将局部分量money伪造成一个chunk,构造好大小并且使得大小把返回地址包括在内,把ptr的值溢出覆盖为构造的chunk的地址,这个地址可以通过泄露的ebp计算出来
free掉伪造的chunk
重新申请大小和伪造的chunk一致的块,使得系统将伪造的chunk分配给我们
- 申请回来之后,返回地址就是我们可控的了,再将shellcode的地址写入返回地址处,控制程序返回就可以getshell
栈中布置图
在本地调试时,获得了关键的变量的地址,然后自己拼了这个图:
调试关键:
[md]0x400ac7处打断点,查看泄露ebp以及shellcode布置相关
0x400b26处打断点,查看id在栈中的位置
0x400a5f处打断点,伪造chunk
exp
阅读原文可查看源文件哦~
House of Spirit学习调试验证与实践的更多相关文章
- 【原创 深度学习与TensorFlow 动手实践系列 - 1】第一课:深度学习总体介绍
最近一直在研究机器学习,看过两本机器学习的书,然后又看到深度学习,对深度学习产生了浓厚的兴趣,希望短时间内可以做到深度学习的入门和实践,因此写一个深度学习系列吧,通过实践来掌握<深度学习> ...
- ML平台_微博深度学习平台架构和实践
( 转载至: http://www.36dsj.com/archives/98977) 随着人工神经网络算法的成熟.GPU计算能力的提升,深度学习在众多领域都取得了重大突破.本文介绍了微博引入深度学 ...
- 2017-2018-1 20155320 《信息安全系统设计基础》第四周学习总结(课堂实践补交+myhead与mytail加分项目)
2017-2018-1 20155320 <信息安全系统设计基础>第四周学习总结(课堂实践补交+myhead与mytail实现) 课堂实践内容 1 参考教材第十章内容 2 用Linux I ...
- 基于深度学习和迁移学习的识花实践——利用 VGG16 的深度网络结构中的五轮卷积网络层和池化层,对每张图片得到一个 4096 维的特征向量,然后我们直接用这个特征向量替代原来的图片,再加若干层全连接的神经网络,对花朵数据集进行训练(属于模型迁移)
基于深度学习和迁移学习的识花实践(转) 深度学习是人工智能领域近年来最火热的话题之一,但是对于个人来说,以往想要玩转深度学习除了要具备高超的编程技巧,还需要有海量的数据和强劲的硬件.不过 Tens ...
- 深度学习---1cycle策略:实践中的学习率设定应该是先增再降
深度学习---1cycle策略:实践中的学习率设定应该是先增再降 本文转载自机器之心Pro,以作为该段时间的学习记录 深度模型中的学习率及其相关参数是最重要也是最难控制的超参数,本文将介绍 Lesli ...
- Extjs的学习及MIS系统实践应用
Extjs的学习及MIS系统实践应用(系列文章) 本系列文章从Extjs的实际运用出发,结合系统开发的实践经验,详细解释Extjs的基本控件及控件扩展的用法,和在平时的学习运用中一步一步查阅的资料.积 ...
- MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.7 Adding a wms layer
MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.7 Adding a wms layer 前言 Add OGC WMS Layers( ...
- MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.6 Defining Projections and Extents
MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.6 Defining Projections and Extents 一.前言 当在m ...
- MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.5 Adding a raster layer
MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.5 Adding a raster layer 一.前言 MapServer不仅支持 ...
随机推荐
- 在C++程序中自动加入svn版本号
原创文章,欢迎阅读,如果您想转载,请在第一行醒目注明原作者和原始链接. 为了方便追查和确认软件bug等问题,给软件或者库赋予版本号是个好办法. 最简单的版本号管理是记录编译时间: cout<&l ...
- python_08 函数式编程、高阶函数、map、filter、reduce函数、内置函数
函数式编程 编程方法论: 1.面向过程 找到解决问题的入口,按照一个固定的流程去模拟解决问题的流程 (1).搜索目标,用户输入(配偶要求),按照要求到数据结构内检索合适的任务 (2)表白,表白成功进入 ...
- 解决Windows 10 1803 April 2018 Updatete不能网络共享的问题
Windows 10升级到1803后便不能网络共享了,现在我用的是Widnows 10 1809 Oct 2018 Update依然存在这个问题. 为了能够共享文件和文件夹需要去windows ser ...
- WIN10在loadrunner安装或path4插件安装时遇到的管理员阻止程序运行---解决方案(可用)
方法1:关闭用户账户控制1.“win+x”进入控制面板,选择安全性与维护,在左侧更改windows smartscreen筛选器设置,选择"不执行任何操作",单击确定即可.2.“w ...
- pythone函数基础(8)内置函数学习
内置函数学习# sorted# map# filter# max# sum# round# chr# ord# dir# bool# eval# exec# zipimport mathres = m ...
- Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: javax/jms/JMSContext
参考链接 : https://blog.csdn.net/angus_Lucky/article/details/82811946?utm_source=blogxgwz7 org.springfra ...
- python 常用标准库
标准库和第三方库第一手资料: 在线: 官方文档(https://docs.python.org/) 离线:交互式解释器(dir().help()函数),IPython(tab键提示.?.??) 一. ...
- Laravel-nestedset that base left and right values tree package
This is a Laravel 4-5 package for working with trees in relational databases. Laravel 5.5, 5.6, 5.7, ...
- UI与开发的必备神器!— iDoc一键适配不同平台尺寸(iDoc201902-2新功能)
一.自动换算不同平台尺寸在一个项目从设计到开发的过程中,为了适配不同设备,一份设计稿,UI需要花大量的时间去制作各种尺寸的切图,耗时耗力. 那有没有一种高效的办法,让UI只需要设计一份设计稿就可以了呢 ...
- 《C#从现象到本质》读书笔记(九)第11章C#的数据结构
<C#从现象到本质>读书笔记(九)第11章C#的数据结构 C#中的数据结构可以分为两类:非泛型数据结构和泛型数据结构. 通常迭代器接口需要实现的方法有:1)hasNext,是否还有下一个元 ...