平台上的mahoshojyo(魔法少女)

mahoshojyo

预分析

checksec 检查一下保护,发现 got 表可写,除此之外保护全开。

查看libc版本,是2.23版本。由于本程序是 C++ 编写,所以还需要一些其他的库(这里花了我好长时间):

1
2
3
4
5
6
7
8
ldd mahoshijio

linux-vdso.so.1 (0x00007fff0e5ac000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f3fe5f9a000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f3fe64de000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3fe6527000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3fe5da4000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f3fe5cbe000)

这里选择直接上国内源下载 ubuntu16.04 对应的库(或者直接docker)

此外,这个版本的libc没有tcache机制。

逆向程序

发现是一个常规的笔记程序,没有越界读写,但是有 UAF 漏洞。

1
2
3
4
5
6
7
8
void __fastcall clear_cards(char **list, unsigned int card_num)
{
if ( card_num <= 79 )
{
if ( list[(int)card_num + 1] )
free(list[(int)card_num + 1]); //uaf
}
}

此外,我们发现每一次 malloc 的大小都是固定 0x60 ,无法设定大小。

思路

可以先用uaf漏洞泄露堆上的地址,再进行堆块重叠,控制某个chunk头,改变其size大小,使之free后进入unsorted bin,从而泄露libc地址 (main_arena+88==__malloc_hook+0x10),之后得知再利用fastbin attack控制 __malloc_hook (fake chunk的地址为 __malloc_hook-0x23 ,以符合fastbin的大小),将onegadget写入hook位置,再用 malloc 触发即可 getshell


平台上的mahoshojyo(魔法少女)
https://dx3906999.github.io/2025/03/05/ucas-ctf-pwn-mahoshojyo/
作者
dx3qOb
发布于
2025年3月5日
许可协议