首先查看一下附件的保护情况
可以看到,got表是可修改的状态
接着看主函数的逻辑
非常典型的菜单题,接着分析每一个函数的作用
c
unsigned __int64 create_heap()
{
int i; // [rsp+4h] [rbp-1Ch]
size_t size; // [rsp+8h] [rbp-18h]
char buf[8]; // [rsp+10h] [rbp-10h] BYREF
unsigned __int64 v4; // [rsp+18h] [rbp-8h]
v4 = __readfsqword(0x28u);
for ( i = 0; i <= 9; ++i )
{
if ( !*(&heaparray + i) )
{
printf("Size of Heap : ");
read(0, buf, 8uLL);
size = atoi(buf);
*(&heaparray + i) = malloc(size);
if ( !*(&heaparray + i) )
{
puts("Allocate Error");
exit(2);
}
printf("Content of heap:");
read_input(*(&heaparray + i), size); // 往堆中读入数据
puts("SuccessFul");
return __readfsqword(0x28u) ^ v4;
}
}
return __readfsqword(0x28u) ^ v4;
}
这个是creat函数,其实就是创建堆的操作,然后将堆的地址存入heaparray的数组之中
c
unsigned __int64 edit_heap()
{
int v1; // [rsp+4h] [rbp-1Ch]
size_t v2; // [rsp+8h] [rbp-18h]
char buf[8]; // [rsp+10h] [rbp-10h] BYREF
unsigned __int64 v4; // [rsp+18h] [rbp-8h]
v4 = __readfsqword(0x28u);
printf("Index :");
read(0, buf, 4uLL);
v1 = atoi(buf);
if ( (unsigned int)v1 >= 0xA )
{
puts("Out of bound!");
_exit(0);
}
if ( *(&heaparray + v1) )
{
printf("Size of Heap : ");
read(0, buf, 8uLL);
v2 = atoi(buf);
printf("Content of heap : ");
read_input(*(&heaparray + v1), v2);
puts("Done !");
}
else
{
puts("No such heap !");
}
return __readfsqword(0x28u) ^ v4;
}
这个edit函数,可以根据索引,修改堆中的内容,我们可以发现这个修改的size是可以自己重新输入,所以存在堆溢出

文章详细分析了一个C程序中的heap操作,涉及create_heap、edit_heap和delete_heap函数,展示了堆溢出漏洞以及利用fastbins修改chunk内容和执行系统调用的过程,以实现getshell攻击。



最低0.47元/天 解锁文章
980

被折叠的 条评论
为什么被折叠?



