跳到正文
LOG 25.064 STA 7711

平台上的mahoshojyo(魔法少女)

很好的题,使我入门堆

发布
阅读
02 分钟
语言
ZH
分类
ctf_pwn

mahoshojyo

预分析

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

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

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 漏洞。

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