本文最后更新于285 天前,其中的信息可能已经过时,如有错误请发送邮件到506742773@qq.com
1.pwn135分析
checksec:

压力感
看一看ctfshow函数的代码,输入4就可以拿flag

v1=1时
printf("Enter the size to allocate using malloc: ");
__isoc99_scanf("%lu", &size);
ptr = malloc(size);
}
if ( ptr )
printf("Memory allocated at address: %p\n", ptr);
else
puts("Memory allocation failed.");
相当于申请堆

原型:
void *malloc(size_t size);
e参数表示要分配的内存块的大小(以字节为单位)。malloc函数返回一个指向已分配内存的指针,如果分配失败,则返回NULL。
calloc() 接受两个参数:要分配的元素个数和每个元素的大小。
v1=2时
printf("Enter the size to allocate using calloc: ");
__isoc99_scanf("%lu", &size);
ptr = calloc(1uLL, size);
calloc() 函数用于在 C 语言中动态分配内存,并将分配的内存初始化为零。与 malloc() 不同,calloc() 会将分配的内存块初始化为零。
v1=3时
printf("Enter the size to allocate using realloc: ");
__isoc99_scanf("%lu", &size);
ptr = realloc(ptr, size);
void *realloc(void *ptr, size_t size);
ptr:指向需要重新分配的内存块的指针,该内存块应该是之前通过malloc、calloc或realloc分配的。如果ptr是空指针,则realloc会像malloc一样分配新的内存块。
size:内存块的新大小,单位是字节。如果size为0,并且ptr不是空指针,那么ptr所指向的内存块会被释放,并返回一个空指针。
如果新的大小大于原来的内存块,会移动到新的位置
如果小于原来的内存块,原来多的部分会被释放
2.pwn135flag
nc以后输4就是了,代码里很清楚

3.pwn136分析
看看ctfshow函数
__int64 ctfshow()
{
int v1; // [sp+Ch] [bp-24h]@7
void *ptr; // [sp+10h] [bp-20h]@1
void *v3; // [sp+18h] [bp-18h]@1
void *v4; // [sp+20h] [bp-10h]@1
__int64 v5; // [sp+28h] [bp-8h]@1
v5 = *MK_FP(__FS__, 40LL);
v3 = 0LL;
v4 = 0LL;
ptr = malloc(4uLL);
if ( ptr )
{
v3 = calloc(1uLL, 4uLL);//分配了一个堆块
if ( v3 )
{
v4 = realloc(0LL, 4uLL);
if ( v4 )
{
__isoc99_scanf("%d", &v1);
if ( v1 == 2 )
{
free(v3);
puts("ptr_calloc freed.");
return *MK_FP(__FS__, 40LL) ^ v5;
}
if ( v1 > 2 )
{
if ( v1 == 3 )
{
free(v4);
puts("ptr_realloc freed.");
return *MK_FP(__FS__, 40LL) ^ v5;
}
if ( v1 == 4 )
{
printf("Here is you want: ");
system("cat /ctfshow_flag");
}
}
else if ( v1 == 1 )
{
free(ptr);
puts("ptr_malloc freed.");
return *MK_FP(__FS__, 40LL) ^ v5;
}
puts("Invalid choice.");
return *MK_FP(__FS__, 40LL) ^ v5;
}
puts("Memory allocation failed for ptr_realloc.");
free(ptr);
free(v3);
}
else
{
puts("Memory allocation failed for ptr_calloc.");
free(ptr);
}
}
else
{
puts("Memory allocation failed for ptr_malloc.");
}
return *MK_FP(__FS__, 40LL) ^ v5;
}
也是一样的
v1=4
cat flag
其他就是分别用pwn135中的三个函数申请了堆然后free掉
比如输入1然后查看heap:

就可以看到有chunk被free了,其他的也是这样看就行。
2.pwn136flag
nc输4:

ok明天继续学习










