ctfshow:堆利用前置基础pwn135、pwn136
本文最后更新于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明天继续学习

继续学习ing......
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇