题目名称baby_heap
操作内容:
这道题说实在想复杂了,也算是我知识浅薄吧,看到那个环境变量没想到怎么用
跟对队友交流一直在用io进行攻击
两种做法:
先说我们最开始的做法
主要手法:一次部署并largetbin attack+House of apple2 + house of cat +rop+shellcode攻击
存在uaf漏洞
首先堆块申请被限制了且只有一次修改的机会
这让我们非常的困扰如何进行IO攻击
我给队友假设我们可以在一个堆块里控制bk_nextsize为_IO_list_all-0x20的位置,并部署好IO_FILE结构体以及_IO_str_jumps表的内容
然后我的队友想起来了曾看过学长的文章有关这个内容
https://zikh26.github.io/posts/19609dd.html?highlight=house+of+apple
最终得到了答案,在申请一个同样大小的小堆块即可
解决了这个问题
此时并为申请小堆块
申请小堆块后
就可以达到一次性largetbin attack并部署IO结构
进行部署IO
先进行了house of apple2的构造
但是但是house of apple2是不行的,本题开启了沙箱
禁用了execve显然无法直接利用house of apple2的控制执行流就能攻击成功
利用house of cat
把_IO_switch_to_wget_mode中最后调用的最后调用的[rax + 0x18]设置为setcontext
你会发现rax的位置在我们的IO空间中
然后就是劫持程序流到我们我们的rop链上
先用mprotect申请一段部署shellcode的地址
然后执行到shellcode用openat2(系统调用号为 0x1b5)绕过沙箱
将falg读取出来,多亏队友我都不知道这个函数
然后用sendline将flag发送过来
此方法未用到一次任意地址内容写
1 | from tools import * |
第二种写法
将环境变量内的flag读出来(我感觉这应该才是正解)
泄露完libc后
利用一次任意地址将写把改为puts,且第一题
将USER环境变量换成flag?这样就可以作为我们后续的参数了
且环境变量会作为第一个参数
这样就可以打印出来了
最终的exp
1 | from tools import * |
题目名称expect_number
操作内容:
最开始一直在尝试找到可以直接跳到后门的地方一直没找到
然后去cat gift发现啥也没有
最后发现我们读入位置的第一个有个地址,好奇看了看就找了到了新大陆
存在栈溢出的地方,然后就绞尽脑汁计算修改0x60
整体思路:
\1. 利用算法进行改写对应影响rdx的值bss地址里面地址的低位改为0x60
\2. 打印出来程序地址,得到基地址
\3. 跳转到rdx对应的存在栈溢出的程序段
\4. 覆盖返回地址到后门函数,且利用c++的异常检测绕过canary
首先分析代码
存在一个 call rdx
重点函数,存在逻辑漏洞
每轮经过计算可以往*(a2 + ++(a2 + 8) + 12)写入值,结果会在下一轮赋值在进行计算然后放入下一个(a2 + ++*(a2 + 8) + 12)
计算的规律取决于v8,v8的种子是1,所以是不变的
且call rdx的rdx中的值取决于我们写入那个bss段+0x120的位置,且我们只要写的次数道280次就可以改这个值
把低位改成0x60就会执行到我们想要到的函数
计算过程(从倒数39位开始算的)
最终会执行
且我们要先show一下,泄露出程序地址
存在溢出,但程序开了canary
我们要利用c++的异常检测进行绕过canary就可以执行
最终的exp
1 | from tools import * |
- 本文作者: NEWYM
- 本文链接: http://example.com/2024/11/06/2024强网杯pwn部分wp/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!