2020柏鹭杯,只有线上赛。
note
程序分析
程序总体功能是一个经典的菜单题,不过有两种类型的note可以创建和修改。其中创建和修改都没问题。
EditNote1
可以修改chunk_list 中的 chunk的值,并且输出修改后的值。
EditNote2
是先修改 chunk_list 中的chunk 数据中存储的地址,再修改 +8 位后的值。
而在Delete 函数中,则存在漏洞。功能逻辑是先使用随机数生成 一个 idx1和 idx2,删除 chunk_list2[idx2] 的值,将其填充为 chunk_list1[idx1]的值,再将 chunk_list1 从 idx1 处 将数组的值依次往前填充一个。由于 chunk_list1 和 chunk_list2 在内存中地址是连续的,当我们 创建了 0x20 个 chunk1 时,chunk_list1 最后往前填充时,会将 chunk_list2[0] 的值填充到 chunk_list1[19] 处。
而结合上面对Edit 函数的分析,可以发现 EditNote1 可以修改chunk的数据,EditNote2 会先将前8位作为地址并修改其指向的数据。我们结合这两种修改 可以对 chunk_list2[0] 的位置实现任意地址修改。
利用分析
程序开启了常见的所有保护:
- 泄露heap地址
首先用 0x20 个 chunk 填充 chunk_list1,然后再申请两个 chunk_list2,最后free掉,让 chunk_list1[19] = chunk_list2[0]。然后覆盖 chunk_list1[19] 的低地址,再输出,得到 heap 地址。
- 泄露 libc 地址
可以先利用 任意地址写漏洞,将 chunk_list2 的 chunk0 的 size 放大,然后释放 chunk_list2的 chunk0,使其放入 unsortedbin 中,再利用 Editnote1 覆盖低地址,输出后得到 libc 地址。
- getshell
最后利用任意地址写漏洞 将 malloc_hook 的 值修改为 gadget 值,最后getshell。
EXP
1 | from pwn import * |
MineSweeper
程序分析
程序总体功能实现了一个扫雷游戏,按 A 游戏继续,按 B 删除邮悉,会释放堆块 但释放后未重置指针,存在漏洞;按 C 目前看没太多作用。 按 D 可以扫雷和插旗,格式 DXY0
其中 X
表示行数,Y
表示列数, 0
表示扫雷。 DXY1
,其中 1
表示 插旗子。
在程序一开始,按 2
可以 reportbug
,会申请一个 size
的堆块,并修改内容,再释放。
此外,当游戏获胜后,会在 data
的 第 5 个变量 记录 name
。而且 name
这个堆块地址在 删除游戏后并没有被释放。
程序存在一个总体的结构体,我命名为 Mine_data
,大小为 0x40。
1 | struct Mine_data{ |
利用分析
- 修改
name
堆块指针实现 任意地址写
如果我们先 进入了游戏,则会创建 一个堆块 0x50Mine_data
,随后我们选择 B 删除游戏,则该堆块会被释放。然后我们马上选择 reportbug
申请一个 0x50
大小的chunk
,那么就会申请到 Mine_data
的位置,我们将其 前四个变量都覆盖为 0x61
,然后再修改 name_ptr
的指针的后两位地址。随后再随便扫一个雷,由于我们将前面的 win_flag
都已覆盖为非0,所以会直接赢得比赛,然后我们可以向我们修改后的 name_ptr
指向的地址输入数据。
- 利用任意地址写,实现chunk_overlap
我们利用第一步中的 任意地址写,修改一个 mine_map
中一个chunk
的 size
大于 原本的size
,然后在选择 A
重新开始游戏,并在 reportbug
时 申请大堆块,就可以让之前的 释放的fastbin
中的chunk
被合并。我们再申请 chunk
就能够实现堆覆盖,然后我们再利用堆覆盖来泄露地址。
- 泄露地址
在 程序中每次都会输出 扫雷地图,该地图每一行 都是存储在 一个堆块上,我们利用将之前合并的堆块放到 Unsortedbin
中,然后 将 main_arena+88
的地址 放到 地图堆块中,那么后面打印输出时,就可以泄露 libc
地址。
- getshell
获得 libc
地址后,就可以利用任意地址写,将 free_hook
的地址修改为 system
地址,再释放一个 含有 /bin/sh\x00
的堆块就可以 getshell
了。
EXP
1 | from pwn import * |
- 本文作者: A1ex
- 本文链接: http://yoursite.com/2020/09/25/2020柏鹭杯/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!