2023-ciscn-华中赛区-pwn-wp
本文最后更新于:2023年7月9日 下午
2023-ciscn-华中赛区-pwn-wp
muney
检查保护
没开PIE,且got表可写。
程序首先对我们输入的内容进行进行解析,接下来就是常规的菜单堆题了。
至于解析格式,从题目输出HTTP_Parser> 可知,应该对http参数进行解析。这里,我们随便抓一个包,获取http请求参数,然后结合动态调试就可以得到输入格式。
1 |
|
接下来,我们分析菜单功能。这里我们主要关注add 、edit 与 quit 这三个函数。
add函数通过解析http头获取size。比较恶心的一点是size必须>0xfffff,也就是使用mmap分配堆块。
edit函数并没有检查ofsize的正负性,存在负数溢出,一次最多可以写8个字节。
quit函数exit第一个参数是”/bin/sh” 。这里不难想到修改exit的got表为system。
这道题的难点在于使用mmap分配堆块,比赛时也是想了很久,也没想出来。这道题最终只有1解,是华科的师傅们解出来的。太厉害了。
这道题的利用方法是house of muney,之前都没听过。这次也算是长了见识。
- 使用mmap偷取libc内存,把不可写的部分变为可写。
- 伪造bitmask_word、bucket、hasharr与exit_sym的st_value字段
- 动态解析执行system。
这里主要说说如何获取bitmask_word这些关键字段。
这里,我们需要跟踪exit函数的动态解析过程。
以下是exit动态解析大致调用链。
这里的关键就是do_lookup_x函数,我们需要的关键字段都是在这个函数获取的。
同理,继续向下跟踪就可以获取剩下的参数。
需要注意的是,我们跟踪的是第二次解析过程,也就是i=1时的字段内容。
最终脚本如下:
1 |
|
pwn-lvm
这道题比赛时0解。说实话有点无语,比赛时笔者把断点下在了sub_8050函数开头,就是进入不了关键逻辑。没单步几步就退了,以为有什么特殊的过滤。结果复现时,笔者又尝试把断点直接下在了关键逻辑处,发现可以直接进入关键逻辑。还是太菜了。
检查保护。
几乎什么保护都没开。
程序也是一个常规的菜单堆。
Edit函数被没有检查offset的大小,存在堆溢出。
Alloc函数分配了一段可读可写可执行的区域。
EditAlloc函数对我们分配的区域进行写。
大致利用思路就是,
- 在我们分配的可读可写可执行区域写入shellcode。
- 通过堆溢出覆盖tcache的next字段,实现任意地址分配。
- 覆盖free_got为shellcode。
说实话,笔者对这个调用链也有点迷。多次调试发现exit退出时,执行了opt-10的free_got,也就是我们的shellcode。
最终wp如下:
1 |
|
Tips:获取shellcode的脚本。
1 |
|
awd
这道题比赛时应该有挺多师傅写出来了。一开始我只顾着逆结构体去了,也没有修漏洞,结果我们pwn靶机被打了,然后笔者直接上了沙盒才避免进一步掉分。最后只发现了一个uaf漏洞,太紧张了也没有利用起来。最那啥的是,当时竟然没有看到格式化字符串漏洞,还是太菜了。
检查保护。
保护全开。
笔者逆出来的结构体大致如下:
1 |
|
rm函数存在uaf漏洞
删除content时,没有清空。同时,删除管理头时,仅仅删除了前后指针。
echo函数存在格式化字符串漏洞。
这两个漏洞都算是比较好利用的,既可以结合使用,也可以单独利用。
最终wp(UAF)如下:
1 |
|