文章目录
思路
0x00.tar解压
下载获得压缩包文件,解压之后放进ubuntu中发现还是一个tar格式压缩包。
tar -xf filename
附:linux下tar命令详解
解压得到一个libc.so.6的库和一个可执行文件
0x01.查看保护
- 32位程序
- 可以进行栈溢出
- 堆栈上的代码不可执行
- 地址随机化未开启
0x02.查看程序并调试
很明显的菜单题,试了一下选项都能用,感觉比上次做的菜单题要难一点。
1. add a commodity #添加商品
2. del a commodity #删除商品
3. list commodities #商品列表
4. Change the price of a commodity #修改商品价格(无权限)
5. Change the description of a commodity #修改商品类型
6. exit #退出
程序的note结构体如下:
typedef struct Node{
char name[16];
int price;
int descrip_size;
char *description;
}
0x03.漏洞分析
这题和一般的UAF有一定的区别,因为free之后的指针也赋值为NULL。
利用点在于一个realloc函数。
realloc函数详解
函数原型
realloc原型是extern void *realloc(void *mem_address, unsigned int newsize);
函数功能
先判断当前的指针是否有足够的连续空间,如果有,扩大mem_address指向的地址,并且将mem_address返回,如果空间不够,先按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域(注意:原来指针是自动释放,不需要使用free),同时返回新分配的内存区域的首地址。即重新分配存储器块的地址。
注意点
如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
0x04.利用思路
- 若当前指针没有足够的连续空间,则会释放原来的mem_address,由于没有把返回地址赋给node0->description,因此存在UAF漏洞。
- 创建nodeX时,先malloc node结构体,再malloc description空间。创建nodeX+1时,如果满足条件,nodeX+1结构体会申请到nodeX->description,此时编辑nodeX的description就是编辑nodeX+1的结构体。我们把nodeX+1的description指向atoi的got表,就可以实现泄露atoi的地址以及修改atoi的got表。
利用过程
exp-1
# -.- coding=UTF-8 -.-
from pwn import *
from LibcSearcher import *
context(log_level="debug",arch="i386",os="linux")
r = remote("111.198.29.45",54105)
elf = ELF("./supermarket")
libc = ELF("./libc.so.6")
atoi_got = elf.got['atoi']
#define add1,del1,list1,edit1
def add1(index,size,content):
r.sendlineafter('your choice>>','1')
r.sendlineafter('name:',str(index))
r.sendlineafter('price:','10'