首页 > 其他分享 >House Of Force

House Of Force

时间:2024-04-22 22:44:41浏览次数:20  
标签:Force House chunk victim remainder top size

House Of Force

首先介绍一下什么是House Of Force

House Of Force 是一种堆利用方法,但是并不是说 House Of Force 必须得基于堆漏洞来进行利用。如果一个堆 (heap based) 漏洞想要通过 House Of Force 方法进行利用,需要以下条件:

  • 能够以溢出等方式控制到 top chunk 的 size 域
  • 能够自由地控制堆分配尺寸的大小


一句话来说,如果我们可以控制top chunk的指针,那么我们就可以达到任意地址写,但是glibc对申请chunk进行了验证

// 获取当前的top chunk,并计算其对应的大小
victim = av->top;
size   = chunksize(victim);
// 如果在分割之后,其大小仍然满足 chunk 的最小大小,那么就可以直接进行分割。
if ((unsigned long) (size) >= (unsigned long) (nb + MINSIZE)) 
{
    remainder_size = size - nb;
    remainder      = chunk_at_offset(victim, nb);
    av->top        = remainder;
    set_head(victim, nb | PREV_INUSE |
            (av != &main_arena ? NON_MAIN_ARENA : 0));
    set_head(remainder, remainder_size | PREV_INUSE);
    check_malloced_chunk(av, victim, nb);
    void *p = chunk2mem(victim);
    alloc_perturb(p, bytes);
    return p;
}

但是当我们把size的值改成一个很大的值比如0xffffffffffffffff,那么就可以轻松绕过这个验证,一般的做法是把size改成-1,因为在进行比较时会把 size 转换成无符号数,因此 -1 也就是说 unsigned long 中最大的数,所以无论如何都可以通过验证。

remainder      = chunk_at_offset(victim, nb);
av->top        = remainder;

/* Treat space at ptr + offset as a chunk */
#define chunk_at_offset(p, s) ((mchunkptr)(((char *) (p)) + (s)))

之后会把top指针进行更新,然而size段也会更新更新方法如下

victim = av->top;
size   = chunksize(victim);
remainder_size = size - nb;
set_head(remainder, remainder_size | PREV_INUSE);

​ 所以,如果我们想要下次在指定位置分配大小为 x 的 chunk,我们需要确保 remainder_size 不小于 x+ MINSIZE。

题目链接:链接:https://pan.baidu.com/s/1lr2jAQwL9Ow5FVjzrSfbWA 提取码:tx88
查看保护,pie保护关闭

64位ida载入

首先发现了后门函数

add函数

edit函数

值得注意的是这个函数并没有对我们输入的新长度进行判断,那么我们就可以修改到top chunk的siez域,实现House Of Force

先贴一下wp我再详细解释

现在看看调试

-0x70怎么来的

前面我说了需要将top thunk指向我们想要的地方,那么0xf262a0-0xf26260=0x50,而0x10是因为chunk头部有0x10大小,因此我我们下次申请的chunk的起始地址是0xf26250 + 0x10 = 0xf26260,然后我们再修改地址为flag地址再进行调用就可以得到flag

以上均为本人理解,有任何错误烦请各位师傅即使指出
参考文章​ https://tty-flag.github.io/2021/04/20/House-Of-Force.html

标签:Force,House,chunk,victim,remainder,top,size
From: https://www.cnblogs.com/CH13hh/p/18147935

相关文章

  • Codeforces 1863F Divide, XOR, and Conquer
    记\(s_{l,r}=\oplus_{i=l}^ra_i\)。考虑到这个相当于是\([l,r]\)内分裂区间,可以考虑区间\(\text{DP}\)。即记\(f_{l,r}\)为\([l,r]\)区间是否能被遍历到。转移考虑对于\([l,r]\),考虑在已知的条件下(\(len\ger-l+1\))\([l,r]\)是否合法。即到这个状态......
  • Codeforces Round 940 (Div. 2) and CodeCraft-23 (补题中的小白)
    A.Stickogon思路:Code:#include<bits/stdc++.h>usingnamespacestd;voidsolve(){intn;cin>>n;map<int,int>mp;for(inti=1,x;i<=n;i++){cin>>x;mp[x]++;}intans=0;f......
  • clickhouse-backup(RPM方式安装)
    1.下载下载地址https://github.com/Altinity/clickhouse-backup 2.安装[root@dc-biz-ck-192soft]#rpm-ivhclickhouse-backup-2.4.35-1.x86_64.rpm 3.查看版本号[root@dc-biz-ck-192soft]#clickhouse-backup-vVersion:2.4.35GitCommit:5e41c8be05849a......
  • Codeforces Round 940 (Div. 2) and CodeCraft-23
    目录写在前面ABCDE写在最后写在前面比赛地址:https://codeforces.com/contest/1957。大病场妈的A签到。尽可能凑三角形。///*By:Luckyblock*/#include<bits/stdc++.h>#defineLLlonglong//=============================================================//======......
  • clickhouse如何表结构
     输出表名:clickhouse-client--host192.168.1.136--port=9000--password123456--multiquery--query="usedb_pushmsg;showtables;">/tmp/db_pushmsg.txt 输出表结构#!/bin/bashecho'usedb_pushmsg;'>>/tmp/db_pushmsg_tableDDL.s......
  • Codeforces Round 940 (Div. 2)
    这场还挺Edu的C.HowDoestheRookMove?Problem-C-Codeforces数学方法​ 我用的数学方法,卡了很久才推出来思路和式子。​ 首先行列其实等价,直接单考虑剩余\(n\)行就行。​ 这类题应该选择先选一个东西,然后处理剩下的东西。​ 这里好做的方法是先选\(m\)个......
  • Codeforces 954H Path Counting
    令输入的为\(a'\),同时\(a'_0=1\)。对其做一个前缀积\(a_i=\prod\limits_{i=0}^ia'_i\),对于\(i\gen\),认为\(a_i=0\)。那么\(a_i\)就相当于是深度\(i+1\)的点的个数。同时也可以得到根的深度为\(l\)时子树内深度为\(r\)的深度的点数为\(\dfrac{a_{r-......
  • Codeforces 954I Yet Another String Matching Problem
    考虑到这个答案怎么算。能发现相当于是对应的字符间相连边,那么一个连通块中的字符就要变成同一个字符。于是一个连通块的代价就是\(sz-1\)。所以令有\(x\)个连通块,最后的代价就是\(|\Sigma|-x\)。考虑到因为\(|\Sigma|=6\),而\(B_6=203\)(贝尔数,\(B_n\)意义为大......
  • 工业机器人的直接力控(Direct Force Control)
    相关:https://baijiahao.baidu.com/s?id=1785676027803650068机器人编程人员需要提前知道机器人的摩擦力、阻力、质量、重力,等数值,然后建立基于物理模型的控制方程,并根据各关节受力的情况将力指令转换为速度指令,速度指令再转换为关节扭矩和电流指令。机器人的速度传感器、位......
  • Codeforces 1824C LuoTianyi and XOR-Tree
    考虑到肯定如果能在这个节点让子树的值尽量相同肯定更好,这样子不会与上面的操作相冲突。于是有个\(\text{DP}\)的思路。记\(f_{u,i}\)为\(u\)子树内叶子节点的值都变为\(i\)的最小代价。这个有一个很好的性质,就是\(\maxf_{u,i}-\minf_{u,i}=1\)。这是因为考......