天天看点

buuctf pwn babyheap_0ctf_2017

buuctf pwn babyheap_0ctf_2017

第一次遇到 全开

保护全开,一般是有关堆方面的题
__int64 __fastcall main(__int64 a1, char **a2, char **a3)
{
  char *v4; // [rsp+8h] [rbp-8h]

  v4 = sub_B70();
  while ( 1 )
  {
    sub_CF4(a1, a2);
    switch ( sub_138C() )
    {
      case 1LL:
        a1 = (__int64)v4;
        sub_D48(v4);
        break;
      case 2LL:
        a1 = (__int64)v4;
        sub_E7F(v4);
        break;
      case 3LL:
        a1 = (__int64)v4;
        sub_F50(v4);
        break;
      case 4LL:
        a1 = (__int64)v4;
        sub_1051(v4);
        break;
      case 5LL:
        return 0LL;
      default:
        continue;
    }
  }
}
           
char *sub_B70()
{
  int fd; // [rsp+4h] [rbp-3Ch]
  char *addr; // [rsp+8h] [rbp-38h]
  unsigned __int64 v3; // [rsp+10h] [rbp-30h]
  __int64 buf[4]; // [rsp+20h] [rbp-20h] BYREF

  buf[3] = __readfsqword(0x28u);
  setvbuf(stdin, 0LL, 2, 0LL);
  setvbuf(_bss_start, 0LL, 2, 0LL);
  alarm(0x3Cu);
  puts("===== Baby Heap in 2017 =====");
  fd = open("/dev/urandom", 0);
  if ( fd < 0 || read(fd, buf, 0x10uLL) != 16 )
    exit(-1);
  close(fd);
  addr = (char *)((buf[0] % 0x555555543000uLL + 0x10000) & 0xFFFFFFFFFFFFF000LL);
  v3 = (buf[1] % 0xE80uLL) & 0xFFFFFFFFFFFFFFF0LL;
  if ( mmap(addr, 0x1000uLL, 3, 34, -1, 0LL) != addr )
    exit(-1);
  return &addr[v3];
}
           

后面还是补充一下堆的学习 目前还没有接触到