64位程序,除了 relro 其他的保护全开了,那么可能可以写 got 再看看程序有什么功能
程序提供了 6个功能,测试如下
那这就很有可能是道堆题了
手动fuzz一下, 漏洞发现如下
总之get一个box 然后 delete 一下看看效果先 操作如下
off by one 的验证就构造一个 0x18 0x28 什么大小的size 然后输入一堆字符串就可以看到了.操作如下
结果如下
overwrite 之后
okay ,基本上就是这样了,接下来就看一下代码的逻辑,看看可以怎么样对漏洞进行利用
首先定一下目标
main 函数首先 将 seed 的地址 作为srand的种子
guess seed 很简单,输入的 随机数对了,就把seed的地址给你,因为开启了aslr,加上程序是 x64 的,很难利用伪随机
get box 会对输入的 size进行验证, 传入的size需要 0x8=<little < small < normal < big < huge <0x1000 并且创建完之后还会做一个 mark, 也就是说,一个box 只能 get 一次
那么每次malloc 返回的chunk的 size 不能相同 fastbin attack 有点难搞,再看看其他的
destory box 实现定义好了,只有 small 和normal box 可以进行 destory, 其他的只能 get,不能 destory
exit函数 要求输入一个 字符串, 然后 malloc strcpy一下,没有溢出
okay 程序分析基本上就是到了这里了,接下来就是怎么样进行利用的问题 具体操作如下
okay 现在地址什么都是有的了,问题就是要怎么控制程序执行流了,这里使用的是 unsorted bin attack 的办法
因为 上面 leak 的时候已经得到了一个 unsorted bin,所以直接用这个 来搞事情,因为 libc版本是 2.23, 所以按照常规 unsorted bin attack 的思路构造 exp 即可getshell, 基本操作如下
因为这里 exp 是写了一个 模板来进行生成的,平时方便查看, 所以会有一些冗余信息,自动忽略啦
❯ checksec club
[*] '/home/aqs/2-contest/pediy2017/4-club-pwn/club'
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: Canary found
NX: NX enabled
PIE: PIE enabled
Welcome to my club!
====================
You have 6 operation :
1) get a box
2) destory a box
3) leave me a message in box
4) show message in box
5) guess a random number
6) exit
getbox(2)# smallbox
leave_msg(2,'aaaabbbb')
destory_box(2)
show_msg(2) # 可以正常显示 aaaabbbb,说明有 uaf
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)