小动物很可爱的说?
放在ida中分析,发现已经有了获取flag的函数,不需要自己找system了,接下来就是如何控制程序的执行流程。
首先对程序功能作基本的分析:
新建动物时malloc一个结构体存放动物的信息,如果是熊,结构体的0x0-0x8存放0xdeadbeef,0x8-0x14存放动物的名字,0x14-0x20存放动物的type;
如果是其他动物,从0开始存放动物的名字。维护了一个全局指针pointers,作为一个目录表记录所有的结构体地址。
使用uaf的姿势,关键在于delete功能:
void deleteAnimal()
{
int v0; // [sp+Ch] [bp-4h]@1
puts("Choose your friends wisely..");
puts("Which element do you want to delete?");
fflush(stdout);
__isoc99_scanf("%d", &v0);
getchar();
if ( v0 > 0 && v0 <= 4 )
free(*(&pointers + v0));
}
首先第一个结构体无法被delete,所以大致流程为:makebear--->makebear---->makebear--->delete(1) 下次malloc时就会优先分配到第二个结构体的位置,此时maketiger(除熊外随便动物,不能是熊,否则会更新bearoffset),输入动物的名字时就会从第二个结构体的起始处开始存放,从而覆盖掉第三个结构体起始处的0xdeadbeef: