💪Hgame 2024 复现
2024-3-5
| 2024-10-13
0  |  Read Time 0 min
type
status
date
slug
summary
tags
category
icon
password
 
我真的太菜了!!今年一定要超出game范畴!

Week 2

tcache posion

这是一道模板题,是关于tcache posion的一道模板题
我们知道在2.31之后其实tcache dup基本就是不能用的,要用也是用house of botcake来实现dup操作
当然,这道题还没有达到这个程度,他只是一道比较简单的签到题,或者就是一个不需要思考的poison题
打开反汇编:
notion image
add函数:两个数组,一个存地址,一个存size
notion image
del函数,uaf很明显
notion image
edit函数,可以对free或者对没有free的都进行edit
notion image
show函数,同上,都可以show
exp:
这里我们也可以用它来总结一下:
  • 在堆类型题目,想要拿libc的地址最简单的还是使用main_arena
  • tcache bin的poison,可以进行,但以防万一还是使用一条0x80大小来进行libc的leak,另一个像是0x20这种用来进行poison(至少在2.31中这种操作是可以的,其实单用一个大小的链也可以,就是转换着很麻烦)

shellcodemaster

又是一道shellcode题目,这道题目目的是想要让新生学会对shellcode进行缩减,来达到执行shellcode的目的,同时也利用了mprotect调用
查看限制,发现没有pie:
notion image
不过这个限制在这个题目中没有什么用
然后看反汇编代码:
notion image
发现首先用mmap申请了一个内存空间在0x2333000处,这个地址被赋予给了buf变量,然后我们可以对这个空间进行0x16个字节的写入,然后用mprotect 函数,将这片地址空间变成了仅可写的权限。
我们可以就此展开操作:
  • 为应对0x16的字节输入,我们可以想到先输入进一个read系统调用,来绕过这个0x16的字节输入。
  • 如果我们要read进入其他的地方,后续的操作相对有点麻烦,所以可以进行对mprotect的二次修改,也就是我们在这0x16字节中加入mprotect系统调用,将这篇内存修改为可以写入,然后在使用read
这里是代码:

fastnote

这个题是考查了关于是2.31中的dup,具体来说是fastbin dup,在2.31中确实是要比house of botcake方便不少,起码是直接就可以进行的思路
做题思路如下:
  • 首先利用unsorted bin的main_arena来leak glibc
  • 然后重新申请0x20的chunk,申请9个并都释放,对多出来的两个分别命名chunk1、chunk2
  • 再次释放chunk2,这样在fastbin中就是chunk2→chunk1→chunk2
  • 申请chunk2,content写free_hook地址,bin中现在就是chunk1→chunk2→free_hook
  • 连续申请三个,第三个的content写system地址,这样就完成将system写入free_hook
exp
 

week 3

Elden Ring Ⅲ

这个题其实是一个涉及到了largebin attack的题目,我们首先看看反汇编
notion image
可以看到add函数中,只能进行对大于0x4ff的chunk的赋予,这个chunk由于已经远远大于small bin的范围(0x3f0,在某些版本中),所以当它们被完整释放之后一定是会进入large bin
large bin attack的逻辑是这样的:
  • 首先有一个chunk进入large bin,同时这个chunk是可以被修改的(由于UAF或是其他漏洞)
  • 将这个large bin的fd_nextsize和bk_nextsize修改为任意写的地址-0x20 ,这个任意写的地址会被看作是一个假chunk,这样在进行后一个largebin的添加的时候,链表之间链接的逻辑会将新进入的large bin的chunk地址赋予给这个 任意写的地址 (具体是由于源码中的这行代码),它将新的chunk地址赋予给了虚假的victim->bk_nextsize->fd_nextsize
  • 这样我们就可以实现任意地址写的功能,但是能够写的值都是chunk地址
在这个题中,通过这个attack将mp_结构体中的值进行了修改,mp_结构体是这样的:
notion image
可以看出它负责关于tcache bin的相关数据,这个结构体中的tcache_bins 项就代表了tcache_perthread_struct 中的数组大小TCACHE_MAX_BINS ,如果我们将这个参数进行修改,可以看作我们将tcache bin的范围远远扩大,0x500大小的chunk这下可以直接进入tcache bin而不是unsorted bin了
由于还有UAF,这样就可以实现tcache posion来进行free_hook的修改了
exp如下:
注意:在2.31以后的large bin attack,如果free的chunk大于large bin中的chunk,会报double free的错误,具体代码如下:
具体逻辑我还需要在研究研究,但是尝试着确实是存在报错问题,如果有大佬的看到这个博客希望可以帮我解释一下呜呜。

off-by-null(house of einherjar)

这个题是一个考察off-by-null和malloc_consolidate的题目,所以我就直接把它叫做off-by-null了
malloc_consolidate :用于将 fastbin 中的空闲 chunk 合并整理到 unsorted_bin 中以及进行初始化堆的工作
💡
注意:malloc_consolidate只能实现在除tcache bins以外的bin中,可能是因为tcache bin中的结构体是由tcache_entry构成的链表,和chunk存在细微区别,所以在malloc的源码中关于malloc_consolidate中没有关于tcache bin的内容
注意:在进行malloc_consolidate中,使用house of einherjar的时候,之所以只能将本chunk的低地址的一个被free的chunk来进行malloc_consolidate,是因为源码就是如此:
可以看出后面是会进行unlink的,这个unlink就是针对在bin中的chunk的操作
收获:
  • 学习到了在获取libc地址时,利用unsorted bin的不断切割来实现
  • 同时学习到了在如果tcachebin被malloc空,同时相同大小的fastbin仍存在,那么在fastbin中的chunk被利用时,剩下的chunk会自动进入tcache bin中
exp:
  • CTF-WP
  • XYCTF 2024VNCTF 2024 复现
    • Giscus
    • Cusdis
    Catalog