House_of_Einherjar

前引
前置知识可以参考我在notion做的笔记:https://plastic-tire-e58.notion.site/House-of-Einherjar-1a9ca45ea8a4803d9d87fda6b6413462
这里就讲例题,建议先看前置知识
例题
CTFhub上的house of Einherjar,只打了本地,题目附件:
链接: https://pan.baidu.com/s/1GCWm8ygbHHSN5glmPbGXTg?pwd=down 提取码: down
建议先patchelf,用的是Glibc2.23-0ubuntu11.3_amd64
漏洞分析
首页还是一个简单堆,来看看各个部分在干什么
- add
这个地方漏洞点还是很明显的,没有对输入的size进行检查,而且还可以申请很多chunk
1 | int add() |
- delete
对free掉的指针进行了清零,所以我们不能用UAF了
1 | __int64 delete() |
- show
就是正常的输出,可以泄露libc
1 | unsigned __int64 show() |
- edit
一眼就可以看到有个off by one,但是仔细观察可以发现,v2的取值依赖于上一次进入该函数的chunk的size,也就是说,只要上一个进入该函数的chunk的size比现在进入该函数的chunk的size大,那么就可以造成堆溢出,任意改内容,off by one的漏洞其实就被忽略了,因为我们实际溢出的范围大多了。
1 | int edit() |
总结
漏洞点其实还是很明显的,在edit函数里面,只要上一个进入该函数的chunk的size较大,那么我们就可以造成堆溢出,而且edit函数还可以无限次利用,很爽🥰🥰。
即使题目不能用UAF,但是我们还是可以溢出改写freechunk,因此该题目其实有两种方法
house of orange
和house of Einherjar
,下面都讲一下:
house of orange
可以参考这篇文章先:http://downbeat.top/2025/03/07/2024ciscn-PWN%E5%A4%8D%E7%8E%B0/
这题目的手法可以说一模一样,区别于最后调用ogg那里要结合realloc改一改
由于我们任意改的前提是上一次进入edit的chunk的size要大于当前的chunk的size,那么我们可以一直利用edit来实现我们想要写入的size,下面直接见EXP吧(关于realloc在EXP后面说):
EXP
1 | from pwn import * |
- 这里简单说一下
realloc
由于ogg的实现是有条件的,有时候我们直接修改malloc_hook为ogg有时候栈上的结构并不能满足ogg的要求,这时候我们就要修改realloc__hook为ogg,然后改malloc_hook为realloc+n。
这样改的目的是在调用malloc
的时候,会去调用realloc
,然后realloc
又会调用realloc_hook
,再到ogg
1 | malloc -> malloc_hook -> realloc -> realloc_hook -> ogg |
至于为什么+n,我们来看看realloc函数:
可以发现,这里有很多push的操作,借用这些操作我们可以调整栈结构,找到合适的+n就可以满足ogg的条件,从而get shell,来看看实现吧
- malloc -> malloc_hook -> realloc
- realloc->realloc_hook->ogg
这里有一个rsp-0x38的操作,第一个ogg执行的条件是[rsp+0x30]=NULL,看第二张图片,可以我们只要push一次,然后rsp-0x38就可以使得该条件成立,然后call rax执行ogg的时候就可以get shell了。
- 看看执行:
house of Einherjar
- 就简单讲一下泄露libc的方法吧,后面的攻击手法还是一样的,Arbitrary_alloc+realloc调整
1 | add(0,0xf0) |
如上面所示,申请四个chunk,第四个防止合并top chunk,用chunk2来向下合并,chunk1来泄露libc。
原理其实是堆堆叠,正常溢出修改prev_size为前两个chunk size的和,然后修改size的p位即可,由于用 off by one的时候会造成换行符的覆盖,所以就没用off by one了。
然后free(2)就会使得chunk2向下合并,再次malloc(chunk0->size),那么原先chunk1的user_data就会有着main_arena+88,然后直接show出来即可,就获得libc了
这种方法比较巧妙,也算是house of Einherjar的利用,但是由于题目比较简单,因此方法挺多的,就不多赘述了
- 标题: House_of_Einherjar
- 作者: D0wnBe@t
- 创建于 : 2025-03-10 19:35:01
- 更新于 : 2025-03-10 21:35:48
- 链接: http://downbeat.top/2025/03/10/House-of-Einherjar/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。